UNPKG

5.01 MBJavaScriptView Raw
1/* MapLibre GL JS is licensed under the 3-Clause BSD License. Full text of license: https://github.com/maplibre/maplibre-gl-js/blob/v2.1.9/LICENSE.txt */
2(function (global, factory) {
3typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
4typeof define === 'function' && define.amd ? define(factory) :
5(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.maplibregl = factory());
6})(this, (function () { 'use strict';
7
8/* eslint-disable */
9
10var shared, worker, maplibregl;
11// define gets called three times: one for each chunk. we rely on the order
12// they're imported to know which is which
13function define(_, chunk) {
14 if (!shared) {
15 shared = chunk;
16 } else if (!worker) {
17 worker = chunk;
18 } else {
19 var workerBundleString = 'var sharedChunk = {}; (' + shared + ')(sharedChunk); (' + worker + ')(sharedChunk);'
20
21 var sharedChunk = {};
22 shared(sharedChunk);
23 maplibregl = chunk(sharedChunk);
24 if (typeof window !== 'undefined') {
25 maplibregl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' }));
26 }
27 }
28}
29
30
31define(['exports'], (function (exports) { 'use strict';
32
33var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
34
35function getDefaultExportFromCjs (x) {
36 return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
37}
38
39function getDefaultExportFromNamespaceIfPresent (n) {
40 return n && Object.prototype.hasOwnProperty.call(n, 'default') ? n['default'] : n;
41}
42
43function getDefaultExportFromNamespaceIfNotNamed (n) {
44 return n && Object.prototype.hasOwnProperty.call(n, 'default') && Object.keys(n).length === 1 ? n['default'] : n;
45}
46
47function getAugmentedNamespace(n) {
48 if (n.__esModule) return n;
49 var a = Object.defineProperty({}, '__esModule', {value: true});
50 Object.keys(n).forEach(function (k) {
51 var d = Object.getOwnPropertyDescriptor(n, k);
52 Object.defineProperty(a, k, d.get ? d : {
53 enumerable: true,
54 get: function () {
55 return n[k];
56 }
57 });
58 });
59 return a;
60}
61
62function commonjsRequire (path) {
63 throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
64}
65
66var assert$2 = {exports: {}};
67
68/*
69object-assign
70(c) Sindre Sorhus
71@license MIT
72*/
73
74'use strict';
75/* eslint-disable no-unused-vars */
76var getOwnPropertySymbols = Object.getOwnPropertySymbols;
77var hasOwnProperty = Object.prototype.hasOwnProperty;
78var propIsEnumerable = Object.prototype.propertyIsEnumerable;
79
80function toObject(val) {
81 if (val === null || val === undefined) {
82 throw new TypeError('Object.assign cannot be called with null or undefined');
83 }
84
85 return Object(val);
86}
87
88function shouldUseNative() {
89 try {
90 if (!Object.assign) {
91 return false;
92 }
93
94 // Detect buggy property enumeration order in older V8 versions.
95
96 // https://bugs.chromium.org/p/v8/issues/detail?id=4118
97 var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
98 test1[5] = 'de';
99 if (Object.getOwnPropertyNames(test1)[0] === '5') {
100 return false;
101 }
102
103 // https://bugs.chromium.org/p/v8/issues/detail?id=3056
104 var test2 = {};
105 for (var i = 0; i < 10; i++) {
106 test2['_' + String.fromCharCode(i)] = i;
107 }
108 var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
109 return test2[n];
110 });
111 if (order2.join('') !== '0123456789') {
112 return false;
113 }
114
115 // https://bugs.chromium.org/p/v8/issues/detail?id=3056
116 var test3 = {};
117 'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
118 test3[letter] = letter;
119 });
120 if (Object.keys(Object.assign({}, test3)).join('') !==
121 'abcdefghijklmnopqrst') {
122 return false;
123 }
124
125 return true;
126 } catch (err) {
127 // We don't expect any of the above to throw, but better to be safe.
128 return false;
129 }
130}
131
132var objectAssign$1 = shouldUseNative() ? Object.assign : function (target, source) {
133 var from;
134 var to = toObject(target);
135 var symbols;
136
137 for (var s = 1; s < arguments.length; s++) {
138 from = Object(arguments[s]);
139
140 for (var key in from) {
141 if (hasOwnProperty.call(from, key)) {
142 to[key] = from[key];
143 }
144 }
145
146 if (getOwnPropertySymbols) {
147 symbols = getOwnPropertySymbols(from);
148 for (var i = 0; i < symbols.length; i++) {
149 if (propIsEnumerable.call(from, symbols[i])) {
150 to[symbols[i]] = from[symbols[i]];
151 }
152 }
153 }
154 }
155
156 return to;
157};
158
159var util$1 = {};
160
161var isBufferBrowser = function isBuffer(arg) {
162 return arg && typeof arg === 'object'
163 && typeof arg.copy === 'function'
164 && typeof arg.fill === 'function'
165 && typeof arg.readUInt8 === 'function';
166};
167
168var inherits_browser$1 = {exports: {}};
169
170if (typeof Object.create === 'function') {
171 // implementation from standard node.js 'util' module
172 inherits_browser$1.exports = function inherits(ctor, superCtor) {
173 ctor.super_ = superCtor;
174 ctor.prototype = Object.create(superCtor.prototype, {
175 constructor: {
176 value: ctor,
177 enumerable: false,
178 writable: true,
179 configurable: true
180 }
181 });
182 };
183} else {
184 // old school shim for old browsers
185 inherits_browser$1.exports = function inherits(ctor, superCtor) {
186 ctor.super_ = superCtor;
187 var TempCtor = function () {};
188 TempCtor.prototype = superCtor.prototype;
189 ctor.prototype = new TempCtor();
190 ctor.prototype.constructor = ctor;
191 };
192}
193
194var inherits_browser = inherits_browser$1.exports;
195
196(function (exports) {
197// Copyright Joyent, Inc. and other Node contributors.
198//
199// Permission is hereby granted, free of charge, to any person obtaining a
200// copy of this software and associated documentation files (the
201// "Software"), to deal in the Software without restriction, including
202// without limitation the rights to use, copy, modify, merge, publish,
203// distribute, sublicense, and/or sell copies of the Software, and to permit
204// persons to whom the Software is furnished to do so, subject to the
205// following conditions:
206//
207// The above copyright notice and this permission notice shall be included
208// in all copies or substantial portions of the Software.
209//
210// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
211// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
212// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
213// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
214// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
215// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
216// USE OR OTHER DEALINGS IN THE SOFTWARE.
217
218var formatRegExp = /%[sdj%]/g;
219exports.format = function(f) {
220 if (!isString(f)) {
221 var objects = [];
222 for (var i = 0; i < arguments.length; i++) {
223 objects.push(inspect(arguments[i]));
224 }
225 return objects.join(' ');
226 }
227
228 var i = 1;
229 var args = arguments;
230 var len = args.length;
231 var str = String(f).replace(formatRegExp, function(x) {
232 if (x === '%%') return '%';
233 if (i >= len) return x;
234 switch (x) {
235 case '%s': return String(args[i++]);
236 case '%d': return Number(args[i++]);
237 case '%j':
238 try {
239 return JSON.stringify(args[i++]);
240 } catch (_) {
241 return '[Circular]';
242 }
243 default:
244 return x;
245 }
246 });
247 for (var x = args[i]; i < len; x = args[++i]) {
248 if (isNull(x) || !isObject(x)) {
249 str += ' ' + x;
250 } else {
251 str += ' ' + inspect(x);
252 }
253 }
254 return str;
255};
256
257
258// Mark that a method should not be used.
259// Returns a modified function which warns once by default.
260// If --no-deprecation is set, then it is a no-op.
261exports.deprecate = function(fn, msg) {
262 // Allow for deprecating things in the process of starting up.
263 if (isUndefined(global.process)) {
264 return function() {
265 return exports.deprecate(fn, msg).apply(this, arguments);
266 };
267 }
268
269 if (process.noDeprecation === true) {
270 return fn;
271 }
272
273 var warned = false;
274 function deprecated() {
275 if (!warned) {
276 if (process.throwDeprecation) {
277 throw new Error(msg);
278 } else if (process.traceDeprecation) {
279 console.trace(msg);
280 } else {
281 console.error(msg);
282 }
283 warned = true;
284 }
285 return fn.apply(this, arguments);
286 }
287
288 return deprecated;
289};
290
291
292var debugs = {};
293var debugEnviron;
294exports.debuglog = function(set) {
295 if (isUndefined(debugEnviron))
296 debugEnviron = process.env.NODE_DEBUG || '';
297 set = set.toUpperCase();
298 if (!debugs[set]) {
299 if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
300 var pid = process.pid;
301 debugs[set] = function() {
302 var msg = exports.format.apply(exports, arguments);
303 console.error('%s %d: %s', set, pid, msg);
304 };
305 } else {
306 debugs[set] = function() {};
307 }
308 }
309 return debugs[set];
310};
311
312
313/**
314 * Echos the value of a value. Trys to print the value out
315 * in the best way possible given the different types.
316 *
317 * @param {Object} obj The object to print out.
318 * @param {Object} opts Optional options object that alters the output.
319 */
320/* legacy: obj, showHidden, depth, colors*/
321function inspect(obj, opts) {
322 // default options
323 var ctx = {
324 seen: [],
325 stylize: stylizeNoColor
326 };
327 // legacy...
328 if (arguments.length >= 3) ctx.depth = arguments[2];
329 if (arguments.length >= 4) ctx.colors = arguments[3];
330 if (isBoolean(opts)) {
331 // legacy...
332 ctx.showHidden = opts;
333 } else if (opts) {
334 // got an "options" object
335 exports._extend(ctx, opts);
336 }
337 // set default options
338 if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
339 if (isUndefined(ctx.depth)) ctx.depth = 2;
340 if (isUndefined(ctx.colors)) ctx.colors = false;
341 if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
342 if (ctx.colors) ctx.stylize = stylizeWithColor;
343 return formatValue(ctx, obj, ctx.depth);
344}
345exports.inspect = inspect;
346
347
348// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
349inspect.colors = {
350 'bold' : [1, 22],
351 'italic' : [3, 23],
352 'underline' : [4, 24],
353 'inverse' : [7, 27],
354 'white' : [37, 39],
355 'grey' : [90, 39],
356 'black' : [30, 39],
357 'blue' : [34, 39],
358 'cyan' : [36, 39],
359 'green' : [32, 39],
360 'magenta' : [35, 39],
361 'red' : [31, 39],
362 'yellow' : [33, 39]
363};
364
365// Don't use 'blue' not visible on cmd.exe
366inspect.styles = {
367 'special': 'cyan',
368 'number': 'yellow',
369 'boolean': 'yellow',
370 'undefined': 'grey',
371 'null': 'bold',
372 'string': 'green',
373 'date': 'magenta',
374 // "name": intentionally not styling
375 'regexp': 'red'
376};
377
378
379function stylizeWithColor(str, styleType) {
380 var style = inspect.styles[styleType];
381
382 if (style) {
383 return '\u001b[' + inspect.colors[style][0] + 'm' + str +
384 '\u001b[' + inspect.colors[style][1] + 'm';
385 } else {
386 return str;
387 }
388}
389
390
391function stylizeNoColor(str, styleType) {
392 return str;
393}
394
395
396function arrayToHash(array) {
397 var hash = {};
398
399 array.forEach(function(val, idx) {
400 hash[val] = true;
401 });
402
403 return hash;
404}
405
406
407function formatValue(ctx, value, recurseTimes) {
408 // Provide a hook for user-specified inspect functions.
409 // Check that value is an object with an inspect function on it
410 if (ctx.customInspect &&
411 value &&
412 isFunction(value.inspect) &&
413 // Filter out the util module, it's inspect function is special
414 value.inspect !== exports.inspect &&
415 // Also filter out any prototype objects using the circular check.
416 !(value.constructor && value.constructor.prototype === value)) {
417 var ret = value.inspect(recurseTimes, ctx);
418 if (!isString(ret)) {
419 ret = formatValue(ctx, ret, recurseTimes);
420 }
421 return ret;
422 }
423
424 // Primitive types cannot have properties
425 var primitive = formatPrimitive(ctx, value);
426 if (primitive) {
427 return primitive;
428 }
429
430 // Look up the keys of the object.
431 var keys = Object.keys(value);
432 var visibleKeys = arrayToHash(keys);
433
434 if (ctx.showHidden) {
435 keys = Object.getOwnPropertyNames(value);
436 }
437
438 // IE doesn't make error fields non-enumerable
439 // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
440 if (isError(value)
441 && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
442 return formatError(value);
443 }
444
445 // Some type of object without properties can be shortcutted.
446 if (keys.length === 0) {
447 if (isFunction(value)) {
448 var name = value.name ? ': ' + value.name : '';
449 return ctx.stylize('[Function' + name + ']', 'special');
450 }
451 if (isRegExp(value)) {
452 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
453 }
454 if (isDate(value)) {
455 return ctx.stylize(Date.prototype.toString.call(value), 'date');
456 }
457 if (isError(value)) {
458 return formatError(value);
459 }
460 }
461
462 var base = '', array = false, braces = ['{', '}'];
463
464 // Make Array say that they are Array
465 if (isArray(value)) {
466 array = true;
467 braces = ['[', ']'];
468 }
469
470 // Make functions say that they are functions
471 if (isFunction(value)) {
472 var n = value.name ? ': ' + value.name : '';
473 base = ' [Function' + n + ']';
474 }
475
476 // Make RegExps say that they are RegExps
477 if (isRegExp(value)) {
478 base = ' ' + RegExp.prototype.toString.call(value);
479 }
480
481 // Make dates with properties first say the date
482 if (isDate(value)) {
483 base = ' ' + Date.prototype.toUTCString.call(value);
484 }
485
486 // Make error with message first say the error
487 if (isError(value)) {
488 base = ' ' + formatError(value);
489 }
490
491 if (keys.length === 0 && (!array || value.length == 0)) {
492 return braces[0] + base + braces[1];
493 }
494
495 if (recurseTimes < 0) {
496 if (isRegExp(value)) {
497 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
498 } else {
499 return ctx.stylize('[Object]', 'special');
500 }
501 }
502
503 ctx.seen.push(value);
504
505 var output;
506 if (array) {
507 output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
508 } else {
509 output = keys.map(function(key) {
510 return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
511 });
512 }
513
514 ctx.seen.pop();
515
516 return reduceToSingleString(output, base, braces);
517}
518
519
520function formatPrimitive(ctx, value) {
521 if (isUndefined(value))
522 return ctx.stylize('undefined', 'undefined');
523 if (isString(value)) {
524 var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
525 .replace(/'/g, "\\'")
526 .replace(/\\"/g, '"') + '\'';
527 return ctx.stylize(simple, 'string');
528 }
529 if (isNumber(value))
530 return ctx.stylize('' + value, 'number');
531 if (isBoolean(value))
532 return ctx.stylize('' + value, 'boolean');
533 // For some reason typeof null is "object", so special case here.
534 if (isNull(value))
535 return ctx.stylize('null', 'null');
536}
537
538
539function formatError(value) {
540 return '[' + Error.prototype.toString.call(value) + ']';
541}
542
543
544function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
545 var output = [];
546 for (var i = 0, l = value.length; i < l; ++i) {
547 if (hasOwnProperty(value, String(i))) {
548 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
549 String(i), true));
550 } else {
551 output.push('');
552 }
553 }
554 keys.forEach(function(key) {
555 if (!key.match(/^\d+$/)) {
556 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
557 key, true));
558 }
559 });
560 return output;
561}
562
563
564function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
565 var name, str, desc;
566 desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
567 if (desc.get) {
568 if (desc.set) {
569 str = ctx.stylize('[Getter/Setter]', 'special');
570 } else {
571 str = ctx.stylize('[Getter]', 'special');
572 }
573 } else {
574 if (desc.set) {
575 str = ctx.stylize('[Setter]', 'special');
576 }
577 }
578 if (!hasOwnProperty(visibleKeys, key)) {
579 name = '[' + key + ']';
580 }
581 if (!str) {
582 if (ctx.seen.indexOf(desc.value) < 0) {
583 if (isNull(recurseTimes)) {
584 str = formatValue(ctx, desc.value, null);
585 } else {
586 str = formatValue(ctx, desc.value, recurseTimes - 1);
587 }
588 if (str.indexOf('\n') > -1) {
589 if (array) {
590 str = str.split('\n').map(function(line) {
591 return ' ' + line;
592 }).join('\n').substr(2);
593 } else {
594 str = '\n' + str.split('\n').map(function(line) {
595 return ' ' + line;
596 }).join('\n');
597 }
598 }
599 } else {
600 str = ctx.stylize('[Circular]', 'special');
601 }
602 }
603 if (isUndefined(name)) {
604 if (array && key.match(/^\d+$/)) {
605 return str;
606 }
607 name = JSON.stringify('' + key);
608 if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
609 name = name.substr(1, name.length - 2);
610 name = ctx.stylize(name, 'name');
611 } else {
612 name = name.replace(/'/g, "\\'")
613 .replace(/\\"/g, '"')
614 .replace(/(^"|"$)/g, "'");
615 name = ctx.stylize(name, 'string');
616 }
617 }
618
619 return name + ': ' + str;
620}
621
622
623function reduceToSingleString(output, base, braces) {
624 var numLinesEst = 0;
625 var length = output.reduce(function(prev, cur) {
626 numLinesEst++;
627 if (cur.indexOf('\n') >= 0) numLinesEst++;
628 return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
629 }, 0);
630
631 if (length > 60) {
632 return braces[0] +
633 (base === '' ? '' : base + '\n ') +
634 ' ' +
635 output.join(',\n ') +
636 ' ' +
637 braces[1];
638 }
639
640 return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
641}
642
643
644// NOTE: These type checking functions intentionally don't use `instanceof`
645// because it is fragile and can be easily faked with `Object.create()`.
646function isArray(ar) {
647 return Array.isArray(ar);
648}
649exports.isArray = isArray;
650
651function isBoolean(arg) {
652 return typeof arg === 'boolean';
653}
654exports.isBoolean = isBoolean;
655
656function isNull(arg) {
657 return arg === null;
658}
659exports.isNull = isNull;
660
661function isNullOrUndefined(arg) {
662 return arg == null;
663}
664exports.isNullOrUndefined = isNullOrUndefined;
665
666function isNumber(arg) {
667 return typeof arg === 'number';
668}
669exports.isNumber = isNumber;
670
671function isString(arg) {
672 return typeof arg === 'string';
673}
674exports.isString = isString;
675
676function isSymbol(arg) {
677 return typeof arg === 'symbol';
678}
679exports.isSymbol = isSymbol;
680
681function isUndefined(arg) {
682 return arg === void 0;
683}
684exports.isUndefined = isUndefined;
685
686function isRegExp(re) {
687 return isObject(re) && objectToString(re) === '[object RegExp]';
688}
689exports.isRegExp = isRegExp;
690
691function isObject(arg) {
692 return typeof arg === 'object' && arg !== null;
693}
694exports.isObject = isObject;
695
696function isDate(d) {
697 return isObject(d) && objectToString(d) === '[object Date]';
698}
699exports.isDate = isDate;
700
701function isError(e) {
702 return isObject(e) &&
703 (objectToString(e) === '[object Error]' || e instanceof Error);
704}
705exports.isError = isError;
706
707function isFunction(arg) {
708 return typeof arg === 'function';
709}
710exports.isFunction = isFunction;
711
712function isPrimitive(arg) {
713 return arg === null ||
714 typeof arg === 'boolean' ||
715 typeof arg === 'number' ||
716 typeof arg === 'string' ||
717 typeof arg === 'symbol' || // ES6 symbol
718 typeof arg === 'undefined';
719}
720exports.isPrimitive = isPrimitive;
721
722exports.isBuffer = isBufferBrowser;
723
724function objectToString(o) {
725 return Object.prototype.toString.call(o);
726}
727
728
729function pad(n) {
730 return n < 10 ? '0' + n.toString(10) : n.toString(10);
731}
732
733
734var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
735 'Oct', 'Nov', 'Dec'];
736
737// 26 Feb 16:19:34
738function timestamp() {
739 var d = new Date();
740 var time = [pad(d.getHours()),
741 pad(d.getMinutes()),
742 pad(d.getSeconds())].join(':');
743 return [d.getDate(), months[d.getMonth()], time].join(' ');
744}
745
746
747// log is just a thin wrapper to console.log that prepends a timestamp
748exports.log = function() {
749 console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
750};
751
752
753/**
754 * Inherit the prototype methods from one constructor into another.
755 *
756 * The Function.prototype.inherits from lang.js rewritten as a standalone
757 * function (not on Function.prototype). NOTE: If this file is to be loaded
758 * during bootstrapping this function needs to be rewritten using some native
759 * functions as prototype setup using normal JavaScript does not work as
760 * expected during bootstrapping (see mirror.js in r114903).
761 *
762 * @param {function} ctor Constructor function which needs to inherit the
763 * prototype.
764 * @param {function} superCtor Constructor function to inherit prototype from.
765 */
766exports.inherits = inherits_browser$1.exports;
767
768exports._extend = function(origin, add) {
769 // Don't do anything if add isn't an object
770 if (!add || !isObject(add)) return origin;
771
772 var keys = Object.keys(add);
773 var i = keys.length;
774 while (i--) {
775 origin[keys[i]] = add[keys[i]];
776 }
777 return origin;
778};
779
780function hasOwnProperty(obj, prop) {
781 return Object.prototype.hasOwnProperty.call(obj, prop);
782}
783}(util$1));
784
785'use strict';
786
787var objectAssign = objectAssign$1;
788
789// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js
790// original notice:
791
792/*!
793 * The buffer module from node.js, for the browser.
794 *
795 * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
796 * @license MIT
797 */
798function compare$1(a, b) {
799 if (a === b) {
800 return 0;
801 }
802
803 var x = a.length;
804 var y = b.length;
805
806 for (var i = 0, len = Math.min(x, y); i < len; ++i) {
807 if (a[i] !== b[i]) {
808 x = a[i];
809 y = b[i];
810 break;
811 }
812 }
813
814 if (x < y) {
815 return -1;
816 }
817 if (y < x) {
818 return 1;
819 }
820 return 0;
821}
822function isBuffer(b) {
823 if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {
824 return global.Buffer.isBuffer(b);
825 }
826 return !!(b != null && b._isBuffer);
827}
828
829// based on node assert, original notice:
830// NB: The URL to the CommonJS spec is kept just for tradition.
831// node-assert has evolved a lot since then, both in API and behavior.
832
833// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
834//
835// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
836//
837// Originally from narwhal.js (http://narwhaljs.org)
838// Copyright (c) 2009 Thomas Robinson <280north.com>
839//
840// Permission is hereby granted, free of charge, to any person obtaining a copy
841// of this software and associated documentation files (the 'Software'), to
842// deal in the Software without restriction, including without limitation the
843// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
844// sell copies of the Software, and to permit persons to whom the Software is
845// furnished to do so, subject to the following conditions:
846//
847// The above copyright notice and this permission notice shall be included in
848// all copies or substantial portions of the Software.
849//
850// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
851// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
852// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
853// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
854// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
855// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
856
857var util = util$1;
858var hasOwn = Object.prototype.hasOwnProperty;
859var pSlice = Array.prototype.slice;
860var functionsHaveNames = (function () {
861 return function foo() {}.name === 'foo';
862}());
863function pToString (obj) {
864 return Object.prototype.toString.call(obj);
865}
866function isView(arrbuf) {
867 if (isBuffer(arrbuf)) {
868 return false;
869 }
870 if (typeof global.ArrayBuffer !== 'function') {
871 return false;
872 }
873 if (typeof ArrayBuffer.isView === 'function') {
874 return ArrayBuffer.isView(arrbuf);
875 }
876 if (!arrbuf) {
877 return false;
878 }
879 if (arrbuf instanceof DataView) {
880 return true;
881 }
882 if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {
883 return true;
884 }
885 return false;
886}
887// 1. The assert module provides functions that throw
888// AssertionError's when particular conditions are not met. The
889// assert module must conform to the following interface.
890
891var assert = assert$2.exports = ok;
892
893// 2. The AssertionError is defined in assert.
894// new assert.AssertionError({ message: message,
895// actual: actual,
896// expected: expected })
897
898var regex = /\s*function\s+([^\(\s]*)\s*/;
899// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js
900function getName(func) {
901 if (!util.isFunction(func)) {
902 return;
903 }
904 if (functionsHaveNames) {
905 return func.name;
906 }
907 var str = func.toString();
908 var match = str.match(regex);
909 return match && match[1];
910}
911assert.AssertionError = function AssertionError(options) {
912 this.name = 'AssertionError';
913 this.actual = options.actual;
914 this.expected = options.expected;
915 this.operator = options.operator;
916 if (options.message) {
917 this.message = options.message;
918 this.generatedMessage = false;
919 } else {
920 this.message = getMessage(this);
921 this.generatedMessage = true;
922 }
923 var stackStartFunction = options.stackStartFunction || fail;
924 if (Error.captureStackTrace) {
925 Error.captureStackTrace(this, stackStartFunction);
926 } else {
927 // non v8 browsers so we can have a stacktrace
928 var err = new Error();
929 if (err.stack) {
930 var out = err.stack;
931
932 // try to strip useless frames
933 var fn_name = getName(stackStartFunction);
934 var idx = out.indexOf('\n' + fn_name);
935 if (idx >= 0) {
936 // once we have located the function frame
937 // we need to strip out everything before it (and its line)
938 var next_line = out.indexOf('\n', idx + 1);
939 out = out.substring(next_line + 1);
940 }
941
942 this.stack = out;
943 }
944 }
945};
946
947// assert.AssertionError instanceof Error
948util.inherits(assert.AssertionError, Error);
949
950function truncate(s, n) {
951 if (typeof s === 'string') {
952 return s.length < n ? s : s.slice(0, n);
953 } else {
954 return s;
955 }
956}
957function inspect(something) {
958 if (functionsHaveNames || !util.isFunction(something)) {
959 return util.inspect(something);
960 }
961 var rawname = getName(something);
962 var name = rawname ? ': ' + rawname : '';
963 return '[Function' + name + ']';
964}
965function getMessage(self) {
966 return truncate(inspect(self.actual), 128) + ' ' +
967 self.operator + ' ' +
968 truncate(inspect(self.expected), 128);
969}
970
971// At present only the three keys mentioned above are used and
972// understood by the spec. Implementations or sub modules can pass
973// other keys to the AssertionError's constructor - they will be
974// ignored.
975
976// 3. All of the following functions must throw an AssertionError
977// when a corresponding condition is not met, with a message that
978// may be undefined if not provided. All assertion methods provide
979// both the actual and expected values to the assertion error for
980// display purposes.
981
982function fail(actual, expected, message, operator, stackStartFunction) {
983 throw new assert.AssertionError({
984 message: message,
985 actual: actual,
986 expected: expected,
987 operator: operator,
988 stackStartFunction: stackStartFunction
989 });
990}
991
992// EXTENSION! allows for well behaved errors defined elsewhere.
993assert.fail = fail;
994
995// 4. Pure assertion tests whether a value is truthy, as determined
996// by !!guard.
997// assert.ok(guard, message_opt);
998// This statement is equivalent to assert.equal(true, !!guard,
999// message_opt);. To test strictly for the value true, use
1000// assert.strictEqual(true, guard, message_opt);.
1001
1002function ok(value, message) {
1003 if (!value) fail(value, true, message, '==', assert.ok);
1004}
1005assert.ok = ok;
1006
1007// 5. The equality assertion tests shallow, coercive equality with
1008// ==.
1009// assert.equal(actual, expected, message_opt);
1010
1011assert.equal = function equal(actual, expected, message) {
1012 if (actual != expected) fail(actual, expected, message, '==', assert.equal);
1013};
1014
1015// 6. The non-equality assertion tests for whether two objects are not equal
1016// with != assert.notEqual(actual, expected, message_opt);
1017
1018assert.notEqual = function notEqual(actual, expected, message) {
1019 if (actual == expected) {
1020 fail(actual, expected, message, '!=', assert.notEqual);
1021 }
1022};
1023
1024// 7. The equivalence assertion tests a deep equality relation.
1025// assert.deepEqual(actual, expected, message_opt);
1026
1027assert.deepEqual = function deepEqual(actual, expected, message) {
1028 if (!_deepEqual(actual, expected, false)) {
1029 fail(actual, expected, message, 'deepEqual', assert.deepEqual);
1030 }
1031};
1032
1033assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
1034 if (!_deepEqual(actual, expected, true)) {
1035 fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);
1036 }
1037};
1038
1039function _deepEqual(actual, expected, strict, memos) {
1040 // 7.1. All identical values are equivalent, as determined by ===.
1041 if (actual === expected) {
1042 return true;
1043 } else if (isBuffer(actual) && isBuffer(expected)) {
1044 return compare$1(actual, expected) === 0;
1045
1046 // 7.2. If the expected value is a Date object, the actual value is
1047 // equivalent if it is also a Date object that refers to the same time.
1048 } else if (util.isDate(actual) && util.isDate(expected)) {
1049 return actual.getTime() === expected.getTime();
1050
1051 // 7.3 If the expected value is a RegExp object, the actual value is
1052 // equivalent if it is also a RegExp object with the same source and
1053 // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
1054 } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
1055 return actual.source === expected.source &&
1056 actual.global === expected.global &&
1057 actual.multiline === expected.multiline &&
1058 actual.lastIndex === expected.lastIndex &&
1059 actual.ignoreCase === expected.ignoreCase;
1060
1061 // 7.4. Other pairs that do not both pass typeof value == 'object',
1062 // equivalence is determined by ==.
1063 } else if ((actual === null || typeof actual !== 'object') &&
1064 (expected === null || typeof expected !== 'object')) {
1065 return strict ? actual === expected : actual == expected;
1066
1067 // If both values are instances of typed arrays, wrap their underlying
1068 // ArrayBuffers in a Buffer each to increase performance
1069 // This optimization requires the arrays to have the same type as checked by
1070 // Object.prototype.toString (aka pToString). Never perform binary
1071 // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their
1072 // bit patterns are not identical.
1073 } else if (isView(actual) && isView(expected) &&
1074 pToString(actual) === pToString(expected) &&
1075 !(actual instanceof Float32Array ||
1076 actual instanceof Float64Array)) {
1077 return compare$1(new Uint8Array(actual.buffer),
1078 new Uint8Array(expected.buffer)) === 0;
1079
1080 // 7.5 For all other Object pairs, including Array objects, equivalence is
1081 // determined by having the same number of owned properties (as verified
1082 // with Object.prototype.hasOwnProperty.call), the same set of keys
1083 // (although not necessarily the same order), equivalent values for every
1084 // corresponding key, and an identical 'prototype' property. Note: this
1085 // accounts for both named and indexed properties on Arrays.
1086 } else if (isBuffer(actual) !== isBuffer(expected)) {
1087 return false;
1088 } else {
1089 memos = memos || {actual: [], expected: []};
1090
1091 var actualIndex = memos.actual.indexOf(actual);
1092 if (actualIndex !== -1) {
1093 if (actualIndex === memos.expected.indexOf(expected)) {
1094 return true;
1095 }
1096 }
1097
1098 memos.actual.push(actual);
1099 memos.expected.push(expected);
1100
1101 return objEquiv(actual, expected, strict, memos);
1102 }
1103}
1104
1105function isArguments(object) {
1106 return Object.prototype.toString.call(object) == '[object Arguments]';
1107}
1108
1109function objEquiv(a, b, strict, actualVisitedObjects) {
1110 if (a === null || a === undefined || b === null || b === undefined)
1111 return false;
1112 // if one is a primitive, the other must be same
1113 if (util.isPrimitive(a) || util.isPrimitive(b))
1114 return a === b;
1115 if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
1116 return false;
1117 var aIsArgs = isArguments(a);
1118 var bIsArgs = isArguments(b);
1119 if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
1120 return false;
1121 if (aIsArgs) {
1122 a = pSlice.call(a);
1123 b = pSlice.call(b);
1124 return _deepEqual(a, b, strict);
1125 }
1126 var ka = objectKeys(a);
1127 var kb = objectKeys(b);
1128 var key, i;
1129 // having the same number of owned properties (keys incorporates
1130 // hasOwnProperty)
1131 if (ka.length !== kb.length)
1132 return false;
1133 //the same set of keys (although not necessarily the same order),
1134 ka.sort();
1135 kb.sort();
1136 //~~~cheap key test
1137 for (i = ka.length - 1; i >= 0; i--) {
1138 if (ka[i] !== kb[i])
1139 return false;
1140 }
1141 //equivalent values for every corresponding key, and
1142 //~~~possibly expensive deep test
1143 for (i = ka.length - 1; i >= 0; i--) {
1144 key = ka[i];
1145 if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))
1146 return false;
1147 }
1148 return true;
1149}
1150
1151// 8. The non-equivalence assertion tests for any deep inequality.
1152// assert.notDeepEqual(actual, expected, message_opt);
1153
1154assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
1155 if (_deepEqual(actual, expected, false)) {
1156 fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
1157 }
1158};
1159
1160assert.notDeepStrictEqual = notDeepStrictEqual;
1161function notDeepStrictEqual(actual, expected, message) {
1162 if (_deepEqual(actual, expected, true)) {
1163 fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);
1164 }
1165}
1166
1167
1168// 9. The strict equality assertion tests strict equality, as determined by ===.
1169// assert.strictEqual(actual, expected, message_opt);
1170
1171assert.strictEqual = function strictEqual(actual, expected, message) {
1172 if (actual !== expected) {
1173 fail(actual, expected, message, '===', assert.strictEqual);
1174 }
1175};
1176
1177// 10. The strict non-equality assertion tests for strict inequality, as
1178// determined by !==. assert.notStrictEqual(actual, expected, message_opt);
1179
1180assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
1181 if (actual === expected) {
1182 fail(actual, expected, message, '!==', assert.notStrictEqual);
1183 }
1184};
1185
1186function expectedException(actual, expected) {
1187 if (!actual || !expected) {
1188 return false;
1189 }
1190
1191 if (Object.prototype.toString.call(expected) == '[object RegExp]') {
1192 return expected.test(actual);
1193 }
1194
1195 try {
1196 if (actual instanceof expected) {
1197 return true;
1198 }
1199 } catch (e) {
1200 // Ignore. The instanceof check doesn't work for arrow functions.
1201 }
1202
1203 if (Error.isPrototypeOf(expected)) {
1204 return false;
1205 }
1206
1207 return expected.call({}, actual) === true;
1208}
1209
1210function _tryBlock(block) {
1211 var error;
1212 try {
1213 block();
1214 } catch (e) {
1215 error = e;
1216 }
1217 return error;
1218}
1219
1220function _throws(shouldThrow, block, expected, message) {
1221 var actual;
1222
1223 if (typeof block !== 'function') {
1224 throw new TypeError('"block" argument must be a function');
1225 }
1226
1227 if (typeof expected === 'string') {
1228 message = expected;
1229 expected = null;
1230 }
1231
1232 actual = _tryBlock(block);
1233
1234 message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
1235 (message ? ' ' + message : '.');
1236
1237 if (shouldThrow && !actual) {
1238 fail(actual, expected, 'Missing expected exception' + message);
1239 }
1240
1241 var userProvidedMessage = typeof message === 'string';
1242 var isUnwantedException = !shouldThrow && util.isError(actual);
1243 var isUnexpectedException = !shouldThrow && actual && !expected;
1244
1245 if ((isUnwantedException &&
1246 userProvidedMessage &&
1247 expectedException(actual, expected)) ||
1248 isUnexpectedException) {
1249 fail(actual, expected, 'Got unwanted exception' + message);
1250 }
1251
1252 if ((shouldThrow && actual && expected &&
1253 !expectedException(actual, expected)) || (!shouldThrow && actual)) {
1254 throw actual;
1255 }
1256}
1257
1258// 11. Expected to throw an error:
1259// assert.throws(block, Error_opt, message_opt);
1260
1261assert.throws = function(block, /*optional*/error, /*optional*/message) {
1262 _throws(true, block, error, message);
1263};
1264
1265// EXTENSION! This is annoying to write outside this module.
1266assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {
1267 _throws(false, block, error, message);
1268};
1269
1270assert.ifError = function(err) { if (err) throw err; };
1271
1272// Expose a strict only variant of assert
1273function strict(value, message) {
1274 if (!value) fail(value, true, message, '==', strict);
1275}
1276assert.strict = objectAssign(strict, assert, {
1277 equal: assert.strictEqual,
1278 deepEqual: assert.deepStrictEqual,
1279 notEqual: assert.notStrictEqual,
1280 notDeepEqual: assert.notDeepStrictEqual
1281});
1282assert.strict.strict = assert.strict;
1283
1284var objectKeys = Object.keys || function (obj) {
1285 var keys = [];
1286 for (var key in obj) {
1287 if (hasOwn.call(obj, key)) keys.push(key);
1288 }
1289 return keys;
1290};
1291
1292var assert$1 = assert$2.exports;
1293
1294'use strict';
1295
1296var unitbezier = UnitBezier;
1297
1298function UnitBezier(p1x, p1y, p2x, p2y) {
1299 // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
1300 this.cx = 3.0 * p1x;
1301 this.bx = 3.0 * (p2x - p1x) - this.cx;
1302 this.ax = 1.0 - this.cx - this.bx;
1303
1304 this.cy = 3.0 * p1y;
1305 this.by = 3.0 * (p2y - p1y) - this.cy;
1306 this.ay = 1.0 - this.cy - this.by;
1307
1308 this.p1x = p1x;
1309 this.p1y = p1y;
1310 this.p2x = p2x;
1311 this.p2y = p2y;
1312}
1313
1314UnitBezier.prototype = {
1315 sampleCurveX: function (t) {
1316 // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.
1317 return ((this.ax * t + this.bx) * t + this.cx) * t;
1318 },
1319
1320 sampleCurveY: function (t) {
1321 return ((this.ay * t + this.by) * t + this.cy) * t;
1322 },
1323
1324 sampleCurveDerivativeX: function (t) {
1325 return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;
1326 },
1327
1328 solveCurveX: function (x, epsilon) {
1329 if (epsilon === undefined) epsilon = 1e-6;
1330
1331 if (x < 0.0) return 0.0;
1332 if (x > 1.0) return 1.0;
1333
1334 var t = x;
1335
1336 // First try a few iterations of Newton's method - normally very fast.
1337 for (var i = 0; i < 8; i++) {
1338 var x2 = this.sampleCurveX(t) - x;
1339 if (Math.abs(x2) < epsilon) return t;
1340
1341 var d2 = this.sampleCurveDerivativeX(t);
1342 if (Math.abs(d2) < 1e-6) break;
1343
1344 t = t - x2 / d2;
1345 }
1346
1347 // Fall back to the bisection method for reliability.
1348 var t0 = 0.0;
1349 var t1 = 1.0;
1350 t = x;
1351
1352 for (i = 0; i < 20; i++) {
1353 x2 = this.sampleCurveX(t);
1354 if (Math.abs(x2 - x) < epsilon) break;
1355
1356 if (x > x2) {
1357 t0 = t;
1358 } else {
1359 t1 = t;
1360 }
1361
1362 t = (t1 - t0) * 0.5 + t0;
1363 }
1364
1365 return t;
1366 },
1367
1368 solve: function (x, epsilon) {
1369 return this.sampleCurveY(this.solveCurveX(x, epsilon));
1370 }
1371};
1372
1373/**
1374 * Deeply compares two object literals.
1375 *
1376 * @private
1377 */
1378function deepEqual(a, b) {
1379 if (Array.isArray(a)) {
1380 if (!Array.isArray(b) || a.length !== b.length)
1381 return false;
1382 for (let i = 0; i < a.length; i++) {
1383 if (!deepEqual(a[i], b[i]))
1384 return false;
1385 }
1386 return true;
1387 }
1388 if (typeof a === 'object' && a !== null && b !== null) {
1389 if (!(typeof b === 'object'))
1390 return false;
1391 const keys = Object.keys(a);
1392 if (keys.length !== Object.keys(b).length)
1393 return false;
1394 for (const key in a) {
1395 if (!deepEqual(a[key], b[key]))
1396 return false;
1397 }
1398 return true;
1399 }
1400 return a === b;
1401}
1402
1403/**
1404 * @module util
1405 * @private
1406 */
1407/**
1408 * Given a value `t` that varies between 0 and 1, return
1409 * an interpolation function that eases between 0 and 1 in a pleasing
1410 * cubic in-out fashion.
1411 *
1412 * @private
1413 */
1414function easeCubicInOut(t) {
1415 if (t <= 0)
1416 return 0;
1417 if (t >= 1)
1418 return 1;
1419 const t2 = t * t, t3 = t2 * t;
1420 return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);
1421}
1422/**
1423 * Given given (x, y), (x1, y1) control points for a bezier curve,
1424 * return a function that interpolates along that curve.
1425 *
1426 * @param p1x control point 1 x coordinate
1427 * @param p1y control point 1 y coordinate
1428 * @param p2x control point 2 x coordinate
1429 * @param p2y control point 2 y coordinate
1430 * @private
1431 */
1432function bezier$1(p1x, p1y, p2x, p2y) {
1433 const bezier = new unitbezier(p1x, p1y, p2x, p2y);
1434 return function (t) {
1435 return bezier.solve(t);
1436 };
1437}
1438/**
1439 * A default bezier-curve powered easing function with
1440 * control points (0.25, 0.1) and (0.25, 1)
1441 *
1442 * @private
1443 */
1444const ease = bezier$1(0.25, 0.1, 0.25, 1);
1445/**
1446 * constrain n to the given range via min + max
1447 *
1448 * @param n value
1449 * @param min the minimum value to be returned
1450 * @param max the maximum value to be returned
1451 * @returns the clamped value
1452 * @private
1453 */
1454function clamp(n, min, max) {
1455 return Math.min(max, Math.max(min, n));
1456}
1457/**
1458 * constrain n to the given range, excluding the minimum, via modular arithmetic
1459 *
1460 * @param n value
1461 * @param min the minimum value to be returned, exclusive
1462 * @param max the maximum value to be returned, inclusive
1463 * @returns constrained number
1464 * @private
1465 */
1466function wrap(n, min, max) {
1467 const d = max - min;
1468 const w = ((n - min) % d + d) % d + min;
1469 return (w === min) ? max : w;
1470}
1471/*
1472 * Call an asynchronous function on an array of arguments,
1473 * calling `callback` with the completed results of all calls.
1474 *
1475 * @param array input to each call of the async function.
1476 * @param fn an async function with signature (data, callback)
1477 * @param callback a callback run after all async work is done.
1478 * called with an array, containing the results of each async call.
1479 * @private
1480 */
1481function asyncAll(array, fn, callback) {
1482 if (!array.length) {
1483 return callback(null, []);
1484 }
1485 let remaining = array.length;
1486 const results = new Array(array.length);
1487 let error = null;
1488 array.forEach((item, i) => {
1489 fn(item, (err, result) => {
1490 if (err)
1491 error = err;
1492 results[i] = result; // https://github.com/facebook/flow/issues/2123
1493 if (--remaining === 0)
1494 callback(error, results);
1495 });
1496 });
1497}
1498/*
1499 * Compute the difference between the keys in one object and the keys
1500 * in another object.
1501 *
1502 * @returns keys difference
1503 * @private
1504 */
1505function keysDifference(obj, other) {
1506 const difference = [];
1507 for (const i in obj) {
1508 if (!(i in other)) {
1509 difference.push(i);
1510 }
1511 }
1512 return difference;
1513}
1514/**
1515 * Given a destination object and optionally many source objects,
1516 * copy all properties from the source objects into the destination.
1517 * The last source object given overrides properties from previous
1518 * source objects.
1519 *
1520 * @param dest destination object
1521 * @param sources sources from which properties are pulled
1522 * @private
1523 */
1524function extend$1(dest, ...sources) {
1525 for (const src of sources) {
1526 for (const k in src) {
1527 dest[k] = src[k];
1528 }
1529 }
1530 return dest;
1531}
1532/**
1533 * Given an object and a number of properties as strings, return version
1534 * of that object with only those properties.
1535 *
1536 * @param src the object
1537 * @param properties an array of property names chosen
1538 * to appear on the resulting object.
1539 * @returns object with limited properties.
1540 * @example
1541 * var foo = { name: 'Charlie', age: 10 };
1542 * var justName = pick(foo, ['name']);
1543 * // justName = { name: 'Charlie' }
1544 * @private
1545 */
1546function pick(src, properties) {
1547 const result = {};
1548 for (let i = 0; i < properties.length; i++) {
1549 const k = properties[i];
1550 if (k in src) {
1551 result[k] = src[k];
1552 }
1553 }
1554 return result;
1555}
1556let id = 1;
1557/**
1558 * Return a unique numeric id, starting at 1 and incrementing with
1559 * each call.
1560 *
1561 * @returns unique numeric id.
1562 * @private
1563 */
1564function uniqueId() {
1565 return id++;
1566}
1567/**
1568 * Return whether a given value is a power of two
1569 * @private
1570 */
1571function isPowerOfTwo(value) {
1572 return (Math.log(value) / Math.LN2) % 1 === 0;
1573}
1574/**
1575 * Return the next power of two, or the input value if already a power of two
1576 * @private
1577 */
1578function nextPowerOfTwo(value) {
1579 if (value <= 1)
1580 return 1;
1581 return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));
1582}
1583/**
1584 * Given an array of member function names as strings, replace all of them
1585 * with bound versions that will always refer to `context` as `this`. This
1586 * is useful for classes where otherwise event bindings would reassign
1587 * `this` to the evented object or some other value: this lets you ensure
1588 * the `this` value always.
1589 *
1590 * @param fns list of member function names
1591 * @param context the context value
1592 * @example
1593 * function MyClass() {
1594 * bindAll(['ontimer'], this);
1595 * this.name = 'Tom';
1596 * }
1597 * MyClass.prototype.ontimer = function() {
1598 * alert(this.name);
1599 * };
1600 * var myClass = new MyClass();
1601 * setTimeout(myClass.ontimer, 100);
1602 * @private
1603 */
1604function bindAll(fns, context) {
1605 fns.forEach((fn) => {
1606 if (!context[fn]) {
1607 return;
1608 }
1609 context[fn] = context[fn].bind(context);
1610 });
1611}
1612/**
1613 * Create an object by mapping all the values of an existing object while
1614 * preserving their keys.
1615 *
1616 * @private
1617 */
1618function mapObject(input, iterator, context) {
1619 const output = {};
1620 for (const key in input) {
1621 output[key] = iterator.call(context || this, input[key], key, input);
1622 }
1623 return output;
1624}
1625/**
1626 * Create an object by filtering out values of an existing object.
1627 *
1628 * @private
1629 */
1630function filterObject(input, iterator, context) {
1631 const output = {};
1632 for (const key in input) {
1633 if (iterator.call(context || this, input[key], key, input)) {
1634 output[key] = input[key];
1635 }
1636 }
1637 return output;
1638}
1639/**
1640 * Deeply clones two objects.
1641 *
1642 * @private
1643 */
1644function clone$9(input) {
1645 if (Array.isArray(input)) {
1646 return input.map(clone$9);
1647 }
1648 else if (typeof input === 'object' && input) {
1649 return mapObject(input, clone$9);
1650 }
1651 else {
1652 return input;
1653 }
1654}
1655/**
1656 * Check if two arrays have at least one common element.
1657 *
1658 * @private
1659 */
1660function arraysIntersect(a, b) {
1661 for (let l = 0; l < a.length; l++) {
1662 if (b.indexOf(a[l]) >= 0)
1663 return true;
1664 }
1665 return false;
1666}
1667/**
1668 * Print a warning message to the console and ensure duplicate warning messages
1669 * are not printed.
1670 *
1671 * @private
1672 */
1673const warnOnceHistory = {};
1674function warnOnce(message) {
1675 if (!warnOnceHistory[message]) {
1676 // console isn't defined in some WebWorkers, see #2558
1677 if (typeof console !== 'undefined')
1678 console.warn(message);
1679 warnOnceHistory[message] = true;
1680 }
1681}
1682/**
1683 * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order
1684 *
1685 * @private
1686 * @returns true for a counter clockwise set of points
1687 */
1688// http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/
1689function isCounterClockwise(a, b, c) {
1690 return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);
1691}
1692/**
1693 * Returns the signed area for the polygon ring. Positive areas are exterior rings and
1694 * have a clockwise winding. Negative areas are interior rings and have a counter clockwise
1695 * ordering.
1696 *
1697 * @private
1698 * @param ring Exterior or interior ring
1699 */
1700function calculateSignedArea(ring) {
1701 let sum = 0;
1702 for (let i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
1703 p1 = ring[i];
1704 p2 = ring[j];
1705 sum += (p2.x - p1.x) * (p1.y + p2.y);
1706 }
1707 return sum;
1708}
1709/**
1710 * Detects closed polygons, first + last point are equal
1711 *
1712 * @private
1713 * @param points array of points
1714 * @return true if the points are a closed polygon
1715 */
1716function isClosedPolygon(points) {
1717 // If it is 2 points that are the same then it is a point
1718 // If it is 3 points with start and end the same then it is a line
1719 if (points.length < 4)
1720 return false;
1721 const p1 = points[0];
1722 const p2 = points[points.length - 1];
1723 if (Math.abs(p1.x - p2.x) > 0 ||
1724 Math.abs(p1.y - p2.y) > 0) {
1725 return false;
1726 }
1727 // polygon simplification can produce polygons with zero area and more than 3 points
1728 return Math.abs(calculateSignedArea(points)) > 0.01;
1729}
1730/**
1731 * Converts spherical coordinates to cartesian coordinates.
1732 *
1733 * @private
1734 * @param spherical Spherical coordinates, in [radial, azimuthal, polar]
1735 * @return cartesian coordinates in [x, y, z]
1736 */
1737function sphericalToCartesian([r, azimuthal, polar]) {
1738 // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2):
1739 // correct for that here
1740 azimuthal += 90;
1741 // Convert azimuthal and polar angles to radians
1742 azimuthal *= Math.PI / 180;
1743 polar *= Math.PI / 180;
1744 return {
1745 x: r * Math.cos(azimuthal) * Math.sin(polar),
1746 y: r * Math.sin(azimuthal) * Math.sin(polar),
1747 z: r * Math.cos(polar)
1748 };
1749}
1750/* global self, WorkerGlobalScope */
1751/**
1752 * Returns true if the when run in the web-worker context.
1753 *
1754 * @private
1755 * @returns {boolean}
1756 */
1757function isWorker() {
1758 return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' &&
1759 self instanceof WorkerGlobalScope;
1760}
1761/**
1762 * Parses data from 'Cache-Control' headers.
1763 *
1764 * @private
1765 * @param cacheControl Value of 'Cache-Control' header
1766 * @return object containing parsed header info.
1767 */
1768function parseCacheControl(cacheControl) {
1769 // Taken from [Wreck](https://github.com/hapijs/wreck)
1770 const re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g;
1771 const header = {};
1772 cacheControl.replace(re, ($0, $1, $2, $3) => {
1773 const value = $2 || $3;
1774 header[$1] = value ? value.toLowerCase() : true;
1775 return '';
1776 });
1777 if (header['max-age']) {
1778 const maxAge = parseInt(header['max-age'], 10);
1779 if (isNaN(maxAge))
1780 delete header['max-age'];
1781 else
1782 header['max-age'] = maxAge;
1783 }
1784 return header;
1785}
1786let _isSafari = null;
1787/**
1788 * Returns true when run in WebKit derived browsers.
1789 * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to
1790 * transfer data between WebWorkers and the main thread.
1791 * https://github.com/mapbox/mapbox-gl-js/issues/8771
1792 *
1793 * This should be removed once the underlying Safari issue is fixed.
1794 *
1795 * @private
1796 * @param scope {WindowOrWorkerGlobalScope} Since this function is used both on the main thread and WebWorker context,
1797 * let the calling scope pass in the global scope object.
1798 * @returns {boolean}
1799 */
1800function isSafari(scope) {
1801 if (_isSafari == null) {
1802 const userAgent = scope.navigator ? scope.navigator.userAgent : null;
1803 _isSafari = !!scope.safari ||
1804 !!(userAgent && (/\b(iPad|iPhone|iPod)\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome'))));
1805 }
1806 return _isSafari;
1807}
1808function storageAvailable(type) {
1809 try {
1810 const storage = window[type];
1811 storage.setItem('_mapbox_test_', 1);
1812 storage.removeItem('_mapbox_test_');
1813 return true;
1814 }
1815 catch (e) {
1816 return false;
1817 }
1818}
1819// The following methods are from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
1820//Unicode compliant base64 encoder for strings
1821function b64EncodeUnicode(str) {
1822 return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (match, p1) => {
1823 return String.fromCharCode(Number('0x' + p1)); //eslint-disable-line
1824 }));
1825}
1826// Unicode compliant decoder for base64-encoded strings
1827function b64DecodeUnicode(str) {
1828 return decodeURIComponent(atob(str).split('').map((c) => {
1829 return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); //eslint-disable-line
1830 }).join(''));
1831}
1832function isImageBitmap(image) {
1833 return typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap;
1834}
1835
1836const now = typeof performance !== 'undefined' && performance && performance.now ?
1837 performance.now.bind(performance) :
1838 Date.now.bind(Date);
1839let linkEl;
1840let reducedMotionQuery;
1841/**
1842 * @private
1843 */
1844const exported$1 = {
1845 /**
1846 * Provides a function that outputs milliseconds: either performance.now()
1847 * or a fallback to Date.now()
1848 */
1849 now,
1850 frame(fn) {
1851 const frame = requestAnimationFrame(fn);
1852 return { cancel: () => cancelAnimationFrame(frame) };
1853 },
1854 getImageData(img, padding = 0) {
1855 const canvas = window.document.createElement('canvas');
1856 const context = canvas.getContext('2d');
1857 if (!context) {
1858 throw new Error('failed to create canvas 2d context');
1859 }
1860 canvas.width = img.width;
1861 canvas.height = img.height;
1862 context.drawImage(img, 0, 0, img.width, img.height);
1863 return context.getImageData(-padding, -padding, img.width + 2 * padding, img.height + 2 * padding);
1864 },
1865 resolveURL(path) {
1866 if (!linkEl)
1867 linkEl = document.createElement('a');
1868 linkEl.href = path;
1869 return linkEl.href;
1870 },
1871 hardwareConcurrency: typeof navigator !== 'undefined' && navigator.hardwareConcurrency || 4,
1872 get prefersReducedMotion() {
1873 if (!matchMedia)
1874 return false;
1875 //Lazily initialize media query
1876 if (reducedMotionQuery == null) {
1877 reducedMotionQuery = matchMedia('(prefers-reduced-motion: reduce)');
1878 }
1879 return reducedMotionQuery.matches;
1880 },
1881};
1882
1883'use strict';
1884
1885var pointGeometry = Point$1;
1886
1887/**
1888 * A standalone point geometry with useful accessor, comparison, and
1889 * modification methods.
1890 *
1891 * @class Point
1892 * @param {Number} x the x-coordinate. this could be longitude or screen
1893 * pixels, or any other sort of unit.
1894 * @param {Number} y the y-coordinate. this could be latitude or screen
1895 * pixels, or any other sort of unit.
1896 * @example
1897 * var point = new Point(-77, 38);
1898 */
1899function Point$1(x, y) {
1900 this.x = x;
1901 this.y = y;
1902}
1903
1904Point$1.prototype = {
1905
1906 /**
1907 * Clone this point, returning a new point that can be modified
1908 * without affecting the old one.
1909 * @return {Point} the clone
1910 */
1911 clone: function() { return new Point$1(this.x, this.y); },
1912
1913 /**
1914 * Add this point's x & y coordinates to another point,
1915 * yielding a new point.
1916 * @param {Point} p the other point
1917 * @return {Point} output point
1918 */
1919 add: function(p) { return this.clone()._add(p); },
1920
1921 /**
1922 * Subtract this point's x & y coordinates to from point,
1923 * yielding a new point.
1924 * @param {Point} p the other point
1925 * @return {Point} output point
1926 */
1927 sub: function(p) { return this.clone()._sub(p); },
1928
1929 /**
1930 * Multiply this point's x & y coordinates by point,
1931 * yielding a new point.
1932 * @param {Point} p the other point
1933 * @return {Point} output point
1934 */
1935 multByPoint: function(p) { return this.clone()._multByPoint(p); },
1936
1937 /**
1938 * Divide this point's x & y coordinates by point,
1939 * yielding a new point.
1940 * @param {Point} p the other point
1941 * @return {Point} output point
1942 */
1943 divByPoint: function(p) { return this.clone()._divByPoint(p); },
1944
1945 /**
1946 * Multiply this point's x & y coordinates by a factor,
1947 * yielding a new point.
1948 * @param {Point} k factor
1949 * @return {Point} output point
1950 */
1951 mult: function(k) { return this.clone()._mult(k); },
1952
1953 /**
1954 * Divide this point's x & y coordinates by a factor,
1955 * yielding a new point.
1956 * @param {Point} k factor
1957 * @return {Point} output point
1958 */
1959 div: function(k) { return this.clone()._div(k); },
1960
1961 /**
1962 * Rotate this point around the 0, 0 origin by an angle a,
1963 * given in radians
1964 * @param {Number} a angle to rotate around, in radians
1965 * @return {Point} output point
1966 */
1967 rotate: function(a) { return this.clone()._rotate(a); },
1968
1969 /**
1970 * Rotate this point around p point by an angle a,
1971 * given in radians
1972 * @param {Number} a angle to rotate around, in radians
1973 * @param {Point} p Point to rotate around
1974 * @return {Point} output point
1975 */
1976 rotateAround: function(a,p) { return this.clone()._rotateAround(a,p); },
1977
1978 /**
1979 * Multiply this point by a 4x1 transformation matrix
1980 * @param {Array<Number>} m transformation matrix
1981 * @return {Point} output point
1982 */
1983 matMult: function(m) { return this.clone()._matMult(m); },
1984
1985 /**
1986 * Calculate this point but as a unit vector from 0, 0, meaning
1987 * that the distance from the resulting point to the 0, 0
1988 * coordinate will be equal to 1 and the angle from the resulting
1989 * point to the 0, 0 coordinate will be the same as before.
1990 * @return {Point} unit vector point
1991 */
1992 unit: function() { return this.clone()._unit(); },
1993
1994 /**
1995 * Compute a perpendicular point, where the new y coordinate
1996 * is the old x coordinate and the new x coordinate is the old y
1997 * coordinate multiplied by -1
1998 * @return {Point} perpendicular point
1999 */
2000 perp: function() { return this.clone()._perp(); },
2001
2002 /**
2003 * Return a version of this point with the x & y coordinates
2004 * rounded to integers.
2005 * @return {Point} rounded point
2006 */
2007 round: function() { return this.clone()._round(); },
2008
2009 /**
2010 * Return the magitude of this point: this is the Euclidean
2011 * distance from the 0, 0 coordinate to this point's x and y
2012 * coordinates.
2013 * @return {Number} magnitude
2014 */
2015 mag: function() {
2016 return Math.sqrt(this.x * this.x + this.y * this.y);
2017 },
2018
2019 /**
2020 * Judge whether this point is equal to another point, returning
2021 * true or false.
2022 * @param {Point} other the other point
2023 * @return {boolean} whether the points are equal
2024 */
2025 equals: function(other) {
2026 return this.x === other.x &&
2027 this.y === other.y;
2028 },
2029
2030 /**
2031 * Calculate the distance from this point to another point
2032 * @param {Point} p the other point
2033 * @return {Number} distance
2034 */
2035 dist: function(p) {
2036 return Math.sqrt(this.distSqr(p));
2037 },
2038
2039 /**
2040 * Calculate the distance from this point to another point,
2041 * without the square root step. Useful if you're comparing
2042 * relative distances.
2043 * @param {Point} p the other point
2044 * @return {Number} distance
2045 */
2046 distSqr: function(p) {
2047 var dx = p.x - this.x,
2048 dy = p.y - this.y;
2049 return dx * dx + dy * dy;
2050 },
2051
2052 /**
2053 * Get the angle from the 0, 0 coordinate to this point, in radians
2054 * coordinates.
2055 * @return {Number} angle
2056 */
2057 angle: function() {
2058 return Math.atan2(this.y, this.x);
2059 },
2060
2061 /**
2062 * Get the angle from this point to another point, in radians
2063 * @param {Point} b the other point
2064 * @return {Number} angle
2065 */
2066 angleTo: function(b) {
2067 return Math.atan2(this.y - b.y, this.x - b.x);
2068 },
2069
2070 /**
2071 * Get the angle between this point and another point, in radians
2072 * @param {Point} b the other point
2073 * @return {Number} angle
2074 */
2075 angleWith: function(b) {
2076 return this.angleWithSep(b.x, b.y);
2077 },
2078
2079 /*
2080 * Find the angle of the two vectors, solving the formula for
2081 * the cross product a x b = |a||b|sin(θ) for θ.
2082 * @param {Number} x the x-coordinate
2083 * @param {Number} y the y-coordinate
2084 * @return {Number} the angle in radians
2085 */
2086 angleWithSep: function(x, y) {
2087 return Math.atan2(
2088 this.x * y - this.y * x,
2089 this.x * x + this.y * y);
2090 },
2091
2092 _matMult: function(m) {
2093 var x = m[0] * this.x + m[1] * this.y,
2094 y = m[2] * this.x + m[3] * this.y;
2095 this.x = x;
2096 this.y = y;
2097 return this;
2098 },
2099
2100 _add: function(p) {
2101 this.x += p.x;
2102 this.y += p.y;
2103 return this;
2104 },
2105
2106 _sub: function(p) {
2107 this.x -= p.x;
2108 this.y -= p.y;
2109 return this;
2110 },
2111
2112 _mult: function(k) {
2113 this.x *= k;
2114 this.y *= k;
2115 return this;
2116 },
2117
2118 _div: function(k) {
2119 this.x /= k;
2120 this.y /= k;
2121 return this;
2122 },
2123
2124 _multByPoint: function(p) {
2125 this.x *= p.x;
2126 this.y *= p.y;
2127 return this;
2128 },
2129
2130 _divByPoint: function(p) {
2131 this.x /= p.x;
2132 this.y /= p.y;
2133 return this;
2134 },
2135
2136 _unit: function() {
2137 this._div(this.mag());
2138 return this;
2139 },
2140
2141 _perp: function() {
2142 var y = this.y;
2143 this.y = this.x;
2144 this.x = -y;
2145 return this;
2146 },
2147
2148 _rotate: function(angle) {
2149 var cos = Math.cos(angle),
2150 sin = Math.sin(angle),
2151 x = cos * this.x - sin * this.y,
2152 y = sin * this.x + cos * this.y;
2153 this.x = x;
2154 this.y = y;
2155 return this;
2156 },
2157
2158 _rotateAround: function(angle, p) {
2159 var cos = Math.cos(angle),
2160 sin = Math.sin(angle),
2161 x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
2162 y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
2163 this.x = x;
2164 this.y = y;
2165 return this;
2166 },
2167
2168 _round: function() {
2169 this.x = Math.round(this.x);
2170 this.y = Math.round(this.y);
2171 return this;
2172 }
2173};
2174
2175/**
2176 * Construct a point from an array if necessary, otherwise if the input
2177 * is already a Point, or an unknown type, return it unchanged
2178 * @param {Array<Number>|Point|*} a any kind of input value
2179 * @return {Point} constructed point, or passed-through value.
2180 * @example
2181 * // this
2182 * var point = Point.convert([0, 1]);
2183 * // is equivalent to
2184 * var point = new Point(0, 1);
2185 */
2186Point$1.convert = function (a) {
2187 if (a instanceof Point$1) {
2188 return a;
2189 }
2190 if (Array.isArray(a)) {
2191 return new Point$1(a[0], a[1]);
2192 }
2193 return a;
2194};
2195
2196const config = {
2197 MAX_PARALLEL_IMAGE_REQUESTS: 16,
2198 REGISTERED_PROTOCOLS: {},
2199};
2200
2201const CACHE_NAME = 'mapbox-tiles';
2202let cacheLimit = 500; // 50MB / (100KB/tile) ~= 500 tiles
2203let cacheCheckThreshold = 50;
2204const MIN_TIME_UNTIL_EXPIRY = 1000 * 60 * 7; // 7 minutes. Skip caching tiles with a short enough max age.
2205// We're using a global shared cache object. Normally, requesting ad-hoc Cache objects is fine, but
2206// Safari has a memory leak in which it fails to release memory when requesting keys() from a Cache
2207// object. See https://bugs.webkit.org/show_bug.cgi?id=203991 for more information.
2208let sharedCache;
2209function cacheOpen() {
2210 if (typeof caches !== 'undefined' && !sharedCache) {
2211 sharedCache = caches.open(CACHE_NAME);
2212 }
2213}
2214// We're never closing the cache, but our unit tests rely on changing out the global window.caches
2215// object, so we have a function specifically for unit tests that allows resetting the shared cache.
2216function cacheClose() {
2217 sharedCache = undefined;
2218}
2219let responseConstructorSupportsReadableStream;
2220function prepareBody(response, callback) {
2221 if (responseConstructorSupportsReadableStream === undefined) {
2222 try {
2223 new Response(new ReadableStream()); // eslint-disable-line no-undef
2224 responseConstructorSupportsReadableStream = true;
2225 }
2226 catch (e) {
2227 // Edge
2228 responseConstructorSupportsReadableStream = false;
2229 }
2230 }
2231 if (responseConstructorSupportsReadableStream) {
2232 callback(response.body);
2233 }
2234 else {
2235 response.blob().then(callback);
2236 }
2237}
2238function cachePut(request, response, requestTime) {
2239 cacheOpen();
2240 if (!sharedCache)
2241 return;
2242 const options = {
2243 status: response.status,
2244 statusText: response.statusText,
2245 headers: new Headers()
2246 };
2247 response.headers.forEach((v, k) => options.headers.set(k, v));
2248 const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || '');
2249 if (cacheControl['no-store']) {
2250 return;
2251 }
2252 if (cacheControl['max-age']) {
2253 options.headers.set('Expires', new Date(requestTime + cacheControl['max-age'] * 1000).toUTCString());
2254 }
2255 const timeUntilExpiry = new Date(options.headers.get('Expires')).getTime() - requestTime;
2256 if (timeUntilExpiry < MIN_TIME_UNTIL_EXPIRY)
2257 return;
2258 prepareBody(response, body => {
2259 const clonedResponse = new Response(body, options);
2260 cacheOpen();
2261 if (!sharedCache)
2262 return;
2263 sharedCache
2264 .then(cache => cache.put(stripQueryParameters(request.url), clonedResponse))
2265 .catch(e => warnOnce(e.message));
2266 });
2267}
2268function stripQueryParameters(url) {
2269 const start = url.indexOf('?');
2270 return start < 0 ? url : url.slice(0, start);
2271}
2272function cacheGet(request, callback) {
2273 cacheOpen();
2274 if (!sharedCache)
2275 return callback(null);
2276 const strippedURL = stripQueryParameters(request.url);
2277 sharedCache
2278 .then(cache => {
2279 // manually strip URL instead of `ignoreSearch: true` because of a known
2280 // performance issue in Chrome https://github.com/mapbox/mapbox-gl-js/issues/8431
2281 cache.match(strippedURL)
2282 .then(response => {
2283 const fresh = isFresh(response);
2284 // Reinsert into cache so that order of keys in the cache is the order of access.
2285 // This line makes the cache a LRU instead of a FIFO cache.
2286 cache.delete(strippedURL);
2287 if (fresh) {
2288 cache.put(strippedURL, response.clone());
2289 }
2290 callback(null, response, fresh);
2291 })
2292 .catch(callback);
2293 })
2294 .catch(callback);
2295}
2296function isFresh(response) {
2297 if (!response)
2298 return false;
2299 const expires = new Date(response.headers.get('Expires') || 0).getTime();
2300 const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || '');
2301 return expires > Date.now() && !cacheControl['no-cache'];
2302}
2303// `Infinity` triggers a cache check after the first tile is loaded
2304// so that a check is run at least once on each page load.
2305let globalEntryCounter = Infinity;
2306// The cache check gets run on a worker. The reason for this is that
2307// profiling sometimes shows this as taking up significant time on the
2308// thread it gets called from. And sometimes it doesn't. It *may* be
2309// fine to run this on the main thread but out of caution this is being
2310// dispatched on a worker. This can be investigated further in the future.
2311function cacheEntryPossiblyAdded(dispatcher) {
2312 globalEntryCounter++;
2313 if (globalEntryCounter > cacheCheckThreshold) {
2314 dispatcher.getActor().send('enforceCacheSizeLimit', cacheLimit);
2315 globalEntryCounter = 0;
2316 }
2317}
2318// runs on worker, see above comment
2319function enforceCacheSizeLimit(limit) {
2320 cacheOpen();
2321 if (!sharedCache)
2322 return;
2323 sharedCache
2324 .then(cache => {
2325 cache.keys().then(keys => {
2326 for (let i = 0; i < keys.length - limit; i++) {
2327 cache.delete(keys[i]);
2328 }
2329 });
2330 });
2331}
2332function clearTileCache(callback) {
2333 const promise = caches.delete(CACHE_NAME);
2334 if (callback) {
2335 promise.catch(callback).then(() => callback());
2336 }
2337}
2338function setCacheLimits(limit, checkThreshold) {
2339 cacheLimit = limit;
2340 cacheCheckThreshold = checkThreshold;
2341}
2342
2343const exported = {
2344 supported: false,
2345 testSupport
2346};
2347let glForTesting;
2348let webpCheckComplete = false;
2349let webpImgTest;
2350let webpImgTestOnloadComplete = false;
2351if (typeof document !== 'undefined') {
2352 webpImgTest = document.createElement('img');
2353 webpImgTest.onload = function () {
2354 if (glForTesting)
2355 testWebpTextureUpload(glForTesting);
2356 glForTesting = null;
2357 webpImgTestOnloadComplete = true;
2358 };
2359 webpImgTest.onerror = function () {
2360 webpCheckComplete = true;
2361 glForTesting = null;
2362 };
2363 webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=';
2364}
2365function testSupport(gl) {
2366 if (webpCheckComplete || !webpImgTest)
2367 return;
2368 // HTMLImageElement.complete is set when an image is done loading it's source
2369 // regardless of whether the load was successful or not.
2370 // It's possible for an error to set HTMLImageElement.complete to true which would trigger
2371 // testWebpTextureUpload and mistakenly set exported.supported to true in browsers which don't support webp
2372 // To avoid this, we set a flag in the image's onload handler and only call testWebpTextureUpload
2373 // after a successful image load event.
2374 if (webpImgTestOnloadComplete) {
2375 testWebpTextureUpload(gl);
2376 }
2377 else {
2378 glForTesting = gl;
2379 }
2380}
2381function testWebpTextureUpload(gl) {
2382 // Edge 18 supports WebP but not uploading a WebP image to a gl texture
2383 // Test support for this before allowing WebP images.
2384 // https://github.com/mapbox/mapbox-gl-js/issues/7671
2385 const texture = gl.createTexture();
2386 gl.bindTexture(gl.TEXTURE_2D, texture);
2387 try {
2388 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, webpImgTest);
2389 // The error does not get triggered in Edge if the context is lost
2390 if (gl.isContextLost())
2391 return;
2392 exported.supported = true;
2393 }
2394 catch (e) {
2395 // Catch "Unspecified Error." in Edge 18.
2396 }
2397 gl.deleteTexture(texture);
2398 webpCheckComplete = true;
2399}
2400
2401/**
2402 * The type of a resource.
2403 * @private
2404 * @readonly
2405 * @enum {string}
2406 */
2407const ResourceType = {
2408 Unknown: 'Unknown',
2409 Style: 'Style',
2410 Source: 'Source',
2411 Tile: 'Tile',
2412 Glyphs: 'Glyphs',
2413 SpriteImage: 'SpriteImage',
2414 SpriteJSON: 'SpriteJSON',
2415 Image: 'Image'
2416};
2417if (typeof Object.freeze == 'function') {
2418 Object.freeze(ResourceType);
2419}
2420/**
2421 * An error thrown when a HTTP request results in an error response.
2422 * @extends Error
2423 * @param {number} status The response's HTTP status code.
2424 * @param {string} statusText The response's HTTP status text.
2425 * @param {string} url The request's URL.
2426 * @param {Blob} body The response's body.
2427 */
2428class AJAXError extends Error {
2429 constructor(status, statusText, url, body) {
2430 super(`AJAXError: ${statusText} (${status}): ${url}`);
2431 this.status = status;
2432 this.statusText = statusText;
2433 this.url = url;
2434 this.body = body;
2435 }
2436}
2437// Ensure that we're sending the correct referrer from blob URL worker bundles.
2438// For files loaded from the local file system, `location.origin` will be set
2439// to the string(!) "null" (Firefox), or "file://" (Chrome, Safari, Edge, IE),
2440// and we will set an empty referrer. Otherwise, we're using the document's URL.
2441/* global self */
2442const getReferrer = isWorker() ?
2443 () => self.worker && self.worker.referrer :
2444 () => (window.location.protocol === 'blob:' ? window.parent : window).location.href;
2445// Determines whether a URL is a file:// URL. This is obviously the case if it begins
2446// with file://. Relative URLs are also file:// URLs iff the original document was loaded
2447// via a file:// URL.
2448const isFileURL = url => /^file:/.test(url) || (/^file:/.test(getReferrer()) && !/^\w+:/.test(url));
2449function makeFetchRequest(requestParameters, callback) {
2450 const controller = new AbortController();
2451 const request = new Request(requestParameters.url, {
2452 method: requestParameters.method || 'GET',
2453 body: requestParameters.body,
2454 credentials: requestParameters.credentials,
2455 headers: requestParameters.headers,
2456 referrer: getReferrer(),
2457 signal: controller.signal
2458 });
2459 let complete = false;
2460 let aborted = false;
2461 const cacheIgnoringSearch = false;
2462 if (requestParameters.type === 'json') {
2463 request.headers.set('Accept', 'application/json');
2464 }
2465 const validateOrFetch = (err, cachedResponse, responseIsFresh) => {
2466 if (aborted)
2467 return;
2468 if (err) {
2469 // Do fetch in case of cache error.
2470 // HTTP pages in Edge trigger a security error that can be ignored.
2471 if (err.message !== 'SecurityError') {
2472 warnOnce(err);
2473 }
2474 }
2475 if (cachedResponse && responseIsFresh) {
2476 return finishRequest(cachedResponse);
2477 }
2478 if (cachedResponse) {
2479 // We can't do revalidation with 'If-None-Match' because then the
2480 // request doesn't have simple cors headers.
2481 }
2482 const requestTime = Date.now();
2483 fetch(request).then(response => {
2484 if (response.ok) {
2485 const cacheableResponse = cacheIgnoringSearch ? response.clone() : null;
2486 return finishRequest(response, cacheableResponse, requestTime);
2487 }
2488 else {
2489 return response.blob().then(body => callback(new AJAXError(response.status, response.statusText, requestParameters.url, body)));
2490 }
2491 }).catch(error => {
2492 if (error.code === 20) {
2493 // silence expected AbortError
2494 return;
2495 }
2496 callback(new Error(error.message));
2497 });
2498 };
2499 const finishRequest = (response, cacheableResponse, requestTime) => {
2500 (requestParameters.type === 'arrayBuffer' ? response.arrayBuffer() :
2501 requestParameters.type === 'json' ? response.json() :
2502 response.text()).then(result => {
2503 if (aborted)
2504 return;
2505 if (cacheableResponse && requestTime) {
2506 // The response needs to be inserted into the cache after it has completely loaded.
2507 // Until it is fully loaded there is a chance it will be aborted. Aborting while
2508 // reading the body can cause the cache insertion to error. We could catch this error
2509 // in most browsers but in Firefox it seems to sometimes crash the tab. Adding
2510 // it to the cache here avoids that error.
2511 cachePut(request, cacheableResponse, requestTime);
2512 }
2513 complete = true;
2514 callback(null, result, response.headers.get('Cache-Control'), response.headers.get('Expires'));
2515 }).catch(err => {
2516 if (!aborted)
2517 callback(new Error(err.message));
2518 });
2519 };
2520 if (cacheIgnoringSearch) {
2521 cacheGet(request, validateOrFetch);
2522 }
2523 else {
2524 validateOrFetch(null, null);
2525 }
2526 return { cancel: () => {
2527 aborted = true;
2528 if (!complete)
2529 controller.abort();
2530 } };
2531}
2532function makeXMLHttpRequest(requestParameters, callback) {
2533 const xhr = new XMLHttpRequest();
2534 xhr.open(requestParameters.method || 'GET', requestParameters.url, true);
2535 if (requestParameters.type === 'arrayBuffer') {
2536 xhr.responseType = 'arraybuffer';
2537 }
2538 for (const k in requestParameters.headers) {
2539 xhr.setRequestHeader(k, requestParameters.headers[k]);
2540 }
2541 if (requestParameters.type === 'json') {
2542 xhr.responseType = 'text';
2543 xhr.setRequestHeader('Accept', 'application/json');
2544 }
2545 xhr.withCredentials = requestParameters.credentials === 'include';
2546 xhr.onerror = () => {
2547 callback(new Error(xhr.statusText));
2548 };
2549 xhr.onload = () => {
2550 if (((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) && xhr.response !== null) {
2551 let data = xhr.response;
2552 if (requestParameters.type === 'json') {
2553 // We're manually parsing JSON here to get better error messages.
2554 try {
2555 data = JSON.parse(xhr.response);
2556 }
2557 catch (err) {
2558 return callback(err);
2559 }
2560 }
2561 callback(null, data, xhr.getResponseHeader('Cache-Control'), xhr.getResponseHeader('Expires'));
2562 }
2563 else {
2564 const body = new Blob([xhr.response], { type: xhr.getResponseHeader('Content-Type') });
2565 callback(new AJAXError(xhr.status, xhr.statusText, requestParameters.url, body));
2566 }
2567 };
2568 xhr.send(requestParameters.body);
2569 return { cancel: () => xhr.abort() };
2570}
2571const makeRequest = function (requestParameters, callback) {
2572 // We're trying to use the Fetch API if possible. However, in some situations we can't use it:
2573 // - IE11 doesn't support it at all. In this case, we dispatch the request to the main thread so
2574 // that we can get an accruate referrer header.
2575 // - Safari exposes window.AbortController, but it doesn't work actually abort any requests in
2576 // some versions (see https://bugs.webkit.org/show_bug.cgi?id=174980#c2)
2577 // - Requests for resources with the file:// URI scheme don't work with the Fetch API either. In
2578 // this case we unconditionally use XHR on the current thread since referrers don't matter.
2579 if (/:\/\//.test(requestParameters.url) && !(/^https?:|^file:/.test(requestParameters.url))) {
2580 if (isWorker() && self.worker && self.worker.actor) {
2581 return self.worker.actor.send('getResource', requestParameters, callback);
2582 }
2583 if (!isWorker()) {
2584 const protocol = requestParameters.url.substring(0, requestParameters.url.indexOf('://'));
2585 const action = config.REGISTERED_PROTOCOLS[protocol] || makeFetchRequest;
2586 return action(requestParameters, callback);
2587 }
2588 }
2589 if (!isFileURL(requestParameters.url)) {
2590 if (fetch && Request && AbortController && Object.prototype.hasOwnProperty.call(Request.prototype, 'signal')) {
2591 return makeFetchRequest(requestParameters, callback);
2592 }
2593 if (isWorker() && self.worker && self.worker.actor) {
2594 const queueOnMainThread = true;
2595 return self.worker.actor.send('getResource', requestParameters, callback, undefined, queueOnMainThread);
2596 }
2597 }
2598 return makeXMLHttpRequest(requestParameters, callback);
2599};
2600const getJSON = function (requestParameters, callback) {
2601 return makeRequest(extend$1(requestParameters, { type: 'json' }), callback);
2602};
2603const getArrayBuffer = function (requestParameters, callback) {
2604 return makeRequest(extend$1(requestParameters, { type: 'arrayBuffer' }), callback);
2605};
2606const postData = function (requestParameters, callback) {
2607 return makeRequest(extend$1(requestParameters, { method: 'POST' }), callback);
2608};
2609function sameOrigin(url) {
2610 const a = window.document.createElement('a');
2611 a.href = url;
2612 return a.protocol === window.document.location.protocol && a.host === window.document.location.host;
2613}
2614const transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=';
2615function arrayBufferToImage(data, callback) {
2616 const img = new Image();
2617 img.onload = () => {
2618 callback(null, img);
2619 URL.revokeObjectURL(img.src);
2620 // prevent image dataURI memory leak in Safari;
2621 // but don't free the image immediately because it might be uploaded in the next frame
2622 // https://github.com/mapbox/mapbox-gl-js/issues/10226
2623 img.onload = null;
2624 window.requestAnimationFrame(() => { img.src = transparentPngUrl; });
2625 };
2626 img.onerror = () => callback(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.'));
2627 const blob = new Blob([new Uint8Array(data)], { type: 'image/png' });
2628 img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl;
2629}
2630function arrayBufferToImageBitmap(data, callback) {
2631 const blob = new Blob([new Uint8Array(data)], { type: 'image/png' });
2632 createImageBitmap(blob).then((imgBitmap) => {
2633 callback(null, imgBitmap);
2634 }).catch((e) => {
2635 callback(new Error(`Could not load image because of ${e.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`));
2636 });
2637}
2638function arrayBufferToCanvasImageSource(data, callback) {
2639 const imageBitmapSupported = typeof createImageBitmap === 'function';
2640 if (imageBitmapSupported) {
2641 arrayBufferToImageBitmap(data, callback);
2642 }
2643 else {
2644 arrayBufferToImage(data, callback);
2645 }
2646}
2647let imageQueue, numImageRequests;
2648const resetImageRequestQueue = () => {
2649 imageQueue = [];
2650 numImageRequests = 0;
2651};
2652resetImageRequestQueue();
2653const getImage = function (requestParameters, callback) {
2654 if (exported.supported) {
2655 if (!requestParameters.headers) {
2656 requestParameters.headers = {};
2657 }
2658 requestParameters.headers.accept = 'image/webp,*/*';
2659 }
2660 // limit concurrent image loads to help with raster sources performance on big screens
2661 if (numImageRequests >= config.MAX_PARALLEL_IMAGE_REQUESTS) {
2662 const queued = {
2663 requestParameters,
2664 callback,
2665 cancelled: false,
2666 cancel() { this.cancelled = true; }
2667 };
2668 imageQueue.push(queued);
2669 return queued;
2670 }
2671 numImageRequests++;
2672 let advanced = false;
2673 const advanceImageRequestQueue = () => {
2674 if (advanced)
2675 return;
2676 advanced = true;
2677 numImageRequests--;
2678 assert$1(numImageRequests >= 0);
2679 while (imageQueue.length && numImageRequests < config.MAX_PARALLEL_IMAGE_REQUESTS) { // eslint-disable-line
2680 const request = imageQueue.shift();
2681 const { requestParameters, callback, cancelled } = request;
2682 if (!cancelled) {
2683 request.cancel = getImage(requestParameters, callback).cancel;
2684 }
2685 }
2686 };
2687 // request the image with XHR to work around caching issues
2688 // see https://github.com/mapbox/mapbox-gl-js/issues/1470
2689 const request = getArrayBuffer(requestParameters, (err, data, cacheControl, expires) => {
2690 advanceImageRequestQueue();
2691 if (err) {
2692 callback(err);
2693 }
2694 else if (data) {
2695 const decoratedCallback = (imgErr, imgResult) => {
2696 if (imgErr != null) {
2697 callback(imgErr);
2698 }
2699 else if (imgResult != null) {
2700 callback(null, imgResult, { cacheControl, expires });
2701 }
2702 };
2703 arrayBufferToCanvasImageSource(data, decoratedCallback);
2704 }
2705 });
2706 return {
2707 cancel: () => {
2708 request.cancel();
2709 advanceImageRequestQueue();
2710 }
2711 };
2712};
2713const getVideo = function (urls, callback) {
2714 const video = window.document.createElement('video');
2715 video.muted = true;
2716 video.onloadstart = function () {
2717 callback(null, video);
2718 };
2719 for (let i = 0; i < urls.length; i++) {
2720 const s = window.document.createElement('source');
2721 if (!sameOrigin(urls[i])) {
2722 video.crossOrigin = 'Anonymous';
2723 }
2724 s.src = urls[i];
2725 video.appendChild(s);
2726 }
2727 return { cancel: () => { } };
2728};
2729
2730function _addEventListener(type, listener, listenerList) {
2731 const listenerExists = listenerList[type] && listenerList[type].indexOf(listener) !== -1;
2732 if (!listenerExists) {
2733 listenerList[type] = listenerList[type] || [];
2734 listenerList[type].push(listener);
2735 }
2736}
2737function _removeEventListener(type, listener, listenerList) {
2738 if (listenerList && listenerList[type]) {
2739 const index = listenerList[type].indexOf(listener);
2740 if (index !== -1) {
2741 listenerList[type].splice(index, 1);
2742 }
2743 }
2744}
2745class Event {
2746 constructor(type, data = {}) {
2747 extend$1(this, data);
2748 this.type = type;
2749 }
2750}
2751class ErrorEvent extends Event {
2752 constructor(error, data = {}) {
2753 super('error', extend$1({ error }, data));
2754 }
2755}
2756/**
2757 * Methods mixed in to other classes for event capabilities.
2758 *
2759 * @mixin Evented
2760 */
2761class Evented {
2762 /**
2763 * Adds a listener to a specified event type.
2764 *
2765 * @param {string} type The event type to add a listen for.
2766 * @param {Function} listener The function to be called when the event is fired.
2767 * The listener function is called with the data object passed to `fire`,
2768 * extended with `target` and `type` properties.
2769 * @returns {Object} `this`
2770 */
2771 on(type, listener) {
2772 this._listeners = this._listeners || {};
2773 _addEventListener(type, listener, this._listeners);
2774 return this;
2775 }
2776 /**
2777 * Removes a previously registered event listener.
2778 *
2779 * @param {string} type The event type to remove listeners for.
2780 * @param {Function} listener The listener function to remove.
2781 * @returns {Object} `this`
2782 */
2783 off(type, listener) {
2784 _removeEventListener(type, listener, this._listeners);
2785 _removeEventListener(type, listener, this._oneTimeListeners);
2786 return this;
2787 }
2788 /**
2789 * Adds a listener that will be called only once to a specified event type.
2790 *
2791 * The listener will be called first time the event fires after the listener is registered.
2792 *
2793 * @param {string} type The event type to listen for.
2794 * @param {Function} listener The function to be called when the event is fired the first time.
2795 * @returns {Object} `this`
2796 */
2797 once(type, listener) {
2798 this._oneTimeListeners = this._oneTimeListeners || {};
2799 _addEventListener(type, listener, this._oneTimeListeners);
2800 return this;
2801 }
2802 fire(event, properties) {
2803 // Compatibility with (type: string, properties: Object) signature from previous versions.
2804 // See https://github.com/mapbox/mapbox-gl-js/issues/6522,
2805 // https://github.com/mapbox/mapbox-gl-draw/issues/766
2806 if (typeof event === 'string') {
2807 event = new Event(event, properties || {});
2808 }
2809 const type = event.type;
2810 if (this.listens(type)) {
2811 event.target = this;
2812 // make sure adding or removing listeners inside other listeners won't cause an infinite loop
2813 const listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : [];
2814 for (const listener of listeners) {
2815 listener.call(this, event);
2816 }
2817 const oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : [];
2818 for (const listener of oneTimeListeners) {
2819 _removeEventListener(type, listener, this._oneTimeListeners);
2820 listener.call(this, event);
2821 }
2822 const parent = this._eventedParent;
2823 if (parent) {
2824 extend$1(event, typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData);
2825 parent.fire(event);
2826 }
2827 // To ensure that no error events are dropped, print them to the
2828 // console if they have no listeners.
2829 }
2830 else if (event instanceof ErrorEvent) {
2831 console.error(event.error);
2832 }
2833 return this;
2834 }
2835 /**
2836 * Returns a true if this instance of Evented or any forwardeed instances of Evented have a listener for the specified type.
2837 *
2838 * @param {string} type The event type
2839 * @returns {boolean} `true` if there is at least one registered listener for specified event type, `false` otherwise
2840 * @private
2841 */
2842 listens(type) {
2843 return ((this._listeners && this._listeners[type] && this._listeners[type].length > 0) ||
2844 (this._oneTimeListeners && this._oneTimeListeners[type] && this._oneTimeListeners[type].length > 0) ||
2845 (this._eventedParent && this._eventedParent.listens(type)));
2846 }
2847 /**
2848 * Bubble all events fired by this instance of Evented to this parent instance of Evented.
2849 *
2850 * @private
2851 * @returns {Object} `this`
2852 * @private
2853 */
2854 setEventedParent(parent, data) {
2855 this._eventedParent = parent;
2856 this._eventedParentData = data;
2857 return this;
2858 }
2859}
2860
2861var $version = 8;
2862var $root = {
2863 version: {
2864 required: true,
2865 type: "enum",
2866 values: [
2867 8
2868 ]
2869 },
2870 name: {
2871 type: "string"
2872 },
2873 metadata: {
2874 type: "*"
2875 },
2876 center: {
2877 type: "array",
2878 value: "number"
2879 },
2880 zoom: {
2881 type: "number"
2882 },
2883 bearing: {
2884 type: "number",
2885 "default": 0,
2886 period: 360,
2887 units: "degrees"
2888 },
2889 pitch: {
2890 type: "number",
2891 "default": 0,
2892 units: "degrees"
2893 },
2894 light: {
2895 type: "light"
2896 },
2897 sources: {
2898 required: true,
2899 type: "sources"
2900 },
2901 sprite: {
2902 type: "string"
2903 },
2904 glyphs: {
2905 type: "string"
2906 },
2907 transition: {
2908 type: "transition"
2909 },
2910 layers: {
2911 required: true,
2912 type: "array",
2913 value: "layer"
2914 }
2915};
2916var sources = {
2917 "*": {
2918 type: "source"
2919 }
2920};
2921var source = [
2922 "source_vector",
2923 "source_raster",
2924 "source_raster_dem",
2925 "source_geojson",
2926 "source_video",
2927 "source_image"
2928];
2929var source_vector = {
2930 type: {
2931 required: true,
2932 type: "enum",
2933 values: {
2934 vector: {
2935 }
2936 }
2937 },
2938 url: {
2939 type: "string"
2940 },
2941 tiles: {
2942 type: "array",
2943 value: "string"
2944 },
2945 bounds: {
2946 type: "array",
2947 value: "number",
2948 length: 4,
2949 "default": [
2950 -180,
2951 -85.051129,
2952 180,
2953 85.051129
2954 ]
2955 },
2956 scheme: {
2957 type: "enum",
2958 values: {
2959 xyz: {
2960 },
2961 tms: {
2962 }
2963 },
2964 "default": "xyz"
2965 },
2966 minzoom: {
2967 type: "number",
2968 "default": 0
2969 },
2970 maxzoom: {
2971 type: "number",
2972 "default": 22
2973 },
2974 attribution: {
2975 type: "string"
2976 },
2977 promoteId: {
2978 type: "promoteId"
2979 },
2980 volatile: {
2981 type: "boolean",
2982 "default": false
2983 },
2984 "*": {
2985 type: "*"
2986 }
2987};
2988var source_raster = {
2989 type: {
2990 required: true,
2991 type: "enum",
2992 values: {
2993 raster: {
2994 }
2995 }
2996 },
2997 url: {
2998 type: "string"
2999 },
3000 tiles: {
3001 type: "array",
3002 value: "string"
3003 },
3004 bounds: {
3005 type: "array",
3006 value: "number",
3007 length: 4,
3008 "default": [
3009 -180,
3010 -85.051129,
3011 180,
3012 85.051129
3013 ]
3014 },
3015 minzoom: {
3016 type: "number",
3017 "default": 0
3018 },
3019 maxzoom: {
3020 type: "number",
3021 "default": 22
3022 },
3023 tileSize: {
3024 type: "number",
3025 "default": 512,
3026 units: "pixels"
3027 },
3028 scheme: {
3029 type: "enum",
3030 values: {
3031 xyz: {
3032 },
3033 tms: {
3034 }
3035 },
3036 "default": "xyz"
3037 },
3038 attribution: {
3039 type: "string"
3040 },
3041 volatile: {
3042 type: "boolean",
3043 "default": false
3044 },
3045 "*": {
3046 type: "*"
3047 }
3048};
3049var source_raster_dem = {
3050 type: {
3051 required: true,
3052 type: "enum",
3053 values: {
3054 "raster-dem": {
3055 }
3056 }
3057 },
3058 url: {
3059 type: "string"
3060 },
3061 tiles: {
3062 type: "array",
3063 value: "string"
3064 },
3065 bounds: {
3066 type: "array",
3067 value: "number",
3068 length: 4,
3069 "default": [
3070 -180,
3071 -85.051129,
3072 180,
3073 85.051129
3074 ]
3075 },
3076 minzoom: {
3077 type: "number",
3078 "default": 0
3079 },
3080 maxzoom: {
3081 type: "number",
3082 "default": 22
3083 },
3084 tileSize: {
3085 type: "number",
3086 "default": 512,
3087 units: "pixels"
3088 },
3089 attribution: {
3090 type: "string"
3091 },
3092 encoding: {
3093 type: "enum",
3094 values: {
3095 terrarium: {
3096 },
3097 mapbox: {
3098 }
3099 },
3100 "default": "mapbox"
3101 },
3102 volatile: {
3103 type: "boolean",
3104 "default": false
3105 },
3106 "*": {
3107 type: "*"
3108 }
3109};
3110var source_geojson = {
3111 type: {
3112 required: true,
3113 type: "enum",
3114 values: {
3115 geojson: {
3116 }
3117 }
3118 },
3119 data: {
3120 type: "*"
3121 },
3122 maxzoom: {
3123 type: "number",
3124 "default": 18
3125 },
3126 attribution: {
3127 type: "string"
3128 },
3129 buffer: {
3130 type: "number",
3131 "default": 128,
3132 maximum: 512,
3133 minimum: 0
3134 },
3135 filter: {
3136 type: "*"
3137 },
3138 tolerance: {
3139 type: "number",
3140 "default": 0.375
3141 },
3142 cluster: {
3143 type: "boolean",
3144 "default": false
3145 },
3146 clusterRadius: {
3147 type: "number",
3148 "default": 50,
3149 minimum: 0
3150 },
3151 clusterMaxZoom: {
3152 type: "number"
3153 },
3154 clusterMinPoints: {
3155 type: "number"
3156 },
3157 clusterProperties: {
3158 type: "*"
3159 },
3160 lineMetrics: {
3161 type: "boolean",
3162 "default": false
3163 },
3164 generateId: {
3165 type: "boolean",
3166 "default": false
3167 },
3168 promoteId: {
3169 type: "promoteId"
3170 }
3171};
3172var source_video = {
3173 type: {
3174 required: true,
3175 type: "enum",
3176 values: {
3177 video: {
3178 }
3179 }
3180 },
3181 urls: {
3182 required: true,
3183 type: "array",
3184 value: "string"
3185 },
3186 coordinates: {
3187 required: true,
3188 type: "array",
3189 length: 4,
3190 value: {
3191 type: "array",
3192 length: 2,
3193 value: "number"
3194 }
3195 }
3196};
3197var source_image = {
3198 type: {
3199 required: true,
3200 type: "enum",
3201 values: {
3202 image: {
3203 }
3204 }
3205 },
3206 url: {
3207 required: true,
3208 type: "string"
3209 },
3210 coordinates: {
3211 required: true,
3212 type: "array",
3213 length: 4,
3214 value: {
3215 type: "array",
3216 length: 2,
3217 value: "number"
3218 }
3219 }
3220};
3221var layer = {
3222 id: {
3223 type: "string",
3224 required: true
3225 },
3226 type: {
3227 type: "enum",
3228 values: {
3229 fill: {
3230 },
3231 line: {
3232 },
3233 symbol: {
3234 },
3235 circle: {
3236 },
3237 heatmap: {
3238 },
3239 "fill-extrusion": {
3240 },
3241 raster: {
3242 },
3243 hillshade: {
3244 },
3245 background: {
3246 }
3247 },
3248 required: true
3249 },
3250 metadata: {
3251 type: "*"
3252 },
3253 source: {
3254 type: "string"
3255 },
3256 "source-layer": {
3257 type: "string"
3258 },
3259 minzoom: {
3260 type: "number",
3261 minimum: 0,
3262 maximum: 24
3263 },
3264 maxzoom: {
3265 type: "number",
3266 minimum: 0,
3267 maximum: 24
3268 },
3269 filter: {
3270 type: "filter"
3271 },
3272 layout: {
3273 type: "layout"
3274 },
3275 paint: {
3276 type: "paint"
3277 }
3278};
3279var layout$7 = [
3280 "layout_fill",
3281 "layout_line",
3282 "layout_circle",
3283 "layout_heatmap",
3284 "layout_fill-extrusion",
3285 "layout_symbol",
3286 "layout_raster",
3287 "layout_hillshade",
3288 "layout_background"
3289];
3290var layout_background = {
3291 visibility: {
3292 type: "enum",
3293 values: {
3294 visible: {
3295 },
3296 none: {
3297 }
3298 },
3299 "default": "visible",
3300 "property-type": "constant"
3301 }
3302};
3303var layout_fill = {
3304 "fill-sort-key": {
3305 type: "number",
3306 expression: {
3307 interpolated: false,
3308 parameters: [
3309 "zoom",
3310 "feature"
3311 ]
3312 },
3313 "property-type": "data-driven"
3314 },
3315 visibility: {
3316 type: "enum",
3317 values: {
3318 visible: {
3319 },
3320 none: {
3321 }
3322 },
3323 "default": "visible",
3324 "property-type": "constant"
3325 }
3326};
3327var layout_circle = {
3328 "circle-sort-key": {
3329 type: "number",
3330 expression: {
3331 interpolated: false,
3332 parameters: [
3333 "zoom",
3334 "feature"
3335 ]
3336 },
3337 "property-type": "data-driven"
3338 },
3339 visibility: {
3340 type: "enum",
3341 values: {
3342 visible: {
3343 },
3344 none: {
3345 }
3346 },
3347 "default": "visible",
3348 "property-type": "constant"
3349 }
3350};
3351var layout_heatmap = {
3352 visibility: {
3353 type: "enum",
3354 values: {
3355 visible: {
3356 },
3357 none: {
3358 }
3359 },
3360 "default": "visible",
3361 "property-type": "constant"
3362 }
3363};
3364var layout_line = {
3365 "line-cap": {
3366 type: "enum",
3367 values: {
3368 butt: {
3369 },
3370 round: {
3371 },
3372 square: {
3373 }
3374 },
3375 "default": "butt",
3376 expression: {
3377 interpolated: false,
3378 parameters: [
3379 "zoom"
3380 ]
3381 },
3382 "property-type": "data-constant"
3383 },
3384 "line-join": {
3385 type: "enum",
3386 values: {
3387 bevel: {
3388 },
3389 round: {
3390 },
3391 miter: {
3392 }
3393 },
3394 "default": "miter",
3395 expression: {
3396 interpolated: false,
3397 parameters: [
3398 "zoom",
3399 "feature"
3400 ]
3401 },
3402 "property-type": "data-driven"
3403 },
3404 "line-miter-limit": {
3405 type: "number",
3406 "default": 2,
3407 requires: [
3408 {
3409 "line-join": "miter"
3410 }
3411 ],
3412 expression: {
3413 interpolated: true,
3414 parameters: [
3415 "zoom"
3416 ]
3417 },
3418 "property-type": "data-constant"
3419 },
3420 "line-round-limit": {
3421 type: "number",
3422 "default": 1.05,
3423 requires: [
3424 {
3425 "line-join": "round"
3426 }
3427 ],
3428 expression: {
3429 interpolated: true,
3430 parameters: [
3431 "zoom"
3432 ]
3433 },
3434 "property-type": "data-constant"
3435 },
3436 "line-sort-key": {
3437 type: "number",
3438 expression: {
3439 interpolated: false,
3440 parameters: [
3441 "zoom",
3442 "feature"
3443 ]
3444 },
3445 "property-type": "data-driven"
3446 },
3447 visibility: {
3448 type: "enum",
3449 values: {
3450 visible: {
3451 },
3452 none: {
3453 }
3454 },
3455 "default": "visible",
3456 "property-type": "constant"
3457 }
3458};
3459var layout_symbol = {
3460 "symbol-placement": {
3461 type: "enum",
3462 values: {
3463 point: {
3464 },
3465 line: {
3466 },
3467 "line-center": {
3468 }
3469 },
3470 "default": "point",
3471 expression: {
3472 interpolated: false,
3473 parameters: [
3474 "zoom"
3475 ]
3476 },
3477 "property-type": "data-constant"
3478 },
3479 "symbol-spacing": {
3480 type: "number",
3481 "default": 250,
3482 minimum: 1,
3483 units: "pixels",
3484 requires: [
3485 {
3486 "symbol-placement": "line"
3487 }
3488 ],
3489 expression: {
3490 interpolated: true,
3491 parameters: [
3492 "zoom"
3493 ]
3494 },
3495 "property-type": "data-constant"
3496 },
3497 "symbol-avoid-edges": {
3498 type: "boolean",
3499 "default": false,
3500 expression: {
3501 interpolated: false,
3502 parameters: [
3503 "zoom"
3504 ]
3505 },
3506 "property-type": "data-constant"
3507 },
3508 "symbol-sort-key": {
3509 type: "number",
3510 expression: {
3511 interpolated: false,
3512 parameters: [
3513 "zoom",
3514 "feature"
3515 ]
3516 },
3517 "property-type": "data-driven"
3518 },
3519 "symbol-z-order": {
3520 type: "enum",
3521 values: {
3522 auto: {
3523 },
3524 "viewport-y": {
3525 },
3526 source: {
3527 }
3528 },
3529 "default": "auto",
3530 expression: {
3531 interpolated: false,
3532 parameters: [
3533 "zoom"
3534 ]
3535 },
3536 "property-type": "data-constant"
3537 },
3538 "icon-allow-overlap": {
3539 type: "boolean",
3540 "default": false,
3541 requires: [
3542 "icon-image",
3543 {
3544 "!": "icon-overlap"
3545 }
3546 ],
3547 expression: {
3548 interpolated: false,
3549 parameters: [
3550 "zoom"
3551 ]
3552 },
3553 "property-type": "data-constant"
3554 },
3555 "icon-overlap": {
3556 type: "enum",
3557 values: {
3558 never: {
3559 },
3560 always: {
3561 },
3562 cooperative: {
3563 }
3564 },
3565 requires: [
3566 "icon-image"
3567 ],
3568 expression: {
3569 interpolated: false,
3570 parameters: [
3571 "zoom"
3572 ]
3573 },
3574 "property-type": "data-constant"
3575 },
3576 "icon-ignore-placement": {
3577 type: "boolean",
3578 "default": false,
3579 requires: [
3580 "icon-image"
3581 ],
3582 expression: {
3583 interpolated: false,
3584 parameters: [
3585 "zoom"
3586 ]
3587 },
3588 "property-type": "data-constant"
3589 },
3590 "icon-optional": {
3591 type: "boolean",
3592 "default": false,
3593 requires: [
3594 "icon-image",
3595 "text-field"
3596 ],
3597 expression: {
3598 interpolated: false,
3599 parameters: [
3600 "zoom"
3601 ]
3602 },
3603 "property-type": "data-constant"
3604 },
3605 "icon-rotation-alignment": {
3606 type: "enum",
3607 values: {
3608 map: {
3609 },
3610 viewport: {
3611 },
3612 auto: {
3613 }
3614 },
3615 "default": "auto",
3616 requires: [
3617 "icon-image"
3618 ],
3619 expression: {
3620 interpolated: false,
3621 parameters: [
3622 "zoom"
3623 ]
3624 },
3625 "property-type": "data-constant"
3626 },
3627 "icon-size": {
3628 type: "number",
3629 "default": 1,
3630 minimum: 0,
3631 units: "factor of the original icon size",
3632 requires: [
3633 "icon-image"
3634 ],
3635 expression: {
3636 interpolated: true,
3637 parameters: [
3638 "zoom",
3639 "feature"
3640 ]
3641 },
3642 "property-type": "data-driven"
3643 },
3644 "icon-text-fit": {
3645 type: "enum",
3646 values: {
3647 none: {
3648 },
3649 width: {
3650 },
3651 height: {
3652 },
3653 both: {
3654 }
3655 },
3656 "default": "none",
3657 requires: [
3658 "icon-image",
3659 "text-field"
3660 ],
3661 expression: {
3662 interpolated: false,
3663 parameters: [
3664 "zoom"
3665 ]
3666 },
3667 "property-type": "data-constant"
3668 },
3669 "icon-text-fit-padding": {
3670 type: "array",
3671 value: "number",
3672 length: 4,
3673 "default": [
3674 0,
3675 0,
3676 0,
3677 0
3678 ],
3679 units: "pixels",
3680 requires: [
3681 "icon-image",
3682 "text-field",
3683 {
3684 "icon-text-fit": [
3685 "both",
3686 "width",
3687 "height"
3688 ]
3689 }
3690 ],
3691 expression: {
3692 interpolated: true,
3693 parameters: [
3694 "zoom"
3695 ]
3696 },
3697 "property-type": "data-constant"
3698 },
3699 "icon-image": {
3700 type: "resolvedImage",
3701 tokens: true,
3702 expression: {
3703 interpolated: false,
3704 parameters: [
3705 "zoom",
3706 "feature"
3707 ]
3708 },
3709 "property-type": "data-driven"
3710 },
3711 "icon-rotate": {
3712 type: "number",
3713 "default": 0,
3714 period: 360,
3715 units: "degrees",
3716 requires: [
3717 "icon-image"
3718 ],
3719 expression: {
3720 interpolated: true,
3721 parameters: [
3722 "zoom",
3723 "feature"
3724 ]
3725 },
3726 "property-type": "data-driven"
3727 },
3728 "icon-padding": {
3729 type: "number",
3730 "default": 2,
3731 minimum: 0,
3732 units: "pixels",
3733 requires: [
3734 "icon-image"
3735 ],
3736 expression: {
3737 interpolated: true,
3738 parameters: [
3739 "zoom"
3740 ]
3741 },
3742 "property-type": "data-constant"
3743 },
3744 "icon-keep-upright": {
3745 type: "boolean",
3746 "default": false,
3747 requires: [
3748 "icon-image",
3749 {
3750 "icon-rotation-alignment": "map"
3751 },
3752 {
3753 "symbol-placement": [
3754 "line",
3755 "line-center"
3756 ]
3757 }
3758 ],
3759 expression: {
3760 interpolated: false,
3761 parameters: [
3762 "zoom"
3763 ]
3764 },
3765 "property-type": "data-constant"
3766 },
3767 "icon-offset": {
3768 type: "array",
3769 value: "number",
3770 length: 2,
3771 "default": [
3772 0,
3773 0
3774 ],
3775 requires: [
3776 "icon-image"
3777 ],
3778 expression: {
3779 interpolated: true,
3780 parameters: [
3781 "zoom",
3782 "feature"
3783 ]
3784 },
3785 "property-type": "data-driven"
3786 },
3787 "icon-anchor": {
3788 type: "enum",
3789 values: {
3790 center: {
3791 },
3792 left: {
3793 },
3794 right: {
3795 },
3796 top: {
3797 },
3798 bottom: {
3799 },
3800 "top-left": {
3801 },
3802 "top-right": {
3803 },
3804 "bottom-left": {
3805 },
3806 "bottom-right": {
3807 }
3808 },
3809 "default": "center",
3810 requires: [
3811 "icon-image"
3812 ],
3813 expression: {
3814 interpolated: false,
3815 parameters: [
3816 "zoom",
3817 "feature"
3818 ]
3819 },
3820 "property-type": "data-driven"
3821 },
3822 "icon-pitch-alignment": {
3823 type: "enum",
3824 values: {
3825 map: {
3826 },
3827 viewport: {
3828 },
3829 auto: {
3830 }
3831 },
3832 "default": "auto",
3833 requires: [
3834 "icon-image"
3835 ],
3836 expression: {
3837 interpolated: false,
3838 parameters: [
3839 "zoom"
3840 ]
3841 },
3842 "property-type": "data-constant"
3843 },
3844 "text-pitch-alignment": {
3845 type: "enum",
3846 values: {
3847 map: {
3848 },
3849 viewport: {
3850 },
3851 auto: {
3852 }
3853 },
3854 "default": "auto",
3855 requires: [
3856 "text-field"
3857 ],
3858 expression: {
3859 interpolated: false,
3860 parameters: [
3861 "zoom"
3862 ]
3863 },
3864 "property-type": "data-constant"
3865 },
3866 "text-rotation-alignment": {
3867 type: "enum",
3868 values: {
3869 map: {
3870 },
3871 viewport: {
3872 },
3873 "viewport-glyph": {
3874 },
3875 auto: {
3876 }
3877 },
3878 "default": "auto",
3879 requires: [
3880 "text-field"
3881 ],
3882 expression: {
3883 interpolated: false,
3884 parameters: [
3885 "zoom"
3886 ]
3887 },
3888 "property-type": "data-constant"
3889 },
3890 "text-field": {
3891 type: "formatted",
3892 "default": "",
3893 tokens: true,
3894 expression: {
3895 interpolated: false,
3896 parameters: [
3897 "zoom",
3898 "feature"
3899 ]
3900 },
3901 "property-type": "data-driven"
3902 },
3903 "text-font": {
3904 type: "array",
3905 value: "string",
3906 "default": [
3907 "Open Sans Regular",
3908 "Arial Unicode MS Regular"
3909 ],
3910 requires: [
3911 "text-field"
3912 ],
3913 expression: {
3914 interpolated: false,
3915 parameters: [
3916 "zoom",
3917 "feature"
3918 ]
3919 },
3920 "property-type": "data-driven"
3921 },
3922 "text-size": {
3923 type: "number",
3924 "default": 16,
3925 minimum: 0,
3926 units: "pixels",
3927 requires: [
3928 "text-field"
3929 ],
3930 expression: {
3931 interpolated: true,
3932 parameters: [
3933 "zoom",
3934 "feature"
3935 ]
3936 },
3937 "property-type": "data-driven"
3938 },
3939 "text-max-width": {
3940 type: "number",
3941 "default": 10,
3942 minimum: 0,
3943 units: "ems",
3944 requires: [
3945 "text-field"
3946 ],
3947 expression: {
3948 interpolated: true,
3949 parameters: [
3950 "zoom",
3951 "feature"
3952 ]
3953 },
3954 "property-type": "data-driven"
3955 },
3956 "text-line-height": {
3957 type: "number",
3958 "default": 1.2,
3959 units: "ems",
3960 requires: [
3961 "text-field"
3962 ],
3963 expression: {
3964 interpolated: true,
3965 parameters: [
3966 "zoom"
3967 ]
3968 },
3969 "property-type": "data-constant"
3970 },
3971 "text-letter-spacing": {
3972 type: "number",
3973 "default": 0,
3974 units: "ems",
3975 requires: [
3976 "text-field"
3977 ],
3978 expression: {
3979 interpolated: true,
3980 parameters: [
3981 "zoom",
3982 "feature"
3983 ]
3984 },
3985 "property-type": "data-driven"
3986 },
3987 "text-justify": {
3988 type: "enum",
3989 values: {
3990 auto: {
3991 },
3992 left: {
3993 },
3994 center: {
3995 },
3996 right: {
3997 }
3998 },
3999 "default": "center",
4000 requires: [
4001 "text-field"
4002 ],
4003 expression: {
4004 interpolated: false,
4005 parameters: [
4006 "zoom",
4007 "feature"
4008 ]
4009 },
4010 "property-type": "data-driven"
4011 },
4012 "text-radial-offset": {
4013 type: "number",
4014 units: "ems",
4015 "default": 0,
4016 requires: [
4017 "text-field"
4018 ],
4019 "property-type": "data-driven",
4020 expression: {
4021 interpolated: true,
4022 parameters: [
4023 "zoom",
4024 "feature"
4025 ]
4026 }
4027 },
4028 "text-variable-anchor": {
4029 type: "array",
4030 value: "enum",
4031 values: {
4032 center: {
4033 },
4034 left: {
4035 },
4036 right: {
4037 },
4038 top: {
4039 },
4040 bottom: {
4041 },
4042 "top-left": {
4043 },
4044 "top-right": {
4045 },
4046 "bottom-left": {
4047 },
4048 "bottom-right": {
4049 }
4050 },
4051 requires: [
4052 "text-field",
4053 {
4054 "symbol-placement": [
4055 "point"
4056 ]
4057 }
4058 ],
4059 expression: {
4060 interpolated: false,
4061 parameters: [
4062 "zoom"
4063 ]
4064 },
4065 "property-type": "data-constant"
4066 },
4067 "text-anchor": {
4068 type: "enum",
4069 values: {
4070 center: {
4071 },
4072 left: {
4073 },
4074 right: {
4075 },
4076 top: {
4077 },
4078 bottom: {
4079 },
4080 "top-left": {
4081 },
4082 "top-right": {
4083 },
4084 "bottom-left": {
4085 },
4086 "bottom-right": {
4087 }
4088 },
4089 "default": "center",
4090 requires: [
4091 "text-field",
4092 {
4093 "!": "text-variable-anchor"
4094 }
4095 ],
4096 expression: {
4097 interpolated: false,
4098 parameters: [
4099 "zoom",
4100 "feature"
4101 ]
4102 },
4103 "property-type": "data-driven"
4104 },
4105 "text-max-angle": {
4106 type: "number",
4107 "default": 45,
4108 units: "degrees",
4109 requires: [
4110 "text-field",
4111 {
4112 "symbol-placement": [
4113 "line",
4114 "line-center"
4115 ]
4116 }
4117 ],
4118 expression: {
4119 interpolated: true,
4120 parameters: [
4121 "zoom"
4122 ]
4123 },
4124 "property-type": "data-constant"
4125 },
4126 "text-writing-mode": {
4127 type: "array",
4128 value: "enum",
4129 values: {
4130 horizontal: {
4131 },
4132 vertical: {
4133 }
4134 },
4135 requires: [
4136 "text-field",
4137 {
4138 "symbol-placement": [
4139 "point"
4140 ]
4141 }
4142 ],
4143 expression: {
4144 interpolated: false,
4145 parameters: [
4146 "zoom"
4147 ]
4148 },
4149 "property-type": "data-constant"
4150 },
4151 "text-rotate": {
4152 type: "number",
4153 "default": 0,
4154 period: 360,
4155 units: "degrees",
4156 requires: [
4157 "text-field"
4158 ],
4159 expression: {
4160 interpolated: true,
4161 parameters: [
4162 "zoom",
4163 "feature"
4164 ]
4165 },
4166 "property-type": "data-driven"
4167 },
4168 "text-padding": {
4169 type: "number",
4170 "default": 2,
4171 minimum: 0,
4172 units: "pixels",
4173 requires: [
4174 "text-field"
4175 ],
4176 expression: {
4177 interpolated: true,
4178 parameters: [
4179 "zoom"
4180 ]
4181 },
4182 "property-type": "data-constant"
4183 },
4184 "text-keep-upright": {
4185 type: "boolean",
4186 "default": true,
4187 requires: [
4188 "text-field",
4189 {
4190 "text-rotation-alignment": "map"
4191 },
4192 {
4193 "symbol-placement": [
4194 "line",
4195 "line-center"
4196 ]
4197 }
4198 ],
4199 expression: {
4200 interpolated: false,
4201 parameters: [
4202 "zoom"
4203 ]
4204 },
4205 "property-type": "data-constant"
4206 },
4207 "text-transform": {
4208 type: "enum",
4209 values: {
4210 none: {
4211 },
4212 uppercase: {
4213 },
4214 lowercase: {
4215 }
4216 },
4217 "default": "none",
4218 requires: [
4219 "text-field"
4220 ],
4221 expression: {
4222 interpolated: false,
4223 parameters: [
4224 "zoom",
4225 "feature"
4226 ]
4227 },
4228 "property-type": "data-driven"
4229 },
4230 "text-offset": {
4231 type: "array",
4232 value: "number",
4233 units: "ems",
4234 length: 2,
4235 "default": [
4236 0,
4237 0
4238 ],
4239 requires: [
4240 "text-field",
4241 {
4242 "!": "text-radial-offset"
4243 }
4244 ],
4245 expression: {
4246 interpolated: true,
4247 parameters: [
4248 "zoom",
4249 "feature"
4250 ]
4251 },
4252 "property-type": "data-driven"
4253 },
4254 "text-allow-overlap": {
4255 type: "boolean",
4256 "default": false,
4257 requires: [
4258 "text-field",
4259 {
4260 "!": "text-overlap"
4261 }
4262 ],
4263 expression: {
4264 interpolated: false,
4265 parameters: [
4266 "zoom"
4267 ]
4268 },
4269 "property-type": "data-constant"
4270 },
4271 "text-overlap": {
4272 type: "enum",
4273 values: {
4274 never: {
4275 },
4276 always: {
4277 },
4278 cooperative: {
4279 }
4280 },
4281 requires: [
4282 "text-field"
4283 ],
4284 expression: {
4285 interpolated: false,
4286 parameters: [
4287 "zoom"
4288 ]
4289 },
4290 "property-type": "data-constant"
4291 },
4292 "text-ignore-placement": {
4293 type: "boolean",
4294 "default": false,
4295 requires: [
4296 "text-field"
4297 ],
4298 expression: {
4299 interpolated: false,
4300 parameters: [
4301 "zoom"
4302 ]
4303 },
4304 "property-type": "data-constant"
4305 },
4306 "text-optional": {
4307 type: "boolean",
4308 "default": false,
4309 requires: [
4310 "text-field",
4311 "icon-image"
4312 ],
4313 expression: {
4314 interpolated: false,
4315 parameters: [
4316 "zoom"
4317 ]
4318 },
4319 "property-type": "data-constant"
4320 },
4321 visibility: {
4322 type: "enum",
4323 values: {
4324 visible: {
4325 },
4326 none: {
4327 }
4328 },
4329 "default": "visible",
4330 "property-type": "constant"
4331 }
4332};
4333var layout_raster = {
4334 visibility: {
4335 type: "enum",
4336 values: {
4337 visible: {
4338 },
4339 none: {
4340 }
4341 },
4342 "default": "visible",
4343 "property-type": "constant"
4344 }
4345};
4346var layout_hillshade = {
4347 visibility: {
4348 type: "enum",
4349 values: {
4350 visible: {
4351 },
4352 none: {
4353 }
4354 },
4355 "default": "visible",
4356 "property-type": "constant"
4357 }
4358};
4359var filter = {
4360 type: "array",
4361 value: "*"
4362};
4363var filter_operator = {
4364 type: "enum",
4365 values: {
4366 "==": {
4367 },
4368 "!=": {
4369 },
4370 ">": {
4371 },
4372 ">=": {
4373 },
4374 "<": {
4375 },
4376 "<=": {
4377 },
4378 "in": {
4379 },
4380 "!in": {
4381 },
4382 all: {
4383 },
4384 any: {
4385 },
4386 none: {
4387 },
4388 has: {
4389 },
4390 "!has": {
4391 },
4392 within: {
4393 }
4394 }
4395};
4396var geometry_type = {
4397 type: "enum",
4398 values: {
4399 Point: {
4400 },
4401 LineString: {
4402 },
4403 Polygon: {
4404 }
4405 }
4406};
4407var function_stop = {
4408 type: "array",
4409 minimum: 0,
4410 maximum: 24,
4411 value: [
4412 "number",
4413 "color"
4414 ],
4415 length: 2
4416};
4417var expression = {
4418 type: "array",
4419 value: "*",
4420 minimum: 1
4421};
4422var light = {
4423 anchor: {
4424 type: "enum",
4425 "default": "viewport",
4426 values: {
4427 map: {
4428 },
4429 viewport: {
4430 }
4431 },
4432 "property-type": "data-constant",
4433 transition: false,
4434 expression: {
4435 interpolated: false,
4436 parameters: [
4437 "zoom"
4438 ]
4439 }
4440 },
4441 position: {
4442 type: "array",
4443 "default": [
4444 1.15,
4445 210,
4446 30
4447 ],
4448 length: 3,
4449 value: "number",
4450 "property-type": "data-constant",
4451 transition: true,
4452 expression: {
4453 interpolated: true,
4454 parameters: [
4455 "zoom"
4456 ]
4457 }
4458 },
4459 color: {
4460 type: "color",
4461 "property-type": "data-constant",
4462 "default": "#ffffff",
4463 expression: {
4464 interpolated: true,
4465 parameters: [
4466 "zoom"
4467 ]
4468 },
4469 transition: true
4470 },
4471 intensity: {
4472 type: "number",
4473 "property-type": "data-constant",
4474 "default": 0.5,
4475 minimum: 0,
4476 maximum: 1,
4477 expression: {
4478 interpolated: true,
4479 parameters: [
4480 "zoom"
4481 ]
4482 },
4483 transition: true
4484 }
4485};
4486var paint$9 = [
4487 "paint_fill",
4488 "paint_line",
4489 "paint_circle",
4490 "paint_heatmap",
4491 "paint_fill-extrusion",
4492 "paint_symbol",
4493 "paint_raster",
4494 "paint_hillshade",
4495 "paint_background"
4496];
4497var paint_fill = {
4498 "fill-antialias": {
4499 type: "boolean",
4500 "default": true,
4501 expression: {
4502 interpolated: false,
4503 parameters: [
4504 "zoom"
4505 ]
4506 },
4507 "property-type": "data-constant"
4508 },
4509 "fill-opacity": {
4510 type: "number",
4511 "default": 1,
4512 minimum: 0,
4513 maximum: 1,
4514 transition: true,
4515 expression: {
4516 interpolated: true,
4517 parameters: [
4518 "zoom",
4519 "feature",
4520 "feature-state"
4521 ]
4522 },
4523 "property-type": "data-driven"
4524 },
4525 "fill-color": {
4526 type: "color",
4527 "default": "#000000",
4528 transition: true,
4529 requires: [
4530 {
4531 "!": "fill-pattern"
4532 }
4533 ],
4534 expression: {
4535 interpolated: true,
4536 parameters: [
4537 "zoom",
4538 "feature",
4539 "feature-state"
4540 ]
4541 },
4542 "property-type": "data-driven"
4543 },
4544 "fill-outline-color": {
4545 type: "color",
4546 transition: true,
4547 requires: [
4548 {
4549 "!": "fill-pattern"
4550 },
4551 {
4552 "fill-antialias": true
4553 }
4554 ],
4555 expression: {
4556 interpolated: true,
4557 parameters: [
4558 "zoom",
4559 "feature",
4560 "feature-state"
4561 ]
4562 },
4563 "property-type": "data-driven"
4564 },
4565 "fill-translate": {
4566 type: "array",
4567 value: "number",
4568 length: 2,
4569 "default": [
4570 0,
4571 0
4572 ],
4573 transition: true,
4574 units: "pixels",
4575 expression: {
4576 interpolated: true,
4577 parameters: [
4578 "zoom"
4579 ]
4580 },
4581 "property-type": "data-constant"
4582 },
4583 "fill-translate-anchor": {
4584 type: "enum",
4585 values: {
4586 map: {
4587 },
4588 viewport: {
4589 }
4590 },
4591 "default": "map",
4592 requires: [
4593 "fill-translate"
4594 ],
4595 expression: {
4596 interpolated: false,
4597 parameters: [
4598 "zoom"
4599 ]
4600 },
4601 "property-type": "data-constant"
4602 },
4603 "fill-pattern": {
4604 type: "resolvedImage",
4605 transition: true,
4606 expression: {
4607 interpolated: false,
4608 parameters: [
4609 "zoom",
4610 "feature"
4611 ]
4612 },
4613 "property-type": "cross-faded-data-driven"
4614 }
4615};
4616var paint_line = {
4617 "line-opacity": {
4618 type: "number",
4619 "default": 1,
4620 minimum: 0,
4621 maximum: 1,
4622 transition: true,
4623 expression: {
4624 interpolated: true,
4625 parameters: [
4626 "zoom",
4627 "feature",
4628 "feature-state"
4629 ]
4630 },
4631 "property-type": "data-driven"
4632 },
4633 "line-color": {
4634 type: "color",
4635 "default": "#000000",
4636 transition: true,
4637 requires: [
4638 {
4639 "!": "line-pattern"
4640 }
4641 ],
4642 expression: {
4643 interpolated: true,
4644 parameters: [
4645 "zoom",
4646 "feature",
4647 "feature-state"
4648 ]
4649 },
4650 "property-type": "data-driven"
4651 },
4652 "line-translate": {
4653 type: "array",
4654 value: "number",
4655 length: 2,
4656 "default": [
4657 0,
4658 0
4659 ],
4660 transition: true,
4661 units: "pixels",
4662 expression: {
4663 interpolated: true,
4664 parameters: [
4665 "zoom"
4666 ]
4667 },
4668 "property-type": "data-constant"
4669 },
4670 "line-translate-anchor": {
4671 type: "enum",
4672 values: {
4673 map: {
4674 },
4675 viewport: {
4676 }
4677 },
4678 "default": "map",
4679 requires: [
4680 "line-translate"
4681 ],
4682 expression: {
4683 interpolated: false,
4684 parameters: [
4685 "zoom"
4686 ]
4687 },
4688 "property-type": "data-constant"
4689 },
4690 "line-width": {
4691 type: "number",
4692 "default": 1,
4693 minimum: 0,
4694 transition: true,
4695 units: "pixels",
4696 expression: {
4697 interpolated: true,
4698 parameters: [
4699 "zoom",
4700 "feature",
4701 "feature-state"
4702 ]
4703 },
4704 "property-type": "data-driven"
4705 },
4706 "line-gap-width": {
4707 type: "number",
4708 "default": 0,
4709 minimum: 0,
4710 transition: true,
4711 units: "pixels",
4712 expression: {
4713 interpolated: true,
4714 parameters: [
4715 "zoom",
4716 "feature",
4717 "feature-state"
4718 ]
4719 },
4720 "property-type": "data-driven"
4721 },
4722 "line-offset": {
4723 type: "number",
4724 "default": 0,
4725 transition: true,
4726 units: "pixels",
4727 expression: {
4728 interpolated: true,
4729 parameters: [
4730 "zoom",
4731 "feature",
4732 "feature-state"
4733 ]
4734 },
4735 "property-type": "data-driven"
4736 },
4737 "line-blur": {
4738 type: "number",
4739 "default": 0,
4740 minimum: 0,
4741 transition: true,
4742 units: "pixels",
4743 expression: {
4744 interpolated: true,
4745 parameters: [
4746 "zoom",
4747 "feature",
4748 "feature-state"
4749 ]
4750 },
4751 "property-type": "data-driven"
4752 },
4753 "line-dasharray": {
4754 type: "array",
4755 value: "number",
4756 minimum: 0,
4757 transition: true,
4758 units: "line widths",
4759 requires: [
4760 {
4761 "!": "line-pattern"
4762 }
4763 ],
4764 expression: {
4765 interpolated: false,
4766 parameters: [
4767 "zoom"
4768 ]
4769 },
4770 "property-type": "cross-faded"
4771 },
4772 "line-pattern": {
4773 type: "resolvedImage",
4774 transition: true,
4775 expression: {
4776 interpolated: false,
4777 parameters: [
4778 "zoom",
4779 "feature"
4780 ]
4781 },
4782 "property-type": "cross-faded-data-driven"
4783 },
4784 "line-gradient": {
4785 type: "color",
4786 transition: false,
4787 requires: [
4788 {
4789 "!": "line-dasharray"
4790 },
4791 {
4792 "!": "line-pattern"
4793 },
4794 {
4795 source: "geojson",
4796 has: {
4797 lineMetrics: true
4798 }
4799 }
4800 ],
4801 expression: {
4802 interpolated: true,
4803 parameters: [
4804 "line-progress"
4805 ]
4806 },
4807 "property-type": "color-ramp"
4808 }
4809};
4810var paint_circle = {
4811 "circle-radius": {
4812 type: "number",
4813 "default": 5,
4814 minimum: 0,
4815 transition: true,
4816 units: "pixels",
4817 expression: {
4818 interpolated: true,
4819 parameters: [
4820 "zoom",
4821 "feature",
4822 "feature-state"
4823 ]
4824 },
4825 "property-type": "data-driven"
4826 },
4827 "circle-color": {
4828 type: "color",
4829 "default": "#000000",
4830 transition: true,
4831 expression: {
4832 interpolated: true,
4833 parameters: [
4834 "zoom",
4835 "feature",
4836 "feature-state"
4837 ]
4838 },
4839 "property-type": "data-driven"
4840 },
4841 "circle-blur": {
4842 type: "number",
4843 "default": 0,
4844 transition: true,
4845 expression: {
4846 interpolated: true,
4847 parameters: [
4848 "zoom",
4849 "feature",
4850 "feature-state"
4851 ]
4852 },
4853 "property-type": "data-driven"
4854 },
4855 "circle-opacity": {
4856 type: "number",
4857 "default": 1,
4858 minimum: 0,
4859 maximum: 1,
4860 transition: true,
4861 expression: {
4862 interpolated: true,
4863 parameters: [
4864 "zoom",
4865 "feature",
4866 "feature-state"
4867 ]
4868 },
4869 "property-type": "data-driven"
4870 },
4871 "circle-translate": {
4872 type: "array",
4873 value: "number",
4874 length: 2,
4875 "default": [
4876 0,
4877 0
4878 ],
4879 transition: true,
4880 units: "pixels",
4881 expression: {
4882 interpolated: true,
4883 parameters: [
4884 "zoom"
4885 ]
4886 },
4887 "property-type": "data-constant"
4888 },
4889 "circle-translate-anchor": {
4890 type: "enum",
4891 values: {
4892 map: {
4893 },
4894 viewport: {
4895 }
4896 },
4897 "default": "map",
4898 requires: [
4899 "circle-translate"
4900 ],
4901 expression: {
4902 interpolated: false,
4903 parameters: [
4904 "zoom"
4905 ]
4906 },
4907 "property-type": "data-constant"
4908 },
4909 "circle-pitch-scale": {
4910 type: "enum",
4911 values: {
4912 map: {
4913 },
4914 viewport: {
4915 }
4916 },
4917 "default": "map",
4918 expression: {
4919 interpolated: false,
4920 parameters: [
4921 "zoom"
4922 ]
4923 },
4924 "property-type": "data-constant"
4925 },
4926 "circle-pitch-alignment": {
4927 type: "enum",
4928 values: {
4929 map: {
4930 },
4931 viewport: {
4932 }
4933 },
4934 "default": "viewport",
4935 expression: {
4936 interpolated: false,
4937 parameters: [
4938 "zoom"
4939 ]
4940 },
4941 "property-type": "data-constant"
4942 },
4943 "circle-stroke-width": {
4944 type: "number",
4945 "default": 0,
4946 minimum: 0,
4947 transition: true,
4948 units: "pixels",
4949 expression: {
4950 interpolated: true,
4951 parameters: [
4952 "zoom",
4953 "feature",
4954 "feature-state"
4955 ]
4956 },
4957 "property-type": "data-driven"
4958 },
4959 "circle-stroke-color": {
4960 type: "color",
4961 "default": "#000000",
4962 transition: true,
4963 expression: {
4964 interpolated: true,
4965 parameters: [
4966 "zoom",
4967 "feature",
4968 "feature-state"
4969 ]
4970 },
4971 "property-type": "data-driven"
4972 },
4973 "circle-stroke-opacity": {
4974 type: "number",
4975 "default": 1,
4976 minimum: 0,
4977 maximum: 1,
4978 transition: true,
4979 expression: {
4980 interpolated: true,
4981 parameters: [
4982 "zoom",
4983 "feature",
4984 "feature-state"
4985 ]
4986 },
4987 "property-type": "data-driven"
4988 }
4989};
4990var paint_heatmap = {
4991 "heatmap-radius": {
4992 type: "number",
4993 "default": 30,
4994 minimum: 1,
4995 transition: true,
4996 units: "pixels",
4997 expression: {
4998 interpolated: true,
4999 parameters: [
5000 "zoom",
5001 "feature",
5002 "feature-state"
5003 ]
5004 },
5005 "property-type": "data-driven"
5006 },
5007 "heatmap-weight": {
5008 type: "number",
5009 "default": 1,
5010 minimum: 0,
5011 transition: false,
5012 expression: {
5013 interpolated: true,
5014 parameters: [
5015 "zoom",
5016 "feature",
5017 "feature-state"
5018 ]
5019 },
5020 "property-type": "data-driven"
5021 },
5022 "heatmap-intensity": {
5023 type: "number",
5024 "default": 1,
5025 minimum: 0,
5026 transition: true,
5027 expression: {
5028 interpolated: true,
5029 parameters: [
5030 "zoom"
5031 ]
5032 },
5033 "property-type": "data-constant"
5034 },
5035 "heatmap-color": {
5036 type: "color",
5037 "default": [
5038 "interpolate",
5039 [
5040 "linear"
5041 ],
5042 [
5043 "heatmap-density"
5044 ],
5045 0,
5046 "rgba(0, 0, 255, 0)",
5047 0.1,
5048 "royalblue",
5049 0.3,
5050 "cyan",
5051 0.5,
5052 "lime",
5053 0.7,
5054 "yellow",
5055 1,
5056 "red"
5057 ],
5058 transition: false,
5059 expression: {
5060 interpolated: true,
5061 parameters: [
5062 "heatmap-density"
5063 ]
5064 },
5065 "property-type": "color-ramp"
5066 },
5067 "heatmap-opacity": {
5068 type: "number",
5069 "default": 1,
5070 minimum: 0,
5071 maximum: 1,
5072 transition: true,
5073 expression: {
5074 interpolated: true,
5075 parameters: [
5076 "zoom"
5077 ]
5078 },
5079 "property-type": "data-constant"
5080 }
5081};
5082var paint_symbol = {
5083 "icon-opacity": {
5084 type: "number",
5085 "default": 1,
5086 minimum: 0,
5087 maximum: 1,
5088 transition: true,
5089 requires: [
5090 "icon-image"
5091 ],
5092 expression: {
5093 interpolated: true,
5094 parameters: [
5095 "zoom",
5096 "feature",
5097 "feature-state"
5098 ]
5099 },
5100 "property-type": "data-driven"
5101 },
5102 "icon-color": {
5103 type: "color",
5104 "default": "#000000",
5105 transition: true,
5106 requires: [
5107 "icon-image"
5108 ],
5109 expression: {
5110 interpolated: true,
5111 parameters: [
5112 "zoom",
5113 "feature",
5114 "feature-state"
5115 ]
5116 },
5117 "property-type": "data-driven"
5118 },
5119 "icon-halo-color": {
5120 type: "color",
5121 "default": "rgba(0, 0, 0, 0)",
5122 transition: true,
5123 requires: [
5124 "icon-image"
5125 ],
5126 expression: {
5127 interpolated: true,
5128 parameters: [
5129 "zoom",
5130 "feature",
5131 "feature-state"
5132 ]
5133 },
5134 "property-type": "data-driven"
5135 },
5136 "icon-halo-width": {
5137 type: "number",
5138 "default": 0,
5139 minimum: 0,
5140 transition: true,
5141 units: "pixels",
5142 requires: [
5143 "icon-image"
5144 ],
5145 expression: {
5146 interpolated: true,
5147 parameters: [
5148 "zoom",
5149 "feature",
5150 "feature-state"
5151 ]
5152 },
5153 "property-type": "data-driven"
5154 },
5155 "icon-halo-blur": {
5156 type: "number",
5157 "default": 0,
5158 minimum: 0,
5159 transition: true,
5160 units: "pixels",
5161 requires: [
5162 "icon-image"
5163 ],
5164 expression: {
5165 interpolated: true,
5166 parameters: [
5167 "zoom",
5168 "feature",
5169 "feature-state"
5170 ]
5171 },
5172 "property-type": "data-driven"
5173 },
5174 "icon-translate": {
5175 type: "array",
5176 value: "number",
5177 length: 2,
5178 "default": [
5179 0,
5180 0
5181 ],
5182 transition: true,
5183 units: "pixels",
5184 requires: [
5185 "icon-image"
5186 ],
5187 expression: {
5188 interpolated: true,
5189 parameters: [
5190 "zoom"
5191 ]
5192 },
5193 "property-type": "data-constant"
5194 },
5195 "icon-translate-anchor": {
5196 type: "enum",
5197 values: {
5198 map: {
5199 },
5200 viewport: {
5201 }
5202 },
5203 "default": "map",
5204 requires: [
5205 "icon-image",
5206 "icon-translate"
5207 ],
5208 expression: {
5209 interpolated: false,
5210 parameters: [
5211 "zoom"
5212 ]
5213 },
5214 "property-type": "data-constant"
5215 },
5216 "text-opacity": {
5217 type: "number",
5218 "default": 1,
5219 minimum: 0,
5220 maximum: 1,
5221 transition: true,
5222 requires: [
5223 "text-field"
5224 ],
5225 expression: {
5226 interpolated: true,
5227 parameters: [
5228 "zoom",
5229 "feature",
5230 "feature-state"
5231 ]
5232 },
5233 "property-type": "data-driven"
5234 },
5235 "text-color": {
5236 type: "color",
5237 "default": "#000000",
5238 transition: true,
5239 overridable: true,
5240 requires: [
5241 "text-field"
5242 ],
5243 expression: {
5244 interpolated: true,
5245 parameters: [
5246 "zoom",
5247 "feature",
5248 "feature-state"
5249 ]
5250 },
5251 "property-type": "data-driven"
5252 },
5253 "text-halo-color": {
5254 type: "color",
5255 "default": "rgba(0, 0, 0, 0)",
5256 transition: true,
5257 requires: [
5258 "text-field"
5259 ],
5260 expression: {
5261 interpolated: true,
5262 parameters: [
5263 "zoom",
5264 "feature",
5265 "feature-state"
5266 ]
5267 },
5268 "property-type": "data-driven"
5269 },
5270 "text-halo-width": {
5271 type: "number",
5272 "default": 0,
5273 minimum: 0,
5274 transition: true,
5275 units: "pixels",
5276 requires: [
5277 "text-field"
5278 ],
5279 expression: {
5280 interpolated: true,
5281 parameters: [
5282 "zoom",
5283 "feature",
5284 "feature-state"
5285 ]
5286 },
5287 "property-type": "data-driven"
5288 },
5289 "text-halo-blur": {
5290 type: "number",
5291 "default": 0,
5292 minimum: 0,
5293 transition: true,
5294 units: "pixels",
5295 requires: [
5296 "text-field"
5297 ],
5298 expression: {
5299 interpolated: true,
5300 parameters: [
5301 "zoom",
5302 "feature",
5303 "feature-state"
5304 ]
5305 },
5306 "property-type": "data-driven"
5307 },
5308 "text-translate": {
5309 type: "array",
5310 value: "number",
5311 length: 2,
5312 "default": [
5313 0,
5314 0
5315 ],
5316 transition: true,
5317 units: "pixels",
5318 requires: [
5319 "text-field"
5320 ],
5321 expression: {
5322 interpolated: true,
5323 parameters: [
5324 "zoom"
5325 ]
5326 },
5327 "property-type": "data-constant"
5328 },
5329 "text-translate-anchor": {
5330 type: "enum",
5331 values: {
5332 map: {
5333 },
5334 viewport: {
5335 }
5336 },
5337 "default": "map",
5338 requires: [
5339 "text-field",
5340 "text-translate"
5341 ],
5342 expression: {
5343 interpolated: false,
5344 parameters: [
5345 "zoom"
5346 ]
5347 },
5348 "property-type": "data-constant"
5349 }
5350};
5351var paint_raster = {
5352 "raster-opacity": {
5353 type: "number",
5354 "default": 1,
5355 minimum: 0,
5356 maximum: 1,
5357 transition: true,
5358 expression: {
5359 interpolated: true,
5360 parameters: [
5361 "zoom"
5362 ]
5363 },
5364 "property-type": "data-constant"
5365 },
5366 "raster-hue-rotate": {
5367 type: "number",
5368 "default": 0,
5369 period: 360,
5370 transition: true,
5371 units: "degrees",
5372 expression: {
5373 interpolated: true,
5374 parameters: [
5375 "zoom"
5376 ]
5377 },
5378 "property-type": "data-constant"
5379 },
5380 "raster-brightness-min": {
5381 type: "number",
5382 "default": 0,
5383 minimum: 0,
5384 maximum: 1,
5385 transition: true,
5386 expression: {
5387 interpolated: true,
5388 parameters: [
5389 "zoom"
5390 ]
5391 },
5392 "property-type": "data-constant"
5393 },
5394 "raster-brightness-max": {
5395 type: "number",
5396 "default": 1,
5397 minimum: 0,
5398 maximum: 1,
5399 transition: true,
5400 expression: {
5401 interpolated: true,
5402 parameters: [
5403 "zoom"
5404 ]
5405 },
5406 "property-type": "data-constant"
5407 },
5408 "raster-saturation": {
5409 type: "number",
5410 "default": 0,
5411 minimum: -1,
5412 maximum: 1,
5413 transition: true,
5414 expression: {
5415 interpolated: true,
5416 parameters: [
5417 "zoom"
5418 ]
5419 },
5420 "property-type": "data-constant"
5421 },
5422 "raster-contrast": {
5423 type: "number",
5424 "default": 0,
5425 minimum: -1,
5426 maximum: 1,
5427 transition: true,
5428 expression: {
5429 interpolated: true,
5430 parameters: [
5431 "zoom"
5432 ]
5433 },
5434 "property-type": "data-constant"
5435 },
5436 "raster-resampling": {
5437 type: "enum",
5438 values: {
5439 linear: {
5440 },
5441 nearest: {
5442 }
5443 },
5444 "default": "linear",
5445 expression: {
5446 interpolated: false,
5447 parameters: [
5448 "zoom"
5449 ]
5450 },
5451 "property-type": "data-constant"
5452 },
5453 "raster-fade-duration": {
5454 type: "number",
5455 "default": 300,
5456 minimum: 0,
5457 transition: false,
5458 units: "milliseconds",
5459 expression: {
5460 interpolated: true,
5461 parameters: [
5462 "zoom"
5463 ]
5464 },
5465 "property-type": "data-constant"
5466 }
5467};
5468var paint_hillshade = {
5469 "hillshade-illumination-direction": {
5470 type: "number",
5471 "default": 335,
5472 minimum: 0,
5473 maximum: 359,
5474 transition: false,
5475 expression: {
5476 interpolated: true,
5477 parameters: [
5478 "zoom"
5479 ]
5480 },
5481 "property-type": "data-constant"
5482 },
5483 "hillshade-illumination-anchor": {
5484 type: "enum",
5485 values: {
5486 map: {
5487 },
5488 viewport: {
5489 }
5490 },
5491 "default": "viewport",
5492 expression: {
5493 interpolated: false,
5494 parameters: [
5495 "zoom"
5496 ]
5497 },
5498 "property-type": "data-constant"
5499 },
5500 "hillshade-exaggeration": {
5501 type: "number",
5502 "default": 0.5,
5503 minimum: 0,
5504 maximum: 1,
5505 transition: true,
5506 expression: {
5507 interpolated: true,
5508 parameters: [
5509 "zoom"
5510 ]
5511 },
5512 "property-type": "data-constant"
5513 },
5514 "hillshade-shadow-color": {
5515 type: "color",
5516 "default": "#000000",
5517 transition: true,
5518 expression: {
5519 interpolated: true,
5520 parameters: [
5521 "zoom"
5522 ]
5523 },
5524 "property-type": "data-constant"
5525 },
5526 "hillshade-highlight-color": {
5527 type: "color",
5528 "default": "#FFFFFF",
5529 transition: true,
5530 expression: {
5531 interpolated: true,
5532 parameters: [
5533 "zoom"
5534 ]
5535 },
5536 "property-type": "data-constant"
5537 },
5538 "hillshade-accent-color": {
5539 type: "color",
5540 "default": "#000000",
5541 transition: true,
5542 expression: {
5543 interpolated: true,
5544 parameters: [
5545 "zoom"
5546 ]
5547 },
5548 "property-type": "data-constant"
5549 }
5550};
5551var paint_background = {
5552 "background-color": {
5553 type: "color",
5554 "default": "#000000",
5555 transition: true,
5556 requires: [
5557 {
5558 "!": "background-pattern"
5559 }
5560 ],
5561 expression: {
5562 interpolated: true,
5563 parameters: [
5564 "zoom"
5565 ]
5566 },
5567 "property-type": "data-constant"
5568 },
5569 "background-pattern": {
5570 type: "resolvedImage",
5571 transition: true,
5572 expression: {
5573 interpolated: false,
5574 parameters: [
5575 "zoom"
5576 ]
5577 },
5578 "property-type": "cross-faded"
5579 },
5580 "background-opacity": {
5581 type: "number",
5582 "default": 1,
5583 minimum: 0,
5584 maximum: 1,
5585 transition: true,
5586 expression: {
5587 interpolated: true,
5588 parameters: [
5589 "zoom"
5590 ]
5591 },
5592 "property-type": "data-constant"
5593 }
5594};
5595var transition = {
5596 duration: {
5597 type: "number",
5598 "default": 300,
5599 minimum: 0,
5600 units: "milliseconds"
5601 },
5602 delay: {
5603 type: "number",
5604 "default": 0,
5605 minimum: 0,
5606 units: "milliseconds"
5607 }
5608};
5609var promoteId = {
5610 "*": {
5611 type: "string"
5612 }
5613};
5614var spec = {
5615 $version: $version,
5616 $root: $root,
5617 sources: sources,
5618 source: source,
5619 source_vector: source_vector,
5620 source_raster: source_raster,
5621 source_raster_dem: source_raster_dem,
5622 source_geojson: source_geojson,
5623 source_video: source_video,
5624 source_image: source_image,
5625 layer: layer,
5626 layout: layout$7,
5627 layout_background: layout_background,
5628 layout_fill: layout_fill,
5629 layout_circle: layout_circle,
5630 layout_heatmap: layout_heatmap,
5631 "layout_fill-extrusion": {
5632 visibility: {
5633 type: "enum",
5634 values: {
5635 visible: {
5636 },
5637 none: {
5638 }
5639 },
5640 "default": "visible",
5641 "property-type": "constant"
5642 }
5643},
5644 layout_line: layout_line,
5645 layout_symbol: layout_symbol,
5646 layout_raster: layout_raster,
5647 layout_hillshade: layout_hillshade,
5648 filter: filter,
5649 filter_operator: filter_operator,
5650 geometry_type: geometry_type,
5651 "function": {
5652 expression: {
5653 type: "expression"
5654 },
5655 stops: {
5656 type: "array",
5657 value: "function_stop"
5658 },
5659 base: {
5660 type: "number",
5661 "default": 1,
5662 minimum: 0
5663 },
5664 property: {
5665 type: "string",
5666 "default": "$zoom"
5667 },
5668 type: {
5669 type: "enum",
5670 values: {
5671 identity: {
5672 },
5673 exponential: {
5674 },
5675 interval: {
5676 },
5677 categorical: {
5678 }
5679 },
5680 "default": "exponential"
5681 },
5682 colorSpace: {
5683 type: "enum",
5684 values: {
5685 rgb: {
5686 },
5687 lab: {
5688 },
5689 hcl: {
5690 }
5691 },
5692 "default": "rgb"
5693 },
5694 "default": {
5695 type: "*",
5696 required: false
5697 }
5698},
5699 function_stop: function_stop,
5700 expression: expression,
5701 light: light,
5702 paint: paint$9,
5703 paint_fill: paint_fill,
5704 "paint_fill-extrusion": {
5705 "fill-extrusion-opacity": {
5706 type: "number",
5707 "default": 1,
5708 minimum: 0,
5709 maximum: 1,
5710 transition: true,
5711 expression: {
5712 interpolated: true,
5713 parameters: [
5714 "zoom"
5715 ]
5716 },
5717 "property-type": "data-constant"
5718 },
5719 "fill-extrusion-color": {
5720 type: "color",
5721 "default": "#000000",
5722 transition: true,
5723 requires: [
5724 {
5725 "!": "fill-extrusion-pattern"
5726 }
5727 ],
5728 expression: {
5729 interpolated: true,
5730 parameters: [
5731 "zoom",
5732 "feature",
5733 "feature-state"
5734 ]
5735 },
5736 "property-type": "data-driven"
5737 },
5738 "fill-extrusion-translate": {
5739 type: "array",
5740 value: "number",
5741 length: 2,
5742 "default": [
5743 0,
5744 0
5745 ],
5746 transition: true,
5747 units: "pixels",
5748 expression: {
5749 interpolated: true,
5750 parameters: [
5751 "zoom"
5752 ]
5753 },
5754 "property-type": "data-constant"
5755 },
5756 "fill-extrusion-translate-anchor": {
5757 type: "enum",
5758 values: {
5759 map: {
5760 },
5761 viewport: {
5762 }
5763 },
5764 "default": "map",
5765 requires: [
5766 "fill-extrusion-translate"
5767 ],
5768 expression: {
5769 interpolated: false,
5770 parameters: [
5771 "zoom"
5772 ]
5773 },
5774 "property-type": "data-constant"
5775 },
5776 "fill-extrusion-pattern": {
5777 type: "resolvedImage",
5778 transition: true,
5779 expression: {
5780 interpolated: false,
5781 parameters: [
5782 "zoom",
5783 "feature"
5784 ]
5785 },
5786 "property-type": "cross-faded-data-driven"
5787 },
5788 "fill-extrusion-height": {
5789 type: "number",
5790 "default": 0,
5791 minimum: 0,
5792 units: "meters",
5793 transition: true,
5794 expression: {
5795 interpolated: true,
5796 parameters: [
5797 "zoom",
5798 "feature",
5799 "feature-state"
5800 ]
5801 },
5802 "property-type": "data-driven"
5803 },
5804 "fill-extrusion-base": {
5805 type: "number",
5806 "default": 0,
5807 minimum: 0,
5808 units: "meters",
5809 transition: true,
5810 requires: [
5811 "fill-extrusion-height"
5812 ],
5813 expression: {
5814 interpolated: true,
5815 parameters: [
5816 "zoom",
5817 "feature",
5818 "feature-state"
5819 ]
5820 },
5821 "property-type": "data-driven"
5822 },
5823 "fill-extrusion-vertical-gradient": {
5824 type: "boolean",
5825 "default": true,
5826 transition: false,
5827 expression: {
5828 interpolated: false,
5829 parameters: [
5830 "zoom"
5831 ]
5832 },
5833 "property-type": "data-constant"
5834 }
5835},
5836 paint_line: paint_line,
5837 paint_circle: paint_circle,
5838 paint_heatmap: paint_heatmap,
5839 paint_symbol: paint_symbol,
5840 paint_raster: paint_raster,
5841 paint_hillshade: paint_hillshade,
5842 paint_background: paint_background,
5843 transition: transition,
5844 "property-type": {
5845 "data-driven": {
5846 type: "property-type"
5847 },
5848 "cross-faded": {
5849 type: "property-type"
5850 },
5851 "cross-faded-data-driven": {
5852 type: "property-type"
5853 },
5854 "color-ramp": {
5855 type: "property-type"
5856 },
5857 "data-constant": {
5858 type: "property-type"
5859 },
5860 constant: {
5861 type: "property-type"
5862 }
5863},
5864 promoteId: promoteId
5865};
5866
5867// Note: Do not inherit from Error. It breaks when transpiling to ES5.
5868class ValidationError {
5869 constructor(key, value, message, identifier) {
5870 this.message = (key ? `${key}: ` : '') + message;
5871 if (identifier)
5872 this.identifier = identifier;
5873 if (value !== null && value !== undefined && value.__line__) {
5874 this.line = value.__line__;
5875 }
5876 }
5877}
5878
5879function validateConstants(options) {
5880 const key = options.key;
5881 const constants = options.value;
5882 if (constants) {
5883 return [new ValidationError(key, constants, 'constants have been deprecated as of v8')];
5884 }
5885 else {
5886 return [];
5887 }
5888}
5889
5890function extend (output, ...inputs) {
5891 for (const input of inputs) {
5892 for (const k in input) {
5893 output[k] = input[k];
5894 }
5895 }
5896 return output;
5897}
5898
5899// Turn jsonlint-lines-primitives objects into primitive objects
5900function unbundle(value) {
5901 if (value instanceof Number || value instanceof String || value instanceof Boolean) {
5902 return value.valueOf();
5903 }
5904 else {
5905 return value;
5906 }
5907}
5908function deepUnbundle(value) {
5909 if (Array.isArray(value)) {
5910 return value.map(deepUnbundle);
5911 }
5912 else if (value instanceof Object && !(value instanceof Number || value instanceof String || value instanceof Boolean)) {
5913 const unbundledValue = {};
5914 for (const key in value) {
5915 unbundledValue[key] = deepUnbundle(value[key]);
5916 }
5917 return unbundledValue;
5918 }
5919 return unbundle(value);
5920}
5921
5922class ParsingError extends Error {
5923 constructor(key, message) {
5924 super(message);
5925 this.message = message;
5926 this.key = key;
5927 }
5928}
5929
5930/**
5931 * Tracks `let` bindings during expression parsing.
5932 * @private
5933 */
5934class Scope {
5935 constructor(parent, bindings = []) {
5936 this.parent = parent;
5937 this.bindings = {};
5938 for (const [name, expression] of bindings) {
5939 this.bindings[name] = expression;
5940 }
5941 }
5942 concat(bindings) {
5943 return new Scope(this, bindings);
5944 }
5945 get(name) {
5946 if (this.bindings[name]) {
5947 return this.bindings[name];
5948 }
5949 if (this.parent) {
5950 return this.parent.get(name);
5951 }
5952 throw new Error(`${name} not found in scope.`);
5953 }
5954 has(name) {
5955 if (this.bindings[name])
5956 return true;
5957 return this.parent ? this.parent.has(name) : false;
5958 }
5959}
5960
5961const NullType = { kind: 'null' };
5962const NumberType = { kind: 'number' };
5963const StringType = { kind: 'string' };
5964const BooleanType = { kind: 'boolean' };
5965const ColorType = { kind: 'color' };
5966const ObjectType = { kind: 'object' };
5967const ValueType = { kind: 'value' };
5968const ErrorType = { kind: 'error' };
5969const CollatorType = { kind: 'collator' };
5970const FormattedType = { kind: 'formatted' };
5971const ResolvedImageType = { kind: 'resolvedImage' };
5972function array$1(itemType, N) {
5973 return {
5974 kind: 'array',
5975 itemType,
5976 N
5977 };
5978}
5979function toString$1(type) {
5980 if (type.kind === 'array') {
5981 const itemType = toString$1(type.itemType);
5982 return typeof type.N === 'number' ?
5983 `array<${itemType}, ${type.N}>` :
5984 type.itemType.kind === 'value' ? 'array' : `array<${itemType}>`;
5985 }
5986 else {
5987 return type.kind;
5988 }
5989}
5990const valueMemberTypes = [
5991 NullType,
5992 NumberType,
5993 StringType,
5994 BooleanType,
5995 ColorType,
5996 FormattedType,
5997 ObjectType,
5998 array$1(ValueType),
5999 ResolvedImageType
6000];
6001/**
6002 * Returns null if `t` is a subtype of `expected`; otherwise returns an
6003 * error message.
6004 * @private
6005 */
6006function checkSubtype(expected, t) {
6007 if (t.kind === 'error') {
6008 // Error is a subtype of every type
6009 return null;
6010 }
6011 else if (expected.kind === 'array') {
6012 if (t.kind === 'array' &&
6013 ((t.N === 0 && t.itemType.kind === 'value') || !checkSubtype(expected.itemType, t.itemType)) &&
6014 (typeof expected.N !== 'number' || expected.N === t.N)) {
6015 return null;
6016 }
6017 }
6018 else if (expected.kind === t.kind) {
6019 return null;
6020 }
6021 else if (expected.kind === 'value') {
6022 for (const memberType of valueMemberTypes) {
6023 if (!checkSubtype(memberType, t)) {
6024 return null;
6025 }
6026 }
6027 }
6028 return `Expected ${toString$1(expected)} but found ${toString$1(t)} instead.`;
6029}
6030function isValidType(provided, allowedTypes) {
6031 return allowedTypes.some(t => t.kind === provided.kind);
6032}
6033function isValidNativeType(provided, allowedTypes) {
6034 return allowedTypes.some(t => {
6035 if (t === 'null') {
6036 return provided === null;
6037 }
6038 else if (t === 'array') {
6039 return Array.isArray(provided);
6040 }
6041 else if (t === 'object') {
6042 return provided && !Array.isArray(provided) && typeof provided === 'object';
6043 }
6044 else {
6045 return t === typeof provided;
6046 }
6047 });
6048}
6049
6050var csscolorparser = {};
6051
6052var parseCSSColor_1;
6053// (c) Dean McNamee <dean@gmail.com>, 2012.
6054//
6055// https://github.com/deanm/css-color-parser-js
6056//
6057// Permission is hereby granted, free of charge, to any person obtaining a copy
6058// of this software and associated documentation files (the "Software"), to
6059// deal in the Software without restriction, including without limitation the
6060// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6061// sell copies of the Software, and to permit persons to whom the Software is
6062// furnished to do so, subject to the following conditions:
6063//
6064// The above copyright notice and this permission notice shall be included in
6065// all copies or substantial portions of the Software.
6066//
6067// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
6068// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
6069// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
6070// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
6071// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
6072// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
6073// IN THE SOFTWARE.
6074
6075// http://www.w3.org/TR/css3-color/
6076var kCSSColorTable = {
6077 "transparent": [0,0,0,0], "aliceblue": [240,248,255,1],
6078 "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1],
6079 "aquamarine": [127,255,212,1], "azure": [240,255,255,1],
6080 "beige": [245,245,220,1], "bisque": [255,228,196,1],
6081 "black": [0,0,0,1], "blanchedalmond": [255,235,205,1],
6082 "blue": [0,0,255,1], "blueviolet": [138,43,226,1],
6083 "brown": [165,42,42,1], "burlywood": [222,184,135,1],
6084 "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1],
6085 "chocolate": [210,105,30,1], "coral": [255,127,80,1],
6086 "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1],
6087 "crimson": [220,20,60,1], "cyan": [0,255,255,1],
6088 "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1],
6089 "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1],
6090 "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1],
6091 "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1],
6092 "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1],
6093 "darkorchid": [153,50,204,1], "darkred": [139,0,0,1],
6094 "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1],
6095 "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1],
6096 "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1],
6097 "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1],
6098 "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1],
6099 "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1],
6100 "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1],
6101 "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1],
6102 "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1],
6103 "gold": [255,215,0,1], "goldenrod": [218,165,32,1],
6104 "gray": [128,128,128,1], "green": [0,128,0,1],
6105 "greenyellow": [173,255,47,1], "grey": [128,128,128,1],
6106 "honeydew": [240,255,240,1], "hotpink": [255,105,180,1],
6107 "indianred": [205,92,92,1], "indigo": [75,0,130,1],
6108 "ivory": [255,255,240,1], "khaki": [240,230,140,1],
6109 "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1],
6110 "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1],
6111 "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1],
6112 "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1],
6113 "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1],
6114 "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1],
6115 "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1],
6116 "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1],
6117 "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1],
6118 "lightyellow": [255,255,224,1], "lime": [0,255,0,1],
6119 "limegreen": [50,205,50,1], "linen": [250,240,230,1],
6120 "magenta": [255,0,255,1], "maroon": [128,0,0,1],
6121 "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1],
6122 "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1],
6123 "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1],
6124 "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1],
6125 "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1],
6126 "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1],
6127 "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1],
6128 "navy": [0,0,128,1], "oldlace": [253,245,230,1],
6129 "olive": [128,128,0,1], "olivedrab": [107,142,35,1],
6130 "orange": [255,165,0,1], "orangered": [255,69,0,1],
6131 "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1],
6132 "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1],
6133 "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1],
6134 "peachpuff": [255,218,185,1], "peru": [205,133,63,1],
6135 "pink": [255,192,203,1], "plum": [221,160,221,1],
6136 "powderblue": [176,224,230,1], "purple": [128,0,128,1],
6137 "rebeccapurple": [102,51,153,1],
6138 "red": [255,0,0,1], "rosybrown": [188,143,143,1],
6139 "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1],
6140 "salmon": [250,128,114,1], "sandybrown": [244,164,96,1],
6141 "seagreen": [46,139,87,1], "seashell": [255,245,238,1],
6142 "sienna": [160,82,45,1], "silver": [192,192,192,1],
6143 "skyblue": [135,206,235,1], "slateblue": [106,90,205,1],
6144 "slategray": [112,128,144,1], "slategrey": [112,128,144,1],
6145 "snow": [255,250,250,1], "springgreen": [0,255,127,1],
6146 "steelblue": [70,130,180,1], "tan": [210,180,140,1],
6147 "teal": [0,128,128,1], "thistle": [216,191,216,1],
6148 "tomato": [255,99,71,1], "turquoise": [64,224,208,1],
6149 "violet": [238,130,238,1], "wheat": [245,222,179,1],
6150 "white": [255,255,255,1], "whitesmoke": [245,245,245,1],
6151 "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]};
6152
6153function clamp_css_byte(i) { // Clamp to integer 0 .. 255.
6154 i = Math.round(i); // Seems to be what Chrome does (vs truncation).
6155 return i < 0 ? 0 : i > 255 ? 255 : i;
6156}
6157
6158function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.
6159 return f < 0 ? 0 : f > 1 ? 1 : f;
6160}
6161
6162function parse_css_int(str) { // int or percentage.
6163 if (str[str.length - 1] === '%')
6164 return clamp_css_byte(parseFloat(str) / 100 * 255);
6165 return clamp_css_byte(parseInt(str));
6166}
6167
6168function parse_css_float(str) { // float or percentage.
6169 if (str[str.length - 1] === '%')
6170 return clamp_css_float(parseFloat(str) / 100);
6171 return clamp_css_float(parseFloat(str));
6172}
6173
6174function css_hue_to_rgb(m1, m2, h) {
6175 if (h < 0) h += 1;
6176 else if (h > 1) h -= 1;
6177
6178 if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
6179 if (h * 2 < 1) return m2;
6180 if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;
6181 return m1;
6182}
6183
6184function parseCSSColor(css_str) {
6185 // Remove all whitespace, not compliant, but should just be more accepting.
6186 var str = css_str.replace(/ /g, '').toLowerCase();
6187
6188 // Color keywords (and transparent) lookup.
6189 if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.
6190
6191 // #abc and #abc123 syntax.
6192 if (str[0] === '#') {
6193 if (str.length === 4) {
6194 var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.
6195 if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.
6196 return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),
6197 (iv & 0xf0) | ((iv & 0xf0) >> 4),
6198 (iv & 0xf) | ((iv & 0xf) << 4),
6199 1];
6200 } else if (str.length === 7) {
6201 var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.
6202 if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.
6203 return [(iv & 0xff0000) >> 16,
6204 (iv & 0xff00) >> 8,
6205 iv & 0xff,
6206 1];
6207 }
6208
6209 return null;
6210 }
6211
6212 var op = str.indexOf('('), ep = str.indexOf(')');
6213 if (op !== -1 && ep + 1 === str.length) {
6214 var fname = str.substr(0, op);
6215 var params = str.substr(op+1, ep-(op+1)).split(',');
6216 var alpha = 1; // To allow case fallthrough.
6217 switch (fname) {
6218 case 'rgba':
6219 if (params.length !== 4) return null;
6220 alpha = parse_css_float(params.pop());
6221 // Fall through.
6222 case 'rgb':
6223 if (params.length !== 3) return null;
6224 return [parse_css_int(params[0]),
6225 parse_css_int(params[1]),
6226 parse_css_int(params[2]),
6227 alpha];
6228 case 'hsla':
6229 if (params.length !== 4) return null;
6230 alpha = parse_css_float(params.pop());
6231 // Fall through.
6232 case 'hsl':
6233 if (params.length !== 3) return null;
6234 var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1
6235 // NOTE(deanm): According to the CSS spec s/l should only be
6236 // percentages, but we don't bother and let float or percentage.
6237 var s = parse_css_float(params[1]);
6238 var l = parse_css_float(params[2]);
6239 var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
6240 var m1 = l * 2 - m2;
6241 return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),
6242 clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),
6243 clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),
6244 alpha];
6245 default:
6246 return null;
6247 }
6248 }
6249
6250 return null;
6251}
6252
6253try { parseCSSColor_1 = csscolorparser.parseCSSColor = parseCSSColor; } catch(e) { }
6254
6255/**
6256 * An RGBA color value. Create instances from color strings using the static
6257 * method `Color.parse`. The constructor accepts RGB channel values in the range
6258 * `[0, 1]`, premultiplied by A.
6259 *
6260 * @param {number} r The red channel.
6261 * @param {number} g The green channel.
6262 * @param {number} b The blue channel.
6263 * @param {number} a The alpha channel.
6264 * @private
6265 */
6266class Color {
6267 constructor(r, g, b, a = 1) {
6268 this.r = r;
6269 this.g = g;
6270 this.b = b;
6271 this.a = a;
6272 }
6273 /**
6274 * Parses valid CSS color strings and returns a `Color` instance.
6275 * @returns A `Color` instance, or `undefined` if the input is not a valid color string.
6276 */
6277 static parse(input) {
6278 if (!input) {
6279 return undefined;
6280 }
6281 if (input instanceof Color) {
6282 return input;
6283 }
6284 if (typeof input !== 'string') {
6285 return undefined;
6286 }
6287 const rgba = parseCSSColor_1(input);
6288 if (!rgba) {
6289 return undefined;
6290 }
6291 return new Color(rgba[0] / 255 * rgba[3], rgba[1] / 255 * rgba[3], rgba[2] / 255 * rgba[3], rgba[3]);
6292 }
6293 /**
6294 * Returns an RGBA string representing the color value.
6295 *
6296 * @returns An RGBA string.
6297 * @example
6298 * var purple = new Color.parse('purple');
6299 * purple.toString; // = "rgba(128,0,128,1)"
6300 * var translucentGreen = new Color.parse('rgba(26, 207, 26, .73)');
6301 * translucentGreen.toString(); // = "rgba(26,207,26,0.73)"
6302 */
6303 toString() {
6304 const [r, g, b, a] = this.toArray();
6305 return `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${a})`;
6306 }
6307 toArray() {
6308 const { r, g, b, a } = this;
6309 return a === 0 ? [0, 0, 0, 0] : [
6310 r * 255 / a,
6311 g * 255 / a,
6312 b * 255 / a,
6313 a
6314 ];
6315 }
6316}
6317Color.black = new Color(0, 0, 0, 1);
6318Color.white = new Color(1, 1, 1, 1);
6319Color.transparent = new Color(0, 0, 0, 0);
6320Color.red = new Color(1, 0, 0, 1);
6321
6322// Flow type declarations for Intl cribbed from
6323// https://github.com/facebook/flow/issues/1270
6324class Collator {
6325 constructor(caseSensitive, diacriticSensitive, locale) {
6326 if (caseSensitive)
6327 this.sensitivity = diacriticSensitive ? 'variant' : 'case';
6328 else
6329 this.sensitivity = diacriticSensitive ? 'accent' : 'base';
6330 this.locale = locale;
6331 this.collator = new Intl.Collator(this.locale ? this.locale : [], { sensitivity: this.sensitivity, usage: 'search' });
6332 }
6333 compare(lhs, rhs) {
6334 return this.collator.compare(lhs, rhs);
6335 }
6336 resolvedLocale() {
6337 // We create a Collator without "usage: search" because we don't want
6338 // the search options encoded in our result (e.g. "en-u-co-search")
6339 return new Intl.Collator(this.locale ? this.locale : [])
6340 .resolvedOptions().locale;
6341 }
6342}
6343
6344class FormattedSection {
6345 constructor(text, image, scale, fontStack, textColor) {
6346 this.text = text;
6347 this.image = image;
6348 this.scale = scale;
6349 this.fontStack = fontStack;
6350 this.textColor = textColor;
6351 }
6352}
6353class Formatted {
6354 constructor(sections) {
6355 this.sections = sections;
6356 }
6357 static fromString(unformatted) {
6358 return new Formatted([new FormattedSection(unformatted, null, null, null, null)]);
6359 }
6360 isEmpty() {
6361 if (this.sections.length === 0)
6362 return true;
6363 return !this.sections.some(section => section.text.length !== 0 ||
6364 (section.image && section.image.name.length !== 0));
6365 }
6366 static factory(text) {
6367 if (text instanceof Formatted) {
6368 return text;
6369 }
6370 else {
6371 return Formatted.fromString(text);
6372 }
6373 }
6374 toString() {
6375 if (this.sections.length === 0)
6376 return '';
6377 return this.sections.map(section => section.text).join('');
6378 }
6379 serialize() {
6380 const serialized = ['format'];
6381 for (const section of this.sections) {
6382 if (section.image) {
6383 serialized.push(['image', section.image.name]);
6384 continue;
6385 }
6386 serialized.push(section.text);
6387 const options = {};
6388 if (section.fontStack) {
6389 options['text-font'] = ['literal', section.fontStack.split(',')];
6390 }
6391 if (section.scale) {
6392 options['font-scale'] = section.scale;
6393 }
6394 if (section.textColor) {
6395 options['text-color'] = ['rgba'].concat(section.textColor.toArray());
6396 }
6397 serialized.push(options);
6398 }
6399 return serialized;
6400 }
6401}
6402
6403class ResolvedImage {
6404 constructor(options) {
6405 this.name = options.name;
6406 this.available = options.available;
6407 }
6408 toString() {
6409 return this.name;
6410 }
6411 static fromString(name) {
6412 if (!name)
6413 return null; // treat empty values as no image
6414 return new ResolvedImage({ name, available: false });
6415 }
6416 serialize() {
6417 return ['image', this.name];
6418 }
6419}
6420
6421function validateRGBA(r, g, b, a) {
6422 if (!(typeof r === 'number' && r >= 0 && r <= 255 &&
6423 typeof g === 'number' && g >= 0 && g <= 255 &&
6424 typeof b === 'number' && b >= 0 && b <= 255)) {
6425 const value = typeof a === 'number' ? [r, g, b, a] : [r, g, b];
6426 return `Invalid rgba value [${value.join(', ')}]: 'r', 'g', and 'b' must be between 0 and 255.`;
6427 }
6428 if (!(typeof a === 'undefined' || (typeof a === 'number' && a >= 0 && a <= 1))) {
6429 return `Invalid rgba value [${[r, g, b, a].join(', ')}]: 'a' must be between 0 and 1.`;
6430 }
6431 return null;
6432}
6433function isValue(mixed) {
6434 if (mixed === null) {
6435 return true;
6436 }
6437 else if (typeof mixed === 'string') {
6438 return true;
6439 }
6440 else if (typeof mixed === 'boolean') {
6441 return true;
6442 }
6443 else if (typeof mixed === 'number') {
6444 return true;
6445 }
6446 else if (mixed instanceof Color) {
6447 return true;
6448 }
6449 else if (mixed instanceof Collator) {
6450 return true;
6451 }
6452 else if (mixed instanceof Formatted) {
6453 return true;
6454 }
6455 else if (mixed instanceof ResolvedImage) {
6456 return true;
6457 }
6458 else if (Array.isArray(mixed)) {
6459 for (const item of mixed) {
6460 if (!isValue(item)) {
6461 return false;
6462 }
6463 }
6464 return true;
6465 }
6466 else if (typeof mixed === 'object') {
6467 for (const key in mixed) {
6468 if (!isValue(mixed[key])) {
6469 return false;
6470 }
6471 }
6472 return true;
6473 }
6474 else {
6475 return false;
6476 }
6477}
6478function typeOf(value) {
6479 if (value === null) {
6480 return NullType;
6481 }
6482 else if (typeof value === 'string') {
6483 return StringType;
6484 }
6485 else if (typeof value === 'boolean') {
6486 return BooleanType;
6487 }
6488 else if (typeof value === 'number') {
6489 return NumberType;
6490 }
6491 else if (value instanceof Color) {
6492 return ColorType;
6493 }
6494 else if (value instanceof Collator) {
6495 return CollatorType;
6496 }
6497 else if (value instanceof Formatted) {
6498 return FormattedType;
6499 }
6500 else if (value instanceof ResolvedImage) {
6501 return ResolvedImageType;
6502 }
6503 else if (Array.isArray(value)) {
6504 const length = value.length;
6505 let itemType;
6506 for (const item of value) {
6507 const t = typeOf(item);
6508 if (!itemType) {
6509 itemType = t;
6510 }
6511 else if (itemType === t) {
6512 continue;
6513 }
6514 else {
6515 itemType = ValueType;
6516 break;
6517 }
6518 }
6519 return array$1(itemType || ValueType, length);
6520 }
6521 else {
6522 assert$1(typeof value === 'object');
6523 return ObjectType;
6524 }
6525}
6526function toString(value) {
6527 const type = typeof value;
6528 if (value === null) {
6529 return '';
6530 }
6531 else if (type === 'string' || type === 'number' || type === 'boolean') {
6532 return String(value);
6533 }
6534 else if (value instanceof Color || value instanceof Formatted || value instanceof ResolvedImage) {
6535 return value.toString();
6536 }
6537 else {
6538 return JSON.stringify(value);
6539 }
6540}
6541
6542class Literal {
6543 constructor(type, value) {
6544 this.type = type;
6545 this.value = value;
6546 }
6547 static parse(args, context) {
6548 if (args.length !== 2)
6549 return context.error(`'literal' expression requires exactly one argument, but found ${args.length - 1} instead.`);
6550 if (!isValue(args[1]))
6551 return context.error('invalid value');
6552 const value = args[1];
6553 let type = typeOf(value);
6554 // special case: infer the item type if possible for zero-length arrays
6555 const expected = context.expectedType;
6556 if (type.kind === 'array' &&
6557 type.N === 0 &&
6558 expected &&
6559 expected.kind === 'array' &&
6560 (typeof expected.N !== 'number' || expected.N === 0)) {
6561 type = expected;
6562 }
6563 return new Literal(type, value);
6564 }
6565 evaluate() {
6566 return this.value;
6567 }
6568 eachChild() { }
6569 outputDefined() {
6570 return true;
6571 }
6572 serialize() {
6573 if (this.type.kind === 'array' || this.type.kind === 'object') {
6574 return ['literal', this.value];
6575 }
6576 else if (this.value instanceof Color) {
6577 // Constant-folding can generate Literal expressions that you
6578 // couldn't actually generate with a "literal" expression,
6579 // so we have to implement an equivalent serialization here
6580 return ['rgba'].concat(this.value.toArray());
6581 }
6582 else if (this.value instanceof Formatted) {
6583 // Same as Color
6584 return this.value.serialize();
6585 }
6586 else {
6587 assert$1(this.value === null ||
6588 typeof this.value === 'string' ||
6589 typeof this.value === 'number' ||
6590 typeof this.value === 'boolean');
6591 return this.value;
6592 }
6593 }
6594}
6595
6596class RuntimeError {
6597 constructor(message) {
6598 this.name = 'ExpressionEvaluationError';
6599 this.message = message;
6600 }
6601 toJSON() {
6602 return this.message;
6603 }
6604}
6605
6606const types$1 = {
6607 string: StringType,
6608 number: NumberType,
6609 boolean: BooleanType,
6610 object: ObjectType
6611};
6612class Assertion {
6613 constructor(type, args) {
6614 this.type = type;
6615 this.args = args;
6616 }
6617 static parse(args, context) {
6618 if (args.length < 2)
6619 return context.error('Expected at least one argument.');
6620 let i = 1;
6621 let type;
6622 const name = args[0];
6623 if (name === 'array') {
6624 let itemType;
6625 if (args.length > 2) {
6626 const type = args[1];
6627 if (typeof type !== 'string' || !(type in types$1) || type === 'object')
6628 return context.error('The item type argument of "array" must be one of string, number, boolean', 1);
6629 itemType = types$1[type];
6630 i++;
6631 }
6632 else {
6633 itemType = ValueType;
6634 }
6635 let N;
6636 if (args.length > 3) {
6637 if (args[2] !== null &&
6638 (typeof args[2] !== 'number' ||
6639 args[2] < 0 ||
6640 args[2] !== Math.floor(args[2]))) {
6641 return context.error('The length argument to "array" must be a positive integer literal', 2);
6642 }
6643 N = args[2];
6644 i++;
6645 }
6646 type = array$1(itemType, N);
6647 }
6648 else {
6649 assert$1(types$1[name], name);
6650 type = types$1[name];
6651 }
6652 const parsed = [];
6653 for (; i < args.length; i++) {
6654 const input = context.parse(args[i], i, ValueType);
6655 if (!input)
6656 return null;
6657 parsed.push(input);
6658 }
6659 return new Assertion(type, parsed);
6660 }
6661 evaluate(ctx) {
6662 for (let i = 0; i < this.args.length; i++) {
6663 const value = this.args[i].evaluate(ctx);
6664 const error = checkSubtype(this.type, typeOf(value));
6665 if (!error) {
6666 return value;
6667 }
6668 else if (i === this.args.length - 1) {
6669 throw new RuntimeError(`Expected value to be of type ${toString$1(this.type)}, but found ${toString$1(typeOf(value))} instead.`);
6670 }
6671 }
6672 assert$1(false);
6673 return null;
6674 }
6675 eachChild(fn) {
6676 this.args.forEach(fn);
6677 }
6678 outputDefined() {
6679 return this.args.every(arg => arg.outputDefined());
6680 }
6681 serialize() {
6682 const type = this.type;
6683 const serialized = [type.kind];
6684 if (type.kind === 'array') {
6685 const itemType = type.itemType;
6686 if (itemType.kind === 'string' ||
6687 itemType.kind === 'number' ||
6688 itemType.kind === 'boolean') {
6689 serialized.push(itemType.kind);
6690 const N = type.N;
6691 if (typeof N === 'number' || this.args.length > 1) {
6692 serialized.push(N);
6693 }
6694 }
6695 }
6696 return serialized.concat(this.args.map(arg => arg.serialize()));
6697 }
6698}
6699
6700class FormatExpression {
6701 constructor(sections) {
6702 this.type = FormattedType;
6703 this.sections = sections;
6704 }
6705 static parse(args, context) {
6706 if (args.length < 2) {
6707 return context.error('Expected at least one argument.');
6708 }
6709 const firstArg = args[1];
6710 if (!Array.isArray(firstArg) && typeof firstArg === 'object') {
6711 return context.error('First argument must be an image or text section.');
6712 }
6713 const sections = [];
6714 let nextTokenMayBeObject = false;
6715 for (let i = 1; i <= args.length - 1; ++i) {
6716 const arg = args[i];
6717 if (nextTokenMayBeObject && typeof arg === 'object' && !Array.isArray(arg)) {
6718 nextTokenMayBeObject = false;
6719 let scale = null;
6720 if (arg['font-scale']) {
6721 scale = context.parse(arg['font-scale'], 1, NumberType);
6722 if (!scale)
6723 return null;
6724 }
6725 let font = null;
6726 if (arg['text-font']) {
6727 font = context.parse(arg['text-font'], 1, array$1(StringType));
6728 if (!font)
6729 return null;
6730 }
6731 let textColor = null;
6732 if (arg['text-color']) {
6733 textColor = context.parse(arg['text-color'], 1, ColorType);
6734 if (!textColor)
6735 return null;
6736 }
6737 const lastExpression = sections[sections.length - 1];
6738 lastExpression.scale = scale;
6739 lastExpression.font = font;
6740 lastExpression.textColor = textColor;
6741 }
6742 else {
6743 const content = context.parse(args[i], 1, ValueType);
6744 if (!content)
6745 return null;
6746 const kind = content.type.kind;
6747 if (kind !== 'string' && kind !== 'value' && kind !== 'null' && kind !== 'resolvedImage')
6748 return context.error('Formatted text type must be \'string\', \'value\', \'image\' or \'null\'.');
6749 nextTokenMayBeObject = true;
6750 sections.push({ content, scale: null, font: null, textColor: null });
6751 }
6752 }
6753 return new FormatExpression(sections);
6754 }
6755 evaluate(ctx) {
6756 const evaluateSection = section => {
6757 const evaluatedContent = section.content.evaluate(ctx);
6758 if (typeOf(evaluatedContent) === ResolvedImageType) {
6759 return new FormattedSection('', evaluatedContent, null, null, null);
6760 }
6761 return new FormattedSection(toString(evaluatedContent), null, section.scale ? section.scale.evaluate(ctx) : null, section.font ? section.font.evaluate(ctx).join(',') : null, section.textColor ? section.textColor.evaluate(ctx) : null);
6762 };
6763 return new Formatted(this.sections.map(evaluateSection));
6764 }
6765 eachChild(fn) {
6766 for (const section of this.sections) {
6767 fn(section.content);
6768 if (section.scale) {
6769 fn(section.scale);
6770 }
6771 if (section.font) {
6772 fn(section.font);
6773 }
6774 if (section.textColor) {
6775 fn(section.textColor);
6776 }
6777 }
6778 }
6779 outputDefined() {
6780 // Technically the combinatoric set of all children
6781 // Usually, this.text will be undefined anyway
6782 return false;
6783 }
6784 serialize() {
6785 const serialized = ['format'];
6786 for (const section of this.sections) {
6787 serialized.push(section.content.serialize());
6788 const options = {};
6789 if (section.scale) {
6790 options['font-scale'] = section.scale.serialize();
6791 }
6792 if (section.font) {
6793 options['text-font'] = section.font.serialize();
6794 }
6795 if (section.textColor) {
6796 options['text-color'] = section.textColor.serialize();
6797 }
6798 serialized.push(options);
6799 }
6800 return serialized;
6801 }
6802}
6803
6804class ImageExpression {
6805 constructor(input) {
6806 this.type = ResolvedImageType;
6807 this.input = input;
6808 }
6809 static parse(args, context) {
6810 if (args.length !== 2) {
6811 return context.error('Expected two arguments.');
6812 }
6813 const name = context.parse(args[1], 1, StringType);
6814 if (!name)
6815 return context.error('No image name provided.');
6816 return new ImageExpression(name);
6817 }
6818 evaluate(ctx) {
6819 const evaluatedImageName = this.input.evaluate(ctx);
6820 const value = ResolvedImage.fromString(evaluatedImageName);
6821 if (value && ctx.availableImages)
6822 value.available = ctx.availableImages.indexOf(evaluatedImageName) > -1;
6823 return value;
6824 }
6825 eachChild(fn) {
6826 fn(this.input);
6827 }
6828 outputDefined() {
6829 // The output of image is determined by the list of available images in the evaluation context
6830 return false;
6831 }
6832 serialize() {
6833 return ['image', this.input.serialize()];
6834 }
6835}
6836
6837const types = {
6838 'to-boolean': BooleanType,
6839 'to-color': ColorType,
6840 'to-number': NumberType,
6841 'to-string': StringType
6842};
6843/**
6844 * Special form for error-coalescing coercion expressions "to-number",
6845 * "to-color". Since these coercions can fail at runtime, they accept multiple
6846 * arguments, only evaluating one at a time until one succeeds.
6847 *
6848 * @private
6849 */
6850class Coercion {
6851 constructor(type, args) {
6852 this.type = type;
6853 this.args = args;
6854 }
6855 static parse(args, context) {
6856 if (args.length < 2)
6857 return context.error('Expected at least one argument.');
6858 const name = args[0];
6859 assert$1(types[name], name);
6860 if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2)
6861 return context.error('Expected one argument.');
6862 const type = types[name];
6863 const parsed = [];
6864 for (let i = 1; i < args.length; i++) {
6865 const input = context.parse(args[i], i, ValueType);
6866 if (!input)
6867 return null;
6868 parsed.push(input);
6869 }
6870 return new Coercion(type, parsed);
6871 }
6872 evaluate(ctx) {
6873 if (this.type.kind === 'boolean') {
6874 return Boolean(this.args[0].evaluate(ctx));
6875 }
6876 else if (this.type.kind === 'color') {
6877 let input;
6878 let error;
6879 for (const arg of this.args) {
6880 input = arg.evaluate(ctx);
6881 error = null;
6882 if (input instanceof Color) {
6883 return input;
6884 }
6885 else if (typeof input === 'string') {
6886 const c = ctx.parseColor(input);
6887 if (c)
6888 return c;
6889 }
6890 else if (Array.isArray(input)) {
6891 if (input.length < 3 || input.length > 4) {
6892 error = `Invalid rbga value ${JSON.stringify(input)}: expected an array containing either three or four numeric values.`;
6893 }
6894 else {
6895 error = validateRGBA(input[0], input[1], input[2], input[3]);
6896 }
6897 if (!error) {
6898 return new Color(input[0] / 255, input[1] / 255, input[2] / 255, input[3]);
6899 }
6900 }
6901 }
6902 throw new RuntimeError(error || `Could not parse color from value '${typeof input === 'string' ? input : String(JSON.stringify(input))}'`);
6903 }
6904 else if (this.type.kind === 'number') {
6905 let value = null;
6906 for (const arg of this.args) {
6907 value = arg.evaluate(ctx);
6908 if (value === null)
6909 return 0;
6910 const num = Number(value);
6911 if (isNaN(num))
6912 continue;
6913 return num;
6914 }
6915 throw new RuntimeError(`Could not convert ${JSON.stringify(value)} to number.`);
6916 }
6917 else if (this.type.kind === 'formatted') {
6918 // There is no explicit 'to-formatted' but this coercion can be implicitly
6919 // created by properties that expect the 'formatted' type.
6920 return Formatted.fromString(toString(this.args[0].evaluate(ctx)));
6921 }
6922 else if (this.type.kind === 'resolvedImage') {
6923 return ResolvedImage.fromString(toString(this.args[0].evaluate(ctx)));
6924 }
6925 else {
6926 return toString(this.args[0].evaluate(ctx));
6927 }
6928 }
6929 eachChild(fn) {
6930 this.args.forEach(fn);
6931 }
6932 outputDefined() {
6933 return this.args.every(arg => arg.outputDefined());
6934 }
6935 serialize() {
6936 if (this.type.kind === 'formatted') {
6937 return new FormatExpression([{ content: this.args[0], scale: null, font: null, textColor: null }]).serialize();
6938 }
6939 if (this.type.kind === 'resolvedImage') {
6940 return new ImageExpression(this.args[0]).serialize();
6941 }
6942 const serialized = [`to-${this.type.kind}`];
6943 this.eachChild(child => { serialized.push(child.serialize()); });
6944 return serialized;
6945 }
6946}
6947
6948const geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon'];
6949class EvaluationContext {
6950 constructor() {
6951 this.globals = null;
6952 this.feature = null;
6953 this.featureState = null;
6954 this.formattedSection = null;
6955 this._parseColorCache = {};
6956 this.availableImages = null;
6957 this.canonical = null;
6958 }
6959 id() {
6960 return this.feature && 'id' in this.feature ? this.feature.id : null;
6961 }
6962 geometryType() {
6963 return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null;
6964 }
6965 geometry() {
6966 return this.feature && 'geometry' in this.feature ? this.feature.geometry : null;
6967 }
6968 canonicalID() {
6969 return this.canonical;
6970 }
6971 properties() {
6972 return this.feature && this.feature.properties || {};
6973 }
6974 parseColor(input) {
6975 let cached = this._parseColorCache[input];
6976 if (!cached) {
6977 cached = this._parseColorCache[input] = Color.parse(input);
6978 }
6979 return cached;
6980 }
6981}
6982
6983class CompoundExpression {
6984 constructor(name, type, evaluate, args) {
6985 this.name = name;
6986 this.type = type;
6987 this._evaluate = evaluate;
6988 this.args = args;
6989 }
6990 evaluate(ctx) {
6991 return this._evaluate(ctx, this.args);
6992 }
6993 eachChild(fn) {
6994 this.args.forEach(fn);
6995 }
6996 outputDefined() {
6997 return false;
6998 }
6999 serialize() {
7000 return [this.name].concat(this.args.map(arg => arg.serialize()));
7001 }
7002 static parse(args, context) {
7003 const op = args[0];
7004 const definition = CompoundExpression.definitions[op];
7005 if (!definition) {
7006 return context.error(`Unknown expression "${op}". If you wanted a literal array, use ["literal", [...]].`, 0);
7007 }
7008 // Now check argument types against each signature
7009 const type = Array.isArray(definition) ?
7010 definition[0] : definition.type;
7011 const availableOverloads = Array.isArray(definition) ?
7012 [[definition[1], definition[2]]] :
7013 definition.overloads;
7014 const overloads = availableOverloads.filter(([signature]) => (!Array.isArray(signature) || // varags
7015 signature.length === args.length - 1 // correct param count
7016 ));
7017 let signatureContext = null;
7018 for (const [params, evaluate] of overloads) {
7019 // Use a fresh context for each attempted signature so that, if
7020 // we eventually succeed, we haven't polluted `context.errors`.
7021 signatureContext = new ParsingContext$1(context.registry, context.path, null, context.scope);
7022 // First parse all the args, potentially coercing to the
7023 // types expected by this overload.
7024 const parsedArgs = [];
7025 let argParseFailed = false;
7026 for (let i = 1; i < args.length; i++) {
7027 const arg = args[i];
7028 const expectedType = Array.isArray(params) ?
7029 params[i - 1] :
7030 params.type;
7031 const parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType);
7032 if (!parsed) {
7033 argParseFailed = true;
7034 break;
7035 }
7036 parsedArgs.push(parsed);
7037 }
7038 if (argParseFailed) {
7039 // Couldn't coerce args of this overload to expected type, move
7040 // on to next one.
7041 continue;
7042 }
7043 if (Array.isArray(params)) {
7044 if (params.length !== parsedArgs.length) {
7045 signatureContext.error(`Expected ${params.length} arguments, but found ${parsedArgs.length} instead.`);
7046 continue;
7047 }
7048 }
7049 for (let i = 0; i < parsedArgs.length; i++) {
7050 const expected = Array.isArray(params) ? params[i] : params.type;
7051 const arg = parsedArgs[i];
7052 signatureContext.concat(i + 1).checkSubtype(expected, arg.type);
7053 }
7054 if (signatureContext.errors.length === 0) {
7055 return new CompoundExpression(op, type, evaluate, parsedArgs);
7056 }
7057 }
7058 assert$1(!signatureContext || signatureContext.errors.length > 0);
7059 if (overloads.length === 1) {
7060 context.errors.push(...signatureContext.errors);
7061 }
7062 else {
7063 const expected = overloads.length ? overloads : availableOverloads;
7064 const signatures = expected
7065 .map(([params]) => stringifySignature(params))
7066 .join(' | ');
7067 const actualTypes = [];
7068 // For error message, re-parse arguments without trying to
7069 // apply any coercions
7070 for (let i = 1; i < args.length; i++) {
7071 const parsed = context.parse(args[i], 1 + actualTypes.length);
7072 if (!parsed)
7073 return null;
7074 actualTypes.push(toString$1(parsed.type));
7075 }
7076 context.error(`Expected arguments of type ${signatures}, but found (${actualTypes.join(', ')}) instead.`);
7077 }
7078 return null;
7079 }
7080 static register(registry, definitions) {
7081 assert$1(!CompoundExpression.definitions);
7082 CompoundExpression.definitions = definitions;
7083 for (const name in definitions) {
7084 registry[name] = CompoundExpression;
7085 }
7086 }
7087}
7088function stringifySignature(signature) {
7089 if (Array.isArray(signature)) {
7090 return `(${signature.map(toString$1).join(', ')})`;
7091 }
7092 else {
7093 return `(${toString$1(signature.type)}...)`;
7094 }
7095}
7096
7097class CollatorExpression {
7098 constructor(caseSensitive, diacriticSensitive, locale) {
7099 this.type = CollatorType;
7100 this.locale = locale;
7101 this.caseSensitive = caseSensitive;
7102 this.diacriticSensitive = diacriticSensitive;
7103 }
7104 static parse(args, context) {
7105 if (args.length !== 2)
7106 return context.error('Expected one argument.');
7107 const options = args[1];
7108 if (typeof options !== 'object' || Array.isArray(options))
7109 return context.error('Collator options argument must be an object.');
7110 const caseSensitive = context.parse(options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType);
7111 if (!caseSensitive)
7112 return null;
7113 const diacriticSensitive = context.parse(options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType);
7114 if (!diacriticSensitive)
7115 return null;
7116 let locale = null;
7117 if (options['locale']) {
7118 locale = context.parse(options['locale'], 1, StringType);
7119 if (!locale)
7120 return null;
7121 }
7122 return new CollatorExpression(caseSensitive, diacriticSensitive, locale);
7123 }
7124 evaluate(ctx) {
7125 return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null);
7126 }
7127 eachChild(fn) {
7128 fn(this.caseSensitive);
7129 fn(this.diacriticSensitive);
7130 if (this.locale) {
7131 fn(this.locale);
7132 }
7133 }
7134 outputDefined() {
7135 // Technically the set of possible outputs is the combinatoric set of Collators produced
7136 // by all possible outputs of locale/caseSensitive/diacriticSensitive
7137 // But for the primary use of Collators in comparison operators, we ignore the Collator's
7138 // possible outputs anyway, so we can get away with leaving this false for now.
7139 return false;
7140 }
7141 serialize() {
7142 const options = {};
7143 options['case-sensitive'] = this.caseSensitive.serialize();
7144 options['diacritic-sensitive'] = this.diacriticSensitive.serialize();
7145 if (this.locale) {
7146 options['locale'] = this.locale.serialize();
7147 }
7148 return ['collator', options];
7149 }
7150}
7151
7152const EXTENT$1 = 8192;
7153function updateBBox(bbox, coord) {
7154 bbox[0] = Math.min(bbox[0], coord[0]);
7155 bbox[1] = Math.min(bbox[1], coord[1]);
7156 bbox[2] = Math.max(bbox[2], coord[0]);
7157 bbox[3] = Math.max(bbox[3], coord[1]);
7158}
7159function mercatorXfromLng$1(lng) {
7160 return (180 + lng) / 360;
7161}
7162function mercatorYfromLat$1(lat) {
7163 return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360;
7164}
7165function boxWithinBox(bbox1, bbox2) {
7166 if (bbox1[0] <= bbox2[0])
7167 return false;
7168 if (bbox1[2] >= bbox2[2])
7169 return false;
7170 if (bbox1[1] <= bbox2[1])
7171 return false;
7172 if (bbox1[3] >= bbox2[3])
7173 return false;
7174 return true;
7175}
7176function getTileCoordinates(p, canonical) {
7177 const x = mercatorXfromLng$1(p[0]);
7178 const y = mercatorYfromLat$1(p[1]);
7179 const tilesAtZoom = Math.pow(2, canonical.z);
7180 return [Math.round(x * tilesAtZoom * EXTENT$1), Math.round(y * tilesAtZoom * EXTENT$1)];
7181}
7182function onBoundary(p, p1, p2) {
7183 const x1 = p[0] - p1[0];
7184 const y1 = p[1] - p1[1];
7185 const x2 = p[0] - p2[0];
7186 const y2 = p[1] - p2[1];
7187 return (x1 * y2 - x2 * y1 === 0) && (x1 * x2 <= 0) && (y1 * y2 <= 0);
7188}
7189function rayIntersect(p, p1, p2) {
7190 return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]);
7191}
7192// ray casting algorithm for detecting if point is in polygon
7193function pointWithinPolygon(point, rings) {
7194 let inside = false;
7195 for (let i = 0, len = rings.length; i < len; i++) {
7196 const ring = rings[i];
7197 for (let j = 0, len2 = ring.length; j < len2 - 1; j++) {
7198 if (onBoundary(point, ring[j], ring[j + 1]))
7199 return false;
7200 if (rayIntersect(point, ring[j], ring[j + 1]))
7201 inside = !inside;
7202 }
7203 }
7204 return inside;
7205}
7206function pointWithinPolygons(point, polygons) {
7207 for (let i = 0; i < polygons.length; i++) {
7208 if (pointWithinPolygon(point, polygons[i]))
7209 return true;
7210 }
7211 return false;
7212}
7213function perp(v1, v2) {
7214 return (v1[0] * v2[1] - v1[1] * v2[0]);
7215}
7216// check if p1 and p2 are in different sides of line segment q1->q2
7217function twoSided(p1, p2, q1, q2) {
7218 // q1->p1 (x1, y1), q1->p2 (x2, y2), q1->q2 (x3, y3)
7219 const x1 = p1[0] - q1[0];
7220 const y1 = p1[1] - q1[1];
7221 const x2 = p2[0] - q1[0];
7222 const y2 = p2[1] - q1[1];
7223 const x3 = q2[0] - q1[0];
7224 const y3 = q2[1] - q1[1];
7225 const det1 = (x1 * y3 - x3 * y1);
7226 const det2 = (x2 * y3 - x3 * y2);
7227 if ((det1 > 0 && det2 < 0) || (det1 < 0 && det2 > 0))
7228 return true;
7229 return false;
7230}
7231// a, b are end points for line segment1, c and d are end points for line segment2
7232function lineIntersectLine(a, b, c, d) {
7233 // check if two segments are parallel or not
7234 // precondition is end point a, b is inside polygon, if line a->b is
7235 // parallel to polygon edge c->d, then a->b won't intersect with c->d
7236 const vectorP = [b[0] - a[0], b[1] - a[1]];
7237 const vectorQ = [d[0] - c[0], d[1] - c[1]];
7238 if (perp(vectorQ, vectorP) === 0)
7239 return false;
7240 // If lines are intersecting with each other, the relative location should be:
7241 // a and b lie in different sides of segment c->d
7242 // c and d lie in different sides of segment a->b
7243 if (twoSided(a, b, c, d) && twoSided(c, d, a, b))
7244 return true;
7245 return false;
7246}
7247function lineIntersectPolygon(p1, p2, polygon) {
7248 for (const ring of polygon) {
7249 // loop through every edge of the ring
7250 for (let j = 0; j < ring.length - 1; ++j) {
7251 if (lineIntersectLine(p1, p2, ring[j], ring[j + 1])) {
7252 return true;
7253 }
7254 }
7255 }
7256 return false;
7257}
7258function lineStringWithinPolygon(line, polygon) {
7259 // First, check if geometry points of line segments are all inside polygon
7260 for (let i = 0; i < line.length; ++i) {
7261 if (!pointWithinPolygon(line[i], polygon)) {
7262 return false;
7263 }
7264 }
7265 // Second, check if there is line segment intersecting polygon edge
7266 for (let i = 0; i < line.length - 1; ++i) {
7267 if (lineIntersectPolygon(line[i], line[i + 1], polygon)) {
7268 return false;
7269 }
7270 }
7271 return true;
7272}
7273function lineStringWithinPolygons(line, polygons) {
7274 for (let i = 0; i < polygons.length; i++) {
7275 if (lineStringWithinPolygon(line, polygons[i]))
7276 return true;
7277 }
7278 return false;
7279}
7280function getTilePolygon(coordinates, bbox, canonical) {
7281 const polygon = [];
7282 for (let i = 0; i < coordinates.length; i++) {
7283 const ring = [];
7284 for (let j = 0; j < coordinates[i].length; j++) {
7285 const coord = getTileCoordinates(coordinates[i][j], canonical);
7286 updateBBox(bbox, coord);
7287 ring.push(coord);
7288 }
7289 polygon.push(ring);
7290 }
7291 return polygon;
7292}
7293function getTilePolygons(coordinates, bbox, canonical) {
7294 const polygons = [];
7295 for (let i = 0; i < coordinates.length; i++) {
7296 const polygon = getTilePolygon(coordinates[i], bbox, canonical);
7297 polygons.push(polygon);
7298 }
7299 return polygons;
7300}
7301function updatePoint(p, bbox, polyBBox, worldSize) {
7302 if (p[0] < polyBBox[0] || p[0] > polyBBox[2]) {
7303 const halfWorldSize = worldSize * 0.5;
7304 let shift = (p[0] - polyBBox[0] > halfWorldSize) ? -worldSize : (polyBBox[0] - p[0] > halfWorldSize) ? worldSize : 0;
7305 if (shift === 0) {
7306 shift = (p[0] - polyBBox[2] > halfWorldSize) ? -worldSize : (polyBBox[2] - p[0] > halfWorldSize) ? worldSize : 0;
7307 }
7308 p[0] += shift;
7309 }
7310 updateBBox(bbox, p);
7311}
7312function resetBBox(bbox) {
7313 bbox[0] = bbox[1] = Infinity;
7314 bbox[2] = bbox[3] = -Infinity;
7315}
7316function getTilePoints(geometry, pointBBox, polyBBox, canonical) {
7317 const worldSize = Math.pow(2, canonical.z) * EXTENT$1;
7318 const shifts = [canonical.x * EXTENT$1, canonical.y * EXTENT$1];
7319 const tilePoints = [];
7320 for (const points of geometry) {
7321 for (const point of points) {
7322 const p = [point.x + shifts[0], point.y + shifts[1]];
7323 updatePoint(p, pointBBox, polyBBox, worldSize);
7324 tilePoints.push(p);
7325 }
7326 }
7327 return tilePoints;
7328}
7329function getTileLines(geometry, lineBBox, polyBBox, canonical) {
7330 const worldSize = Math.pow(2, canonical.z) * EXTENT$1;
7331 const shifts = [canonical.x * EXTENT$1, canonical.y * EXTENT$1];
7332 const tileLines = [];
7333 for (const line of geometry) {
7334 const tileLine = [];
7335 for (const point of line) {
7336 const p = [point.x + shifts[0], point.y + shifts[1]];
7337 updateBBox(lineBBox, p);
7338 tileLine.push(p);
7339 }
7340 tileLines.push(tileLine);
7341 }
7342 if (lineBBox[2] - lineBBox[0] <= worldSize / 2) {
7343 resetBBox(lineBBox);
7344 for (const line of tileLines) {
7345 for (const p of line) {
7346 updatePoint(p, lineBBox, polyBBox, worldSize);
7347 }
7348 }
7349 }
7350 return tileLines;
7351}
7352function pointsWithinPolygons(ctx, polygonGeometry) {
7353 const pointBBox = [Infinity, Infinity, -Infinity, -Infinity];
7354 const polyBBox = [Infinity, Infinity, -Infinity, -Infinity];
7355 const canonical = ctx.canonicalID();
7356 if (polygonGeometry.type === 'Polygon') {
7357 const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical);
7358 const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical);
7359 if (!boxWithinBox(pointBBox, polyBBox))
7360 return false;
7361 for (const point of tilePoints) {
7362 if (!pointWithinPolygon(point, tilePolygon))
7363 return false;
7364 }
7365 }
7366 if (polygonGeometry.type === 'MultiPolygon') {
7367 const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical);
7368 const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical);
7369 if (!boxWithinBox(pointBBox, polyBBox))
7370 return false;
7371 for (const point of tilePoints) {
7372 if (!pointWithinPolygons(point, tilePolygons))
7373 return false;
7374 }
7375 }
7376 return true;
7377}
7378function linesWithinPolygons(ctx, polygonGeometry) {
7379 const lineBBox = [Infinity, Infinity, -Infinity, -Infinity];
7380 const polyBBox = [Infinity, Infinity, -Infinity, -Infinity];
7381 const canonical = ctx.canonicalID();
7382 if (polygonGeometry.type === 'Polygon') {
7383 const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical);
7384 const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical);
7385 if (!boxWithinBox(lineBBox, polyBBox))
7386 return false;
7387 for (const line of tileLines) {
7388 if (!lineStringWithinPolygon(line, tilePolygon))
7389 return false;
7390 }
7391 }
7392 if (polygonGeometry.type === 'MultiPolygon') {
7393 const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical);
7394 const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical);
7395 if (!boxWithinBox(lineBBox, polyBBox))
7396 return false;
7397 for (const line of tileLines) {
7398 if (!lineStringWithinPolygons(line, tilePolygons))
7399 return false;
7400 }
7401 }
7402 return true;
7403}
7404class Within {
7405 constructor(geojson, geometries) {
7406 this.type = BooleanType;
7407 this.geojson = geojson;
7408 this.geometries = geometries;
7409 }
7410 static parse(args, context) {
7411 if (args.length !== 2)
7412 return context.error(`'within' expression requires exactly one argument, but found ${args.length - 1} instead.`);
7413 if (isValue(args[1])) {
7414 const geojson = args[1];
7415 if (geojson.type === 'FeatureCollection') {
7416 for (let i = 0; i < geojson.features.length; ++i) {
7417 const type = geojson.features[i].geometry.type;
7418 if (type === 'Polygon' || type === 'MultiPolygon') {
7419 return new Within(geojson, geojson.features[i].geometry);
7420 }
7421 }
7422 }
7423 else if (geojson.type === 'Feature') {
7424 const type = geojson.geometry.type;
7425 if (type === 'Polygon' || type === 'MultiPolygon') {
7426 return new Within(geojson, geojson.geometry);
7427 }
7428 }
7429 else if (geojson.type === 'Polygon' || geojson.type === 'MultiPolygon') {
7430 return new Within(geojson, geojson);
7431 }
7432 }
7433 return context.error('\'within\' expression requires valid geojson object that contains polygon geometry type.');
7434 }
7435 evaluate(ctx) {
7436 if (ctx.geometry() != null && ctx.canonicalID() != null) {
7437 if (ctx.geometryType() === 'Point') {
7438 return pointsWithinPolygons(ctx, this.geometries);
7439 }
7440 else if (ctx.geometryType() === 'LineString') {
7441 return linesWithinPolygons(ctx, this.geometries);
7442 }
7443 }
7444 return false;
7445 }
7446 eachChild() { }
7447 outputDefined() {
7448 return true;
7449 }
7450 serialize() {
7451 return ['within', this.geojson];
7452 }
7453}
7454
7455function isFeatureConstant(e) {
7456 if (e instanceof CompoundExpression) {
7457 if (e.name === 'get' && e.args.length === 1) {
7458 return false;
7459 }
7460 else if (e.name === 'feature-state') {
7461 return false;
7462 }
7463 else if (e.name === 'has' && e.args.length === 1) {
7464 return false;
7465 }
7466 else if (e.name === 'properties' ||
7467 e.name === 'geometry-type' ||
7468 e.name === 'id') {
7469 return false;
7470 }
7471 else if (/^filter-/.test(e.name)) {
7472 return false;
7473 }
7474 }
7475 if (e instanceof Within) {
7476 return false;
7477 }
7478 let result = true;
7479 e.eachChild(arg => {
7480 if (result && !isFeatureConstant(arg)) {
7481 result = false;
7482 }
7483 });
7484 return result;
7485}
7486function isStateConstant(e) {
7487 if (e instanceof CompoundExpression) {
7488 if (e.name === 'feature-state') {
7489 return false;
7490 }
7491 }
7492 let result = true;
7493 e.eachChild(arg => {
7494 if (result && !isStateConstant(arg)) {
7495 result = false;
7496 }
7497 });
7498 return result;
7499}
7500function isGlobalPropertyConstant(e, properties) {
7501 if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) {
7502 return false;
7503 }
7504 let result = true;
7505 e.eachChild((arg) => {
7506 if (result && !isGlobalPropertyConstant(arg, properties)) {
7507 result = false;
7508 }
7509 });
7510 return result;
7511}
7512
7513class Var {
7514 constructor(name, boundExpression) {
7515 this.type = boundExpression.type;
7516 this.name = name;
7517 this.boundExpression = boundExpression;
7518 }
7519 static parse(args, context) {
7520 if (args.length !== 2 || typeof args[1] !== 'string')
7521 return context.error('\'var\' expression requires exactly one string literal argument.');
7522 const name = args[1];
7523 if (!context.scope.has(name)) {
7524 return context.error(`Unknown variable "${name}". Make sure "${name}" has been bound in an enclosing "let" expression before using it.`, 1);
7525 }
7526 return new Var(name, context.scope.get(name));
7527 }
7528 evaluate(ctx) {
7529 return this.boundExpression.evaluate(ctx);
7530 }
7531 eachChild() { }
7532 outputDefined() {
7533 return false;
7534 }
7535 serialize() {
7536 return ['var', this.name];
7537 }
7538}
7539
7540/**
7541 * State associated parsing at a given point in an expression tree.
7542 * @private
7543 */
7544class ParsingContext {
7545 constructor(registry, path = [], expectedType, scope = new Scope(), errors = []) {
7546 this.registry = registry;
7547 this.path = path;
7548 this.key = path.map(part => `[${part}]`).join('');
7549 this.scope = scope;
7550 this.errors = errors;
7551 this.expectedType = expectedType;
7552 }
7553 /**
7554 * @param expr the JSON expression to parse
7555 * @param index the optional argument index if this expression is an argument of a parent expression that's being parsed
7556 * @param options
7557 * @param options.omitTypeAnnotations set true to omit inferred type annotations. Caller beware: with this option set, the parsed expression's type will NOT satisfy `expectedType` if it would normally be wrapped in an inferred annotation.
7558 * @private
7559 */
7560 parse(expr, index, expectedType, bindings, options = {}) {
7561 if (index) {
7562 return this.concat(index, expectedType, bindings)._parse(expr, options);
7563 }
7564 return this._parse(expr, options);
7565 }
7566 _parse(expr, options) {
7567 if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') {
7568 expr = ['literal', expr];
7569 }
7570 function annotate(parsed, type, typeAnnotation) {
7571 if (typeAnnotation === 'assert') {
7572 return new Assertion(type, [parsed]);
7573 }
7574 else if (typeAnnotation === 'coerce') {
7575 return new Coercion(type, [parsed]);
7576 }
7577 else {
7578 return parsed;
7579 }
7580 }
7581 if (Array.isArray(expr)) {
7582 if (expr.length === 0) {
7583 return this.error('Expected an array with at least one element. If you wanted a literal array, use ["literal", []].');
7584 }
7585 const op = expr[0];
7586 if (typeof op !== 'string') {
7587 this.error(`Expression name must be a string, but found ${typeof op} instead. If you wanted a literal array, use ["literal", [...]].`, 0);
7588 return null;
7589 }
7590 const Expr = this.registry[op];
7591 if (Expr) {
7592 let parsed = Expr.parse(expr, this);
7593 if (!parsed)
7594 return null;
7595 if (this.expectedType) {
7596 const expected = this.expectedType;
7597 const actual = parsed.type;
7598 // When we expect a number, string, boolean, or array but have a value, wrap it in an assertion.
7599 // When we expect a color or formatted string, but have a string or value, wrap it in a coercion.
7600 // Otherwise, we do static type-checking.
7601 //
7602 // These behaviors are overridable for:
7603 // * The "coalesce" operator, which needs to omit type annotations.
7604 // * String-valued properties (e.g. `text-field`), where coercion is more convenient than assertion.
7605 //
7606 if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') {
7607 parsed = annotate(parsed, expected, options.typeAnnotation || 'assert');
7608 }
7609 else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) {
7610 parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce');
7611 }
7612 else if (this.checkSubtype(expected, actual)) {
7613 return null;
7614 }
7615 }
7616 // If an expression's arguments are all literals, we can evaluate
7617 // it immediately and replace it with a literal value in the
7618 // parsed/compiled result. Expressions that expect an image should
7619 // not be resolved here so we can later get the available images.
7620 if (!(parsed instanceof Literal) && (parsed.type.kind !== 'resolvedImage') && isConstant(parsed)) {
7621 const ec = new EvaluationContext();
7622 try {
7623 parsed = new Literal(parsed.type, parsed.evaluate(ec));
7624 }
7625 catch (e) {
7626 this.error(e.message);
7627 return null;
7628 }
7629 }
7630 return parsed;
7631 }
7632 return this.error(`Unknown expression "${op}". If you wanted a literal array, use ["literal", [...]].`, 0);
7633 }
7634 else if (typeof expr === 'undefined') {
7635 return this.error('\'undefined\' value invalid. Use null instead.');
7636 }
7637 else if (typeof expr === 'object') {
7638 return this.error('Bare objects invalid. Use ["literal", {...}] instead.');
7639 }
7640 else {
7641 return this.error(`Expected an array, but found ${typeof expr} instead.`);
7642 }
7643 }
7644 /**
7645 * Returns a copy of this context suitable for parsing the subexpression at
7646 * index `index`, optionally appending to 'let' binding map.
7647 *
7648 * Note that `errors` property, intended for collecting errors while
7649 * parsing, is copied by reference rather than cloned.
7650 * @private
7651 */
7652 concat(index, expectedType, bindings) {
7653 const path = typeof index === 'number' ? this.path.concat(index) : this.path;
7654 const scope = bindings ? this.scope.concat(bindings) : this.scope;
7655 return new ParsingContext(this.registry, path, expectedType || null, scope, this.errors);
7656 }
7657 /**
7658 * Push a parsing (or type checking) error into the `this.errors`
7659 * @param error The message
7660 * @param keys Optionally specify the source of the error at a child
7661 * of the current expression at `this.key`.
7662 * @private
7663 */
7664 error(error, ...keys) {
7665 const key = `${this.key}${keys.map(k => `[${k}]`).join('')}`;
7666 this.errors.push(new ParsingError(key, error));
7667 }
7668 /**
7669 * Returns null if `t` is a subtype of `expected`; otherwise returns an
7670 * error message and also pushes it to `this.errors`.
7671 */
7672 checkSubtype(expected, t) {
7673 const error = checkSubtype(expected, t);
7674 if (error)
7675 this.error(error);
7676 return error;
7677 }
7678}
7679var ParsingContext$1 = ParsingContext;
7680function isConstant(expression) {
7681 if (expression instanceof Var) {
7682 return isConstant(expression.boundExpression);
7683 }
7684 else if (expression instanceof CompoundExpression && expression.name === 'error') {
7685 return false;
7686 }
7687 else if (expression instanceof CollatorExpression) {
7688 // Although the results of a Collator expression with fixed arguments
7689 // generally shouldn't change between executions, we can't serialize them
7690 // as constant expressions because results change based on environment.
7691 return false;
7692 }
7693 else if (expression instanceof Within) {
7694 return false;
7695 }
7696 const isTypeAnnotation = expression instanceof Coercion ||
7697 expression instanceof Assertion;
7698 let childrenConstant = true;
7699 expression.eachChild(child => {
7700 // We can _almost_ assume that if `expressions` children are constant,
7701 // they would already have been evaluated to Literal values when they
7702 // were parsed. Type annotations are the exception, because they might
7703 // have been inferred and added after a child was parsed.
7704 // So we recurse into isConstant() for the children of type annotations,
7705 // but otherwise simply check whether they are Literals.
7706 if (isTypeAnnotation) {
7707 childrenConstant = childrenConstant && isConstant(child);
7708 }
7709 else {
7710 childrenConstant = childrenConstant && child instanceof Literal;
7711 }
7712 });
7713 if (!childrenConstant) {
7714 return false;
7715 }
7716 return isFeatureConstant(expression) &&
7717 isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'accumulated', 'is-supported-script']);
7718}
7719
7720/**
7721 * Returns the index of the last stop <= input, or 0 if it doesn't exist.
7722 * @private
7723 */
7724function findStopLessThanOrEqualTo(stops, input) {
7725 const lastIndex = stops.length - 1;
7726 let lowerIndex = 0;
7727 let upperIndex = lastIndex;
7728 let currentIndex = 0;
7729 let currentValue, nextValue;
7730 while (lowerIndex <= upperIndex) {
7731 currentIndex = Math.floor((lowerIndex + upperIndex) / 2);
7732 currentValue = stops[currentIndex];
7733 nextValue = stops[currentIndex + 1];
7734 if (currentValue <= input) {
7735 if (currentIndex === lastIndex || input < nextValue) { // Search complete
7736 return currentIndex;
7737 }
7738 lowerIndex = currentIndex + 1;
7739 }
7740 else if (currentValue > input) {
7741 upperIndex = currentIndex - 1;
7742 }
7743 else {
7744 throw new RuntimeError('Input is not a number.');
7745 }
7746 }
7747 return 0;
7748}
7749
7750class Step {
7751 constructor(type, input, stops) {
7752 this.type = type;
7753 this.input = input;
7754 this.labels = [];
7755 this.outputs = [];
7756 for (const [label, expression] of stops) {
7757 this.labels.push(label);
7758 this.outputs.push(expression);
7759 }
7760 }
7761 static parse(args, context) {
7762 if (args.length - 1 < 4) {
7763 return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`);
7764 }
7765 if ((args.length - 1) % 2 !== 0) {
7766 return context.error('Expected an even number of arguments.');
7767 }
7768 const input = context.parse(args[1], 1, NumberType);
7769 if (!input)
7770 return null;
7771 const stops = [];
7772 let outputType = null;
7773 if (context.expectedType && context.expectedType.kind !== 'value') {
7774 outputType = context.expectedType;
7775 }
7776 for (let i = 1; i < args.length; i += 2) {
7777 const label = i === 1 ? -Infinity : args[i];
7778 const value = args[i + 1];
7779 const labelKey = i;
7780 const valueKey = i + 1;
7781 if (typeof label !== 'number') {
7782 return context.error('Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);
7783 }
7784 if (stops.length && stops[stops.length - 1][0] >= label) {
7785 return context.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.', labelKey);
7786 }
7787 const parsed = context.parse(value, valueKey, outputType);
7788 if (!parsed)
7789 return null;
7790 outputType = outputType || parsed.type;
7791 stops.push([label, parsed]);
7792 }
7793 return new Step(outputType, input, stops);
7794 }
7795 evaluate(ctx) {
7796 const labels = this.labels;
7797 const outputs = this.outputs;
7798 if (labels.length === 1) {
7799 return outputs[0].evaluate(ctx);
7800 }
7801 const value = this.input.evaluate(ctx);
7802 if (value <= labels[0]) {
7803 return outputs[0].evaluate(ctx);
7804 }
7805 const stopCount = labels.length;
7806 if (value >= labels[stopCount - 1]) {
7807 return outputs[stopCount - 1].evaluate(ctx);
7808 }
7809 const index = findStopLessThanOrEqualTo(labels, value);
7810 return outputs[index].evaluate(ctx);
7811 }
7812 eachChild(fn) {
7813 fn(this.input);
7814 for (const expression of this.outputs) {
7815 fn(expression);
7816 }
7817 }
7818 outputDefined() {
7819 return this.outputs.every(out => out.outputDefined());
7820 }
7821 serialize() {
7822 const serialized = ['step', this.input.serialize()];
7823 for (let i = 0; i < this.labels.length; i++) {
7824 if (i > 0) {
7825 serialized.push(this.labels[i]);
7826 }
7827 serialized.push(this.outputs[i].serialize());
7828 }
7829 return serialized;
7830 }
7831}
7832
7833function number(a, b, t) {
7834 return (a * (1 - t)) + (b * t);
7835}
7836function color(from, to, t) {
7837 return new Color(number(from.r, to.r, t), number(from.g, to.g, t), number(from.b, to.b, t), number(from.a, to.a, t));
7838}
7839function array(from, to, t) {
7840 return from.map((d, i) => {
7841 return number(d, to[i], t);
7842 });
7843}
7844
7845var interpolate = /*#__PURE__*/Object.freeze({
7846__proto__: null,
7847number: number,
7848color: color,
7849array: array
7850});
7851
7852// Constants
7853const Xn = 0.950470, // D65 standard referent
7854Yn = 1, Zn = 1.088830, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1, deg2rad = Math.PI / 180, rad2deg = 180 / Math.PI;
7855// Utilities
7856function xyz2lab(t) {
7857 return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
7858}
7859function lab2xyz(t) {
7860 return t > t1 ? t * t * t : t2 * (t - t0);
7861}
7862function xyz2rgb(x) {
7863 return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
7864}
7865function rgb2xyz(x) {
7866 x /= 255;
7867 return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
7868}
7869// LAB
7870function rgbToLab(rgbColor) {
7871 const b = rgb2xyz(rgbColor.r), a = rgb2xyz(rgbColor.g), l = rgb2xyz(rgbColor.b), x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
7872 return {
7873 l: 116 * y - 16,
7874 a: 500 * (x - y),
7875 b: 200 * (y - z),
7876 alpha: rgbColor.a
7877 };
7878}
7879function labToRgb(labColor) {
7880 let y = (labColor.l + 16) / 116, x = isNaN(labColor.a) ? y : y + labColor.a / 500, z = isNaN(labColor.b) ? y : y - labColor.b / 200;
7881 y = Yn * lab2xyz(y);
7882 x = Xn * lab2xyz(x);
7883 z = Zn * lab2xyz(z);
7884 return new Color(xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
7885 xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), labColor.alpha);
7886}
7887function interpolateLab(from, to, t) {
7888 return {
7889 l: number(from.l, to.l, t),
7890 a: number(from.a, to.a, t),
7891 b: number(from.b, to.b, t),
7892 alpha: number(from.alpha, to.alpha, t)
7893 };
7894}
7895// HCL
7896function rgbToHcl(rgbColor) {
7897 const { l, a, b } = rgbToLab(rgbColor);
7898 const h = Math.atan2(b, a) * rad2deg;
7899 return {
7900 h: h < 0 ? h + 360 : h,
7901 c: Math.sqrt(a * a + b * b),
7902 l,
7903 alpha: rgbColor.a
7904 };
7905}
7906function hclToRgb(hclColor) {
7907 const h = hclColor.h * deg2rad, c = hclColor.c, l = hclColor.l;
7908 return labToRgb({
7909 l,
7910 a: Math.cos(h) * c,
7911 b: Math.sin(h) * c,
7912 alpha: hclColor.alpha
7913 });
7914}
7915function interpolateHue(a, b, t) {
7916 const d = b - a;
7917 return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d);
7918}
7919function interpolateHcl(from, to, t) {
7920 return {
7921 h: interpolateHue(from.h, to.h, t),
7922 c: number(from.c, to.c, t),
7923 l: number(from.l, to.l, t),
7924 alpha: number(from.alpha, to.alpha, t)
7925 };
7926}
7927const lab = {
7928 forward: rgbToLab,
7929 reverse: labToRgb,
7930 interpolate: interpolateLab
7931};
7932const hcl = {
7933 forward: rgbToHcl,
7934 reverse: hclToRgb,
7935 interpolate: interpolateHcl
7936};
7937
7938var colorSpaces = /*#__PURE__*/Object.freeze({
7939__proto__: null,
7940lab: lab,
7941hcl: hcl
7942});
7943
7944class Interpolate {
7945 constructor(type, operator, interpolation, input, stops) {
7946 this.type = type;
7947 this.operator = operator;
7948 this.interpolation = interpolation;
7949 this.input = input;
7950 this.labels = [];
7951 this.outputs = [];
7952 for (const [label, expression] of stops) {
7953 this.labels.push(label);
7954 this.outputs.push(expression);
7955 }
7956 }
7957 static interpolationFactor(interpolation, input, lower, upper) {
7958 let t = 0;
7959 if (interpolation.name === 'exponential') {
7960 t = exponentialInterpolation(input, interpolation.base, lower, upper);
7961 }
7962 else if (interpolation.name === 'linear') {
7963 t = exponentialInterpolation(input, 1, lower, upper);
7964 }
7965 else if (interpolation.name === 'cubic-bezier') {
7966 const c = interpolation.controlPoints;
7967 const ub = new unitbezier(c[0], c[1], c[2], c[3]);
7968 t = ub.solve(exponentialInterpolation(input, 1, lower, upper));
7969 }
7970 return t;
7971 }
7972 static parse(args, context) {
7973 let [operator, interpolation, input, ...rest] = args;
7974 if (!Array.isArray(interpolation) || interpolation.length === 0) {
7975 return context.error('Expected an interpolation type expression.', 1);
7976 }
7977 if (interpolation[0] === 'linear') {
7978 interpolation = { name: 'linear' };
7979 }
7980 else if (interpolation[0] === 'exponential') {
7981 const base = interpolation[1];
7982 if (typeof base !== 'number')
7983 return context.error('Exponential interpolation requires a numeric base.', 1, 1);
7984 interpolation = {
7985 name: 'exponential',
7986 base
7987 };
7988 }
7989 else if (interpolation[0] === 'cubic-bezier') {
7990 const controlPoints = interpolation.slice(1);
7991 if (controlPoints.length !== 4 ||
7992 controlPoints.some(t => typeof t !== 'number' || t < 0 || t > 1)) {
7993 return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1);
7994 }
7995 interpolation = {
7996 name: 'cubic-bezier',
7997 controlPoints: controlPoints
7998 };
7999 }
8000 else {
8001 return context.error(`Unknown interpolation type ${String(interpolation[0])}`, 1, 0);
8002 }
8003 if (args.length - 1 < 4) {
8004 return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`);
8005 }
8006 if ((args.length - 1) % 2 !== 0) {
8007 return context.error('Expected an even number of arguments.');
8008 }
8009 input = context.parse(input, 2, NumberType);
8010 if (!input)
8011 return null;
8012 const stops = [];
8013 let outputType = null;
8014 if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') {
8015 outputType = ColorType;
8016 }
8017 else if (context.expectedType && context.expectedType.kind !== 'value') {
8018 outputType = context.expectedType;
8019 }
8020 for (let i = 0; i < rest.length; i += 2) {
8021 const label = rest[i];
8022 const value = rest[i + 1];
8023 const labelKey = i + 3;
8024 const valueKey = i + 4;
8025 if (typeof label !== 'number') {
8026 return context.error('Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);
8027 }
8028 if (stops.length && stops[stops.length - 1][0] >= label) {
8029 return context.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.', labelKey);
8030 }
8031 const parsed = context.parse(value, valueKey, outputType);
8032 if (!parsed)
8033 return null;
8034 outputType = outputType || parsed.type;
8035 stops.push([label, parsed]);
8036 }
8037 if (outputType.kind !== 'number' &&
8038 outputType.kind !== 'color' &&
8039 !(outputType.kind === 'array' &&
8040 outputType.itemType.kind === 'number' &&
8041 typeof outputType.N === 'number')) {
8042 return context.error(`Type ${toString$1(outputType)} is not interpolatable.`);
8043 }
8044 return new Interpolate(outputType, operator, interpolation, input, stops);
8045 }
8046 evaluate(ctx) {
8047 const labels = this.labels;
8048 const outputs = this.outputs;
8049 if (labels.length === 1) {
8050 return outputs[0].evaluate(ctx);
8051 }
8052 const value = this.input.evaluate(ctx);
8053 if (value <= labels[0]) {
8054 return outputs[0].evaluate(ctx);
8055 }
8056 const stopCount = labels.length;
8057 if (value >= labels[stopCount - 1]) {
8058 return outputs[stopCount - 1].evaluate(ctx);
8059 }
8060 const index = findStopLessThanOrEqualTo(labels, value);
8061 const lower = labels[index];
8062 const upper = labels[index + 1];
8063 const t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper);
8064 const outputLower = outputs[index].evaluate(ctx);
8065 const outputUpper = outputs[index + 1].evaluate(ctx);
8066 if (this.operator === 'interpolate') {
8067 return interpolate[this.type.kind.toLowerCase()](outputLower, outputUpper, t); // eslint-disable-line import/namespace
8068 }
8069 else if (this.operator === 'interpolate-hcl') {
8070 return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t));
8071 }
8072 else {
8073 return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t));
8074 }
8075 }
8076 eachChild(fn) {
8077 fn(this.input);
8078 for (const expression of this.outputs) {
8079 fn(expression);
8080 }
8081 }
8082 outputDefined() {
8083 return this.outputs.every(out => out.outputDefined());
8084 }
8085 serialize() {
8086 let interpolation;
8087 if (this.interpolation.name === 'linear') {
8088 interpolation = ['linear'];
8089 }
8090 else if (this.interpolation.name === 'exponential') {
8091 if (this.interpolation.base === 1) {
8092 interpolation = ['linear'];
8093 }
8094 else {
8095 interpolation = ['exponential', this.interpolation.base];
8096 }
8097 }
8098 else {
8099 interpolation = ['cubic-bezier'].concat(this.interpolation.controlPoints);
8100 }
8101 const serialized = [this.operator, interpolation, this.input.serialize()];
8102 for (let i = 0; i < this.labels.length; i++) {
8103 serialized.push(this.labels[i], this.outputs[i].serialize());
8104 }
8105 return serialized;
8106 }
8107}
8108/**
8109 * Returns a ratio that can be used to interpolate between exponential function
8110 * stops.
8111 * How it works: Two consecutive stop values define a (scaled and shifted) exponential function `f(x) = a * base^x + b`, where `base` is the user-specified base,
8112 * and `a` and `b` are constants affording sufficient degrees of freedom to fit
8113 * the function to the given stops.
8114 *
8115 * Here's a bit of algebra that lets us compute `f(x)` directly from the stop
8116 * values without explicitly solving for `a` and `b`:
8117 *
8118 * First stop value: `f(x0) = y0 = a * base^x0 + b`
8119 * Second stop value: `f(x1) = y1 = a * base^x1 + b`
8120 * => `y1 - y0 = a(base^x1 - base^x0)`
8121 * => `a = (y1 - y0)/(base^x1 - base^x0)`
8122 *
8123 * Desired value: `f(x) = y = a * base^x + b`
8124 * => `f(x) = y0 + a * (base^x - base^x0)`
8125 *
8126 * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a
8127 * little algebra:
8128 * ```
8129 * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0)
8130 * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0)
8131 * ```
8132 *
8133 * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have
8134 * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as
8135 * an interpolation factor between the two stops' output values.
8136 *
8137 * (Note: a slightly different form for `ratio`,
8138 * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer
8139 * expensive `Math.pow()` operations.)
8140 *
8141 * @private
8142*/
8143function exponentialInterpolation(input, base, lowerValue, upperValue) {
8144 const difference = upperValue - lowerValue;
8145 const progress = input - lowerValue;
8146 if (difference === 0) {
8147 return 0;
8148 }
8149 else if (base === 1) {
8150 return progress / difference;
8151 }
8152 else {
8153 return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);
8154 }
8155}
8156
8157class Coalesce {
8158 constructor(type, args) {
8159 this.type = type;
8160 this.args = args;
8161 }
8162 static parse(args, context) {
8163 if (args.length < 2) {
8164 return context.error('Expectected at least one argument.');
8165 }
8166 let outputType = null;
8167 const expectedType = context.expectedType;
8168 if (expectedType && expectedType.kind !== 'value') {
8169 outputType = expectedType;
8170 }
8171 const parsedArgs = [];
8172 for (const arg of args.slice(1)) {
8173 const parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, { typeAnnotation: 'omit' });
8174 if (!parsed)
8175 return null;
8176 outputType = outputType || parsed.type;
8177 parsedArgs.push(parsed);
8178 }
8179 assert$1(outputType);
8180 // Above, we parse arguments without inferred type annotation so that
8181 // they don't produce a runtime error for `null` input, which would
8182 // preempt the desired null-coalescing behavior.
8183 // Thus, if any of our arguments would have needed an annotation, we
8184 // need to wrap the enclosing coalesce expression with it instead.
8185 const needsAnnotation = expectedType &&
8186 parsedArgs.some(arg => checkSubtype(expectedType, arg.type));
8187 return needsAnnotation ?
8188 new Coalesce(ValueType, parsedArgs) :
8189 new Coalesce(outputType, parsedArgs);
8190 }
8191 evaluate(ctx) {
8192 let result = null;
8193 let argCount = 0;
8194 let requestedImageName;
8195 for (const arg of this.args) {
8196 argCount++;
8197 result = arg.evaluate(ctx);
8198 // we need to keep track of the first requested image in a coalesce statement
8199 // if coalesce can't find a valid image, we return the first image name so styleimagemissing can fire
8200 if (result && result instanceof ResolvedImage && !result.available) {
8201 if (!requestedImageName) {
8202 requestedImageName = result.name;
8203 }
8204 result = null;
8205 if (argCount === this.args.length) {
8206 result = requestedImageName;
8207 }
8208 }
8209 if (result !== null)
8210 break;
8211 }
8212 return result;
8213 }
8214 eachChild(fn) {
8215 this.args.forEach(fn);
8216 }
8217 outputDefined() {
8218 return this.args.every(arg => arg.outputDefined());
8219 }
8220 serialize() {
8221 const serialized = ['coalesce'];
8222 this.eachChild(child => { serialized.push(child.serialize()); });
8223 return serialized;
8224 }
8225}
8226
8227class Let {
8228 constructor(bindings, result) {
8229 this.type = result.type;
8230 this.bindings = [].concat(bindings);
8231 this.result = result;
8232 }
8233 evaluate(ctx) {
8234 return this.result.evaluate(ctx);
8235 }
8236 eachChild(fn) {
8237 for (const binding of this.bindings) {
8238 fn(binding[1]);
8239 }
8240 fn(this.result);
8241 }
8242 static parse(args, context) {
8243 if (args.length < 4)
8244 return context.error(`Expected at least 3 arguments, but found ${args.length - 1} instead.`);
8245 const bindings = [];
8246 for (let i = 1; i < args.length - 1; i += 2) {
8247 const name = args[i];
8248 if (typeof name !== 'string') {
8249 return context.error(`Expected string, but found ${typeof name} instead.`, i);
8250 }
8251 if (/[^a-zA-Z0-9_]/.test(name)) {
8252 return context.error('Variable names must contain only alphanumeric characters or \'_\'.', i);
8253 }
8254 const value = context.parse(args[i + 1], i + 1);
8255 if (!value)
8256 return null;
8257 bindings.push([name, value]);
8258 }
8259 const result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings);
8260 if (!result)
8261 return null;
8262 return new Let(bindings, result);
8263 }
8264 outputDefined() {
8265 return this.result.outputDefined();
8266 }
8267 serialize() {
8268 const serialized = ['let'];
8269 for (const [name, expr] of this.bindings) {
8270 serialized.push(name, expr.serialize());
8271 }
8272 serialized.push(this.result.serialize());
8273 return serialized;
8274 }
8275}
8276
8277class At {
8278 constructor(type, index, input) {
8279 this.type = type;
8280 this.index = index;
8281 this.input = input;
8282 }
8283 static parse(args, context) {
8284 if (args.length !== 3)
8285 return context.error(`Expected 2 arguments, but found ${args.length - 1} instead.`);
8286 const index = context.parse(args[1], 1, NumberType);
8287 const input = context.parse(args[2], 2, array$1(context.expectedType || ValueType));
8288 if (!index || !input)
8289 return null;
8290 const t = input.type;
8291 return new At(t.itemType, index, input);
8292 }
8293 evaluate(ctx) {
8294 const index = this.index.evaluate(ctx);
8295 const array = this.input.evaluate(ctx);
8296 if (index < 0) {
8297 throw new RuntimeError(`Array index out of bounds: ${index} < 0.`);
8298 }
8299 if (index >= array.length) {
8300 throw new RuntimeError(`Array index out of bounds: ${index} > ${array.length - 1}.`);
8301 }
8302 if (index !== Math.floor(index)) {
8303 throw new RuntimeError(`Array index must be an integer, but found ${index} instead.`);
8304 }
8305 return array[index];
8306 }
8307 eachChild(fn) {
8308 fn(this.index);
8309 fn(this.input);
8310 }
8311 outputDefined() {
8312 return false;
8313 }
8314 serialize() {
8315 return ['at', this.index.serialize(), this.input.serialize()];
8316 }
8317}
8318
8319class In {
8320 constructor(needle, haystack) {
8321 this.type = BooleanType;
8322 this.needle = needle;
8323 this.haystack = haystack;
8324 }
8325 static parse(args, context) {
8326 if (args.length !== 3) {
8327 return context.error(`Expected 2 arguments, but found ${args.length - 1} instead.`);
8328 }
8329 const needle = context.parse(args[1], 1, ValueType);
8330 const haystack = context.parse(args[2], 2, ValueType);
8331 if (!needle || !haystack)
8332 return null;
8333 if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) {
8334 return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(needle.type)} instead`);
8335 }
8336 return new In(needle, haystack);
8337 }
8338 evaluate(ctx) {
8339 const needle = this.needle.evaluate(ctx);
8340 const haystack = this.haystack.evaluate(ctx);
8341 if (!haystack)
8342 return false;
8343 if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) {
8344 throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(typeOf(needle))} instead.`);
8345 }
8346 if (!isValidNativeType(haystack, ['string', 'array'])) {
8347 throw new RuntimeError(`Expected second argument to be of type array or string, but found ${toString$1(typeOf(haystack))} instead.`);
8348 }
8349 return haystack.indexOf(needle) >= 0;
8350 }
8351 eachChild(fn) {
8352 fn(this.needle);
8353 fn(this.haystack);
8354 }
8355 outputDefined() {
8356 return true;
8357 }
8358 serialize() {
8359 return ['in', this.needle.serialize(), this.haystack.serialize()];
8360 }
8361}
8362
8363class IndexOf {
8364 constructor(needle, haystack, fromIndex) {
8365 this.type = NumberType;
8366 this.needle = needle;
8367 this.haystack = haystack;
8368 this.fromIndex = fromIndex;
8369 }
8370 static parse(args, context) {
8371 if (args.length <= 2 || args.length >= 5) {
8372 return context.error(`Expected 3 or 4 arguments, but found ${args.length - 1} instead.`);
8373 }
8374 const needle = context.parse(args[1], 1, ValueType);
8375 const haystack = context.parse(args[2], 2, ValueType);
8376 if (!needle || !haystack)
8377 return null;
8378 if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) {
8379 return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(needle.type)} instead`);
8380 }
8381 if (args.length === 4) {
8382 const fromIndex = context.parse(args[3], 3, NumberType);
8383 if (!fromIndex)
8384 return null;
8385 return new IndexOf(needle, haystack, fromIndex);
8386 }
8387 else {
8388 return new IndexOf(needle, haystack);
8389 }
8390 }
8391 evaluate(ctx) {
8392 const needle = this.needle.evaluate(ctx);
8393 const haystack = this.haystack.evaluate(ctx);
8394 if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) {
8395 throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(typeOf(needle))} instead.`);
8396 }
8397 if (!isValidNativeType(haystack, ['string', 'array'])) {
8398 throw new RuntimeError(`Expected second argument to be of type array or string, but found ${toString$1(typeOf(haystack))} instead.`);
8399 }
8400 if (this.fromIndex) {
8401 const fromIndex = this.fromIndex.evaluate(ctx);
8402 return haystack.indexOf(needle, fromIndex);
8403 }
8404 return haystack.indexOf(needle);
8405 }
8406 eachChild(fn) {
8407 fn(this.needle);
8408 fn(this.haystack);
8409 if (this.fromIndex) {
8410 fn(this.fromIndex);
8411 }
8412 }
8413 outputDefined() {
8414 return false;
8415 }
8416 serialize() {
8417 if (this.fromIndex != null && this.fromIndex !== undefined) {
8418 const fromIndex = this.fromIndex.serialize();
8419 return ['index-of', this.needle.serialize(), this.haystack.serialize(), fromIndex];
8420 }
8421 return ['index-of', this.needle.serialize(), this.haystack.serialize()];
8422 }
8423}
8424
8425class Match {
8426 constructor(inputType, outputType, input, cases, outputs, otherwise) {
8427 this.inputType = inputType;
8428 this.type = outputType;
8429 this.input = input;
8430 this.cases = cases;
8431 this.outputs = outputs;
8432 this.otherwise = otherwise;
8433 }
8434 static parse(args, context) {
8435 if (args.length < 5)
8436 return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`);
8437 if (args.length % 2 !== 1)
8438 return context.error('Expected an even number of arguments.');
8439 let inputType;
8440 let outputType;
8441 if (context.expectedType && context.expectedType.kind !== 'value') {
8442 outputType = context.expectedType;
8443 }
8444 const cases = {};
8445 const outputs = [];
8446 for (let i = 2; i < args.length - 1; i += 2) {
8447 let labels = args[i];
8448 const value = args[i + 1];
8449 if (!Array.isArray(labels)) {
8450 labels = [labels];
8451 }
8452 const labelContext = context.concat(i);
8453 if (labels.length === 0) {
8454 return labelContext.error('Expected at least one branch label.');
8455 }
8456 for (const label of labels) {
8457 if (typeof label !== 'number' && typeof label !== 'string') {
8458 return labelContext.error('Branch labels must be numbers or strings.');
8459 }
8460 else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) {
8461 return labelContext.error(`Branch labels must be integers no larger than ${Number.MAX_SAFE_INTEGER}.`);
8462 }
8463 else if (typeof label === 'number' && Math.floor(label) !== label) {
8464 return labelContext.error('Numeric branch labels must be integer values.');
8465 }
8466 else if (!inputType) {
8467 inputType = typeOf(label);
8468 }
8469 else if (labelContext.checkSubtype(inputType, typeOf(label))) {
8470 return null;
8471 }
8472 if (typeof cases[String(label)] !== 'undefined') {
8473 return labelContext.error('Branch labels must be unique.');
8474 }
8475 cases[String(label)] = outputs.length;
8476 }
8477 const result = context.parse(value, i, outputType);
8478 if (!result)
8479 return null;
8480 outputType = outputType || result.type;
8481 outputs.push(result);
8482 }
8483 const input = context.parse(args[1], 1, ValueType);
8484 if (!input)
8485 return null;
8486 const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);
8487 if (!otherwise)
8488 return null;
8489 assert$1(inputType && outputType);
8490 if (input.type.kind !== 'value' && context.concat(1).checkSubtype(inputType, input.type)) {
8491 return null;
8492 }
8493 return new Match(inputType, outputType, input, cases, outputs, otherwise);
8494 }
8495 evaluate(ctx) {
8496 const input = this.input.evaluate(ctx);
8497 const output = (typeOf(input) === this.inputType && this.outputs[this.cases[input]]) || this.otherwise;
8498 return output.evaluate(ctx);
8499 }
8500 eachChild(fn) {
8501 fn(this.input);
8502 this.outputs.forEach(fn);
8503 fn(this.otherwise);
8504 }
8505 outputDefined() {
8506 return this.outputs.every(out => out.outputDefined()) && this.otherwise.outputDefined();
8507 }
8508 serialize() {
8509 const serialized = ['match', this.input.serialize()];
8510 // Sort so serialization has an arbitrary defined order, even though
8511 // branch order doesn't affect evaluation
8512 const sortedLabels = Object.keys(this.cases).sort();
8513 // Group branches by unique match expression to support condensed
8514 // serializations of the form [case1, case2, ...] -> matchExpression
8515 const groupedByOutput = [];
8516 const outputLookup = {}; // lookup index into groupedByOutput for a given output expression
8517 for (const label of sortedLabels) {
8518 const outputIndex = outputLookup[this.cases[label]];
8519 if (outputIndex === undefined) {
8520 // First time seeing this output, add it to the end of the grouped list
8521 outputLookup[this.cases[label]] = groupedByOutput.length;
8522 groupedByOutput.push([this.cases[label], [label]]);
8523 }
8524 else {
8525 // We've seen this expression before, add the label to that output's group
8526 groupedByOutput[outputIndex][1].push(label);
8527 }
8528 }
8529 const coerceLabel = (label) => this.inputType.kind === 'number' ? Number(label) : label;
8530 for (const [outputIndex, labels] of groupedByOutput) {
8531 if (labels.length === 1) {
8532 // Only a single label matches this output expression
8533 serialized.push(coerceLabel(labels[0]));
8534 }
8535 else {
8536 // Array of literal labels pointing to this output expression
8537 serialized.push(labels.map(coerceLabel));
8538 }
8539 serialized.push(this.outputs[outputIndex].serialize());
8540 }
8541 serialized.push(this.otherwise.serialize());
8542 return serialized;
8543 }
8544}
8545
8546class Case {
8547 constructor(type, branches, otherwise) {
8548 this.type = type;
8549 this.branches = branches;
8550 this.otherwise = otherwise;
8551 }
8552 static parse(args, context) {
8553 if (args.length < 4)
8554 return context.error(`Expected at least 3 arguments, but found only ${args.length - 1}.`);
8555 if (args.length % 2 !== 0)
8556 return context.error('Expected an odd number of arguments.');
8557 let outputType;
8558 if (context.expectedType && context.expectedType.kind !== 'value') {
8559 outputType = context.expectedType;
8560 }
8561 const branches = [];
8562 for (let i = 1; i < args.length - 1; i += 2) {
8563 const test = context.parse(args[i], i, BooleanType);
8564 if (!test)
8565 return null;
8566 const result = context.parse(args[i + 1], i + 1, outputType);
8567 if (!result)
8568 return null;
8569 branches.push([test, result]);
8570 outputType = outputType || result.type;
8571 }
8572 const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);
8573 if (!otherwise)
8574 return null;
8575 assert$1(outputType);
8576 return new Case(outputType, branches, otherwise);
8577 }
8578 evaluate(ctx) {
8579 for (const [test, expression] of this.branches) {
8580 if (test.evaluate(ctx)) {
8581 return expression.evaluate(ctx);
8582 }
8583 }
8584 return this.otherwise.evaluate(ctx);
8585 }
8586 eachChild(fn) {
8587 for (const [test, expression] of this.branches) {
8588 fn(test);
8589 fn(expression);
8590 }
8591 fn(this.otherwise);
8592 }
8593 outputDefined() {
8594 return this.branches.every(([_, out]) => out.outputDefined()) && this.otherwise.outputDefined();
8595 }
8596 serialize() {
8597 const serialized = ['case'];
8598 this.eachChild(child => { serialized.push(child.serialize()); });
8599 return serialized;
8600 }
8601}
8602
8603class Slice {
8604 constructor(type, input, beginIndex, endIndex) {
8605 this.type = type;
8606 this.input = input;
8607 this.beginIndex = beginIndex;
8608 this.endIndex = endIndex;
8609 }
8610 static parse(args, context) {
8611 if (args.length <= 2 || args.length >= 5) {
8612 return context.error(`Expected 3 or 4 arguments, but found ${args.length - 1} instead.`);
8613 }
8614 const input = context.parse(args[1], 1, ValueType);
8615 const beginIndex = context.parse(args[2], 2, NumberType);
8616 if (!input || !beginIndex)
8617 return null;
8618 if (!isValidType(input.type, [array$1(ValueType), StringType, ValueType])) {
8619 return context.error(`Expected first argument to be of type array or string, but found ${toString$1(input.type)} instead`);
8620 }
8621 if (args.length === 4) {
8622 const endIndex = context.parse(args[3], 3, NumberType);
8623 if (!endIndex)
8624 return null;
8625 return new Slice(input.type, input, beginIndex, endIndex);
8626 }
8627 else {
8628 return new Slice(input.type, input, beginIndex);
8629 }
8630 }
8631 evaluate(ctx) {
8632 const input = this.input.evaluate(ctx);
8633 const beginIndex = this.beginIndex.evaluate(ctx);
8634 if (!isValidNativeType(input, ['string', 'array'])) {
8635 throw new RuntimeError(`Expected first argument to be of type array or string, but found ${toString$1(typeOf(input))} instead.`);
8636 }
8637 if (this.endIndex) {
8638 const endIndex = this.endIndex.evaluate(ctx);
8639 return input.slice(beginIndex, endIndex);
8640 }
8641 return input.slice(beginIndex);
8642 }
8643 eachChild(fn) {
8644 fn(this.input);
8645 fn(this.beginIndex);
8646 if (this.endIndex) {
8647 fn(this.endIndex);
8648 }
8649 }
8650 outputDefined() {
8651 return false;
8652 }
8653 serialize() {
8654 if (this.endIndex != null && this.endIndex !== undefined) {
8655 const endIndex = this.endIndex.serialize();
8656 return ['slice', this.input.serialize(), this.beginIndex.serialize(), endIndex];
8657 }
8658 return ['slice', this.input.serialize(), this.beginIndex.serialize()];
8659 }
8660}
8661
8662function isComparableType(op, type) {
8663 if (op === '==' || op === '!=') {
8664 // equality operator
8665 return type.kind === 'boolean' ||
8666 type.kind === 'string' ||
8667 type.kind === 'number' ||
8668 type.kind === 'null' ||
8669 type.kind === 'value';
8670 }
8671 else {
8672 // ordering operator
8673 return type.kind === 'string' ||
8674 type.kind === 'number' ||
8675 type.kind === 'value';
8676 }
8677}
8678function eq(ctx, a, b) { return a === b; }
8679function neq(ctx, a, b) { return a !== b; }
8680function lt(ctx, a, b) { return a < b; }
8681function gt(ctx, a, b) { return a > b; }
8682function lteq(ctx, a, b) { return a <= b; }
8683function gteq(ctx, a, b) { return a >= b; }
8684function eqCollate(ctx, a, b, c) { return c.compare(a, b) === 0; }
8685function neqCollate(ctx, a, b, c) { return !eqCollate(ctx, a, b, c); }
8686function ltCollate(ctx, a, b, c) { return c.compare(a, b) < 0; }
8687function gtCollate(ctx, a, b, c) { return c.compare(a, b) > 0; }
8688function lteqCollate(ctx, a, b, c) { return c.compare(a, b) <= 0; }
8689function gteqCollate(ctx, a, b, c) { return c.compare(a, b) >= 0; }
8690/**
8691 * Special form for comparison operators, implementing the signatures:
8692 * - (T, T, ?Collator) => boolean
8693 * - (T, value, ?Collator) => boolean
8694 * - (value, T, ?Collator) => boolean
8695 *
8696 * For inequalities, T must be either value, string, or number. For ==/!=, it
8697 * can also be boolean or null.
8698 *
8699 * Equality semantics are equivalent to Javascript's strict equality (===/!==)
8700 * -- i.e., when the arguments' types don't match, == evaluates to false, != to
8701 * true.
8702 *
8703 * When types don't match in an ordering comparison, a runtime error is thrown.
8704 *
8705 * @private
8706 */
8707function makeComparison(op, compareBasic, compareWithCollator) {
8708 const isOrderComparison = op !== '==' && op !== '!=';
8709 return class Comparison {
8710 constructor(lhs, rhs, collator) {
8711 this.type = BooleanType;
8712 this.lhs = lhs;
8713 this.rhs = rhs;
8714 this.collator = collator;
8715 this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value';
8716 }
8717 static parse(args, context) {
8718 if (args.length !== 3 && args.length !== 4)
8719 return context.error('Expected two or three arguments.');
8720 const op = args[0];
8721 let lhs = context.parse(args[1], 1, ValueType);
8722 if (!lhs)
8723 return null;
8724 if (!isComparableType(op, lhs.type)) {
8725 return context.concat(1).error(`"${op}" comparisons are not supported for type '${toString$1(lhs.type)}'.`);
8726 }
8727 let rhs = context.parse(args[2], 2, ValueType);
8728 if (!rhs)
8729 return null;
8730 if (!isComparableType(op, rhs.type)) {
8731 return context.concat(2).error(`"${op}" comparisons are not supported for type '${toString$1(rhs.type)}'.`);
8732 }
8733 if (lhs.type.kind !== rhs.type.kind &&
8734 lhs.type.kind !== 'value' &&
8735 rhs.type.kind !== 'value') {
8736 return context.error(`Cannot compare types '${toString$1(lhs.type)}' and '${toString$1(rhs.type)}'.`);
8737 }
8738 if (isOrderComparison) {
8739 // typing rules specific to less/greater than operators
8740 if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') {
8741 // (value, T)
8742 lhs = new Assertion(rhs.type, [lhs]);
8743 }
8744 else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') {
8745 // (T, value)
8746 rhs = new Assertion(lhs.type, [rhs]);
8747 }
8748 }
8749 let collator = null;
8750 if (args.length === 4) {
8751 if (lhs.type.kind !== 'string' &&
8752 rhs.type.kind !== 'string' &&
8753 lhs.type.kind !== 'value' &&
8754 rhs.type.kind !== 'value') {
8755 return context.error('Cannot use collator to compare non-string types.');
8756 }
8757 collator = context.parse(args[3], 3, CollatorType);
8758 if (!collator)
8759 return null;
8760 }
8761 return new Comparison(lhs, rhs, collator);
8762 }
8763 evaluate(ctx) {
8764 const lhs = this.lhs.evaluate(ctx);
8765 const rhs = this.rhs.evaluate(ctx);
8766 if (isOrderComparison && this.hasUntypedArgument) {
8767 const lt = typeOf(lhs);
8768 const rt = typeOf(rhs);
8769 // check that type is string or number, and equal
8770 if (lt.kind !== rt.kind || !(lt.kind === 'string' || lt.kind === 'number')) {
8771 throw new RuntimeError(`Expected arguments for "${op}" to be (string, string) or (number, number), but found (${lt.kind}, ${rt.kind}) instead.`);
8772 }
8773 }
8774 if (this.collator && !isOrderComparison && this.hasUntypedArgument) {
8775 const lt = typeOf(lhs);
8776 const rt = typeOf(rhs);
8777 if (lt.kind !== 'string' || rt.kind !== 'string') {
8778 return compareBasic(ctx, lhs, rhs);
8779 }
8780 }
8781 return this.collator ?
8782 compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) :
8783 compareBasic(ctx, lhs, rhs);
8784 }
8785 eachChild(fn) {
8786 fn(this.lhs);
8787 fn(this.rhs);
8788 if (this.collator) {
8789 fn(this.collator);
8790 }
8791 }
8792 outputDefined() {
8793 return true;
8794 }
8795 serialize() {
8796 const serialized = [op];
8797 this.eachChild(child => { serialized.push(child.serialize()); });
8798 return serialized;
8799 }
8800 };
8801}
8802const Equals = makeComparison('==', eq, eqCollate);
8803const NotEquals = makeComparison('!=', neq, neqCollate);
8804const LessThan = makeComparison('<', lt, ltCollate);
8805const GreaterThan = makeComparison('>', gt, gtCollate);
8806const LessThanOrEqual = makeComparison('<=', lteq, lteqCollate);
8807const GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate);
8808
8809class NumberFormat {
8810 constructor(number, locale, currency, minFractionDigits, maxFractionDigits) {
8811 this.type = StringType;
8812 this.number = number;
8813 this.locale = locale;
8814 this.currency = currency;
8815 this.minFractionDigits = minFractionDigits;
8816 this.maxFractionDigits = maxFractionDigits;
8817 }
8818 static parse(args, context) {
8819 if (args.length !== 3)
8820 return context.error('Expected two arguments.');
8821 const number = context.parse(args[1], 1, NumberType);
8822 if (!number)
8823 return null;
8824 const options = args[2];
8825 if (typeof options !== 'object' || Array.isArray(options))
8826 return context.error('NumberFormat options argument must be an object.');
8827 let locale = null;
8828 if (options['locale']) {
8829 locale = context.parse(options['locale'], 1, StringType);
8830 if (!locale)
8831 return null;
8832 }
8833 let currency = null;
8834 if (options['currency']) {
8835 currency = context.parse(options['currency'], 1, StringType);
8836 if (!currency)
8837 return null;
8838 }
8839 let minFractionDigits = null;
8840 if (options['min-fraction-digits']) {
8841 minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType);
8842 if (!minFractionDigits)
8843 return null;
8844 }
8845 let maxFractionDigits = null;
8846 if (options['max-fraction-digits']) {
8847 maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType);
8848 if (!maxFractionDigits)
8849 return null;
8850 }
8851 return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits);
8852 }
8853 evaluate(ctx) {
8854 return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [], {
8855 style: this.currency ? 'currency' : 'decimal',
8856 currency: this.currency ? this.currency.evaluate(ctx) : undefined,
8857 minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined,
8858 maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined,
8859 }).format(this.number.evaluate(ctx));
8860 }
8861 eachChild(fn) {
8862 fn(this.number);
8863 if (this.locale) {
8864 fn(this.locale);
8865 }
8866 if (this.currency) {
8867 fn(this.currency);
8868 }
8869 if (this.minFractionDigits) {
8870 fn(this.minFractionDigits);
8871 }
8872 if (this.maxFractionDigits) {
8873 fn(this.maxFractionDigits);
8874 }
8875 }
8876 outputDefined() {
8877 return false;
8878 }
8879 serialize() {
8880 const options = {};
8881 if (this.locale) {
8882 options['locale'] = this.locale.serialize();
8883 }
8884 if (this.currency) {
8885 options['currency'] = this.currency.serialize();
8886 }
8887 if (this.minFractionDigits) {
8888 options['min-fraction-digits'] = this.minFractionDigits.serialize();
8889 }
8890 if (this.maxFractionDigits) {
8891 options['max-fraction-digits'] = this.maxFractionDigits.serialize();
8892 }
8893 return ['number-format', this.number.serialize(), options];
8894 }
8895}
8896
8897class Length {
8898 constructor(input) {
8899 this.type = NumberType;
8900 this.input = input;
8901 }
8902 static parse(args, context) {
8903 if (args.length !== 2)
8904 return context.error(`Expected 1 argument, but found ${args.length - 1} instead.`);
8905 const input = context.parse(args[1], 1);
8906 if (!input)
8907 return null;
8908 if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value')
8909 return context.error(`Expected argument of type string or array, but found ${toString$1(input.type)} instead.`);
8910 return new Length(input);
8911 }
8912 evaluate(ctx) {
8913 const input = this.input.evaluate(ctx);
8914 if (typeof input === 'string') {
8915 return input.length;
8916 }
8917 else if (Array.isArray(input)) {
8918 return input.length;
8919 }
8920 else {
8921 throw new RuntimeError(`Expected value to be of type string or array, but found ${toString$1(typeOf(input))} instead.`);
8922 }
8923 }
8924 eachChild(fn) {
8925 fn(this.input);
8926 }
8927 outputDefined() {
8928 return false;
8929 }
8930 serialize() {
8931 const serialized = ['length'];
8932 this.eachChild(child => { serialized.push(child.serialize()); });
8933 return serialized;
8934 }
8935}
8936
8937const expressions = {
8938 // special forms
8939 '==': Equals,
8940 '!=': NotEquals,
8941 '>': GreaterThan,
8942 '<': LessThan,
8943 '>=': GreaterThanOrEqual,
8944 '<=': LessThanOrEqual,
8945 'array': Assertion,
8946 'at': At,
8947 'boolean': Assertion,
8948 'case': Case,
8949 'coalesce': Coalesce,
8950 'collator': CollatorExpression,
8951 'format': FormatExpression,
8952 'image': ImageExpression,
8953 'in': In,
8954 'index-of': IndexOf,
8955 'interpolate': Interpolate,
8956 'interpolate-hcl': Interpolate,
8957 'interpolate-lab': Interpolate,
8958 'length': Length,
8959 'let': Let,
8960 'literal': Literal,
8961 'match': Match,
8962 'number': Assertion,
8963 'number-format': NumberFormat,
8964 'object': Assertion,
8965 'slice': Slice,
8966 'step': Step,
8967 'string': Assertion,
8968 'to-boolean': Coercion,
8969 'to-color': Coercion,
8970 'to-number': Coercion,
8971 'to-string': Coercion,
8972 'var': Var,
8973 'within': Within
8974};
8975function rgba(ctx, [r, g, b, a]) {
8976 r = r.evaluate(ctx);
8977 g = g.evaluate(ctx);
8978 b = b.evaluate(ctx);
8979 const alpha = a ? a.evaluate(ctx) : 1;
8980 const error = validateRGBA(r, g, b, alpha);
8981 if (error)
8982 throw new RuntimeError(error);
8983 return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha);
8984}
8985function has(key, obj) {
8986 return key in obj;
8987}
8988function get(key, obj) {
8989 const v = obj[key];
8990 return typeof v === 'undefined' ? null : v;
8991}
8992function binarySearch(v, a, i, j) {
8993 while (i <= j) {
8994 const m = (i + j) >> 1;
8995 if (a[m] === v)
8996 return true;
8997 if (a[m] > v)
8998 j = m - 1;
8999 else
9000 i = m + 1;
9001 }
9002 return false;
9003}
9004function varargs(type) {
9005 return { type };
9006}
9007CompoundExpression.register(expressions, {
9008 'error': [
9009 ErrorType,
9010 [StringType],
9011 (ctx, [v]) => { throw new RuntimeError(v.evaluate(ctx)); }
9012 ],
9013 'typeof': [
9014 StringType,
9015 [ValueType],
9016 (ctx, [v]) => toString$1(typeOf(v.evaluate(ctx)))
9017 ],
9018 'to-rgba': [
9019 array$1(NumberType, 4),
9020 [ColorType],
9021 (ctx, [v]) => {
9022 return v.evaluate(ctx).toArray();
9023 }
9024 ],
9025 'rgb': [
9026 ColorType,
9027 [NumberType, NumberType, NumberType],
9028 rgba
9029 ],
9030 'rgba': [
9031 ColorType,
9032 [NumberType, NumberType, NumberType, NumberType],
9033 rgba
9034 ],
9035 'has': {
9036 type: BooleanType,
9037 overloads: [
9038 [
9039 [StringType],
9040 (ctx, [key]) => has(key.evaluate(ctx), ctx.properties())
9041 ], [
9042 [StringType, ObjectType],
9043 (ctx, [key, obj]) => has(key.evaluate(ctx), obj.evaluate(ctx))
9044 ]
9045 ]
9046 },
9047 'get': {
9048 type: ValueType,
9049 overloads: [
9050 [
9051 [StringType],
9052 (ctx, [key]) => get(key.evaluate(ctx), ctx.properties())
9053 ], [
9054 [StringType, ObjectType],
9055 (ctx, [key, obj]) => get(key.evaluate(ctx), obj.evaluate(ctx))
9056 ]
9057 ]
9058 },
9059 'feature-state': [
9060 ValueType,
9061 [StringType],
9062 (ctx, [key]) => get(key.evaluate(ctx), ctx.featureState || {})
9063 ],
9064 'properties': [
9065 ObjectType,
9066 [],
9067 (ctx) => ctx.properties()
9068 ],
9069 'geometry-type': [
9070 StringType,
9071 [],
9072 (ctx) => ctx.geometryType()
9073 ],
9074 'id': [
9075 ValueType,
9076 [],
9077 (ctx) => ctx.id()
9078 ],
9079 'zoom': [
9080 NumberType,
9081 [],
9082 (ctx) => ctx.globals.zoom
9083 ],
9084 'heatmap-density': [
9085 NumberType,
9086 [],
9087 (ctx) => ctx.globals.heatmapDensity || 0
9088 ],
9089 'line-progress': [
9090 NumberType,
9091 [],
9092 (ctx) => ctx.globals.lineProgress || 0
9093 ],
9094 'accumulated': [
9095 ValueType,
9096 [],
9097 (ctx) => ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated
9098 ],
9099 '+': [
9100 NumberType,
9101 varargs(NumberType),
9102 (ctx, args) => {
9103 let result = 0;
9104 for (const arg of args) {
9105 result += arg.evaluate(ctx);
9106 }
9107 return result;
9108 }
9109 ],
9110 '*': [
9111 NumberType,
9112 varargs(NumberType),
9113 (ctx, args) => {
9114 let result = 1;
9115 for (const arg of args) {
9116 result *= arg.evaluate(ctx);
9117 }
9118 return result;
9119 }
9120 ],
9121 '-': {
9122 type: NumberType,
9123 overloads: [
9124 [
9125 [NumberType, NumberType],
9126 (ctx, [a, b]) => a.evaluate(ctx) - b.evaluate(ctx)
9127 ], [
9128 [NumberType],
9129 (ctx, [a]) => -a.evaluate(ctx)
9130 ]
9131 ]
9132 },
9133 '/': [
9134 NumberType,
9135 [NumberType, NumberType],
9136 (ctx, [a, b]) => a.evaluate(ctx) / b.evaluate(ctx)
9137 ],
9138 '%': [
9139 NumberType,
9140 [NumberType, NumberType],
9141 (ctx, [a, b]) => a.evaluate(ctx) % b.evaluate(ctx)
9142 ],
9143 'ln2': [
9144 NumberType,
9145 [],
9146 () => Math.LN2
9147 ],
9148 'pi': [
9149 NumberType,
9150 [],
9151 () => Math.PI
9152 ],
9153 'e': [
9154 NumberType,
9155 [],
9156 () => Math.E
9157 ],
9158 '^': [
9159 NumberType,
9160 [NumberType, NumberType],
9161 (ctx, [b, e]) => Math.pow(b.evaluate(ctx), e.evaluate(ctx))
9162 ],
9163 'sqrt': [
9164 NumberType,
9165 [NumberType],
9166 (ctx, [x]) => Math.sqrt(x.evaluate(ctx))
9167 ],
9168 'log10': [
9169 NumberType,
9170 [NumberType],
9171 (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN10
9172 ],
9173 'ln': [
9174 NumberType,
9175 [NumberType],
9176 (ctx, [n]) => Math.log(n.evaluate(ctx))
9177 ],
9178 'log2': [
9179 NumberType,
9180 [NumberType],
9181 (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN2
9182 ],
9183 'sin': [
9184 NumberType,
9185 [NumberType],
9186 (ctx, [n]) => Math.sin(n.evaluate(ctx))
9187 ],
9188 'cos': [
9189 NumberType,
9190 [NumberType],
9191 (ctx, [n]) => Math.cos(n.evaluate(ctx))
9192 ],
9193 'tan': [
9194 NumberType,
9195 [NumberType],
9196 (ctx, [n]) => Math.tan(n.evaluate(ctx))
9197 ],
9198 'asin': [
9199 NumberType,
9200 [NumberType],
9201 (ctx, [n]) => Math.asin(n.evaluate(ctx))
9202 ],
9203 'acos': [
9204 NumberType,
9205 [NumberType],
9206 (ctx, [n]) => Math.acos(n.evaluate(ctx))
9207 ],
9208 'atan': [
9209 NumberType,
9210 [NumberType],
9211 (ctx, [n]) => Math.atan(n.evaluate(ctx))
9212 ],
9213 'min': [
9214 NumberType,
9215 varargs(NumberType),
9216 (ctx, args) => Math.min(...args.map(arg => arg.evaluate(ctx)))
9217 ],
9218 'max': [
9219 NumberType,
9220 varargs(NumberType),
9221 (ctx, args) => Math.max(...args.map(arg => arg.evaluate(ctx)))
9222 ],
9223 'abs': [
9224 NumberType,
9225 [NumberType],
9226 (ctx, [n]) => Math.abs(n.evaluate(ctx))
9227 ],
9228 'round': [
9229 NumberType,
9230 [NumberType],
9231 (ctx, [n]) => {
9232 const v = n.evaluate(ctx);
9233 // Javascript's Math.round() rounds towards +Infinity for halfway
9234 // values, even when they're negative. It's more common to round
9235 // away from 0 (e.g., this is what python and C++ do)
9236 return v < 0 ? -Math.round(-v) : Math.round(v);
9237 }
9238 ],
9239 'floor': [
9240 NumberType,
9241 [NumberType],
9242 (ctx, [n]) => Math.floor(n.evaluate(ctx))
9243 ],
9244 'ceil': [
9245 NumberType,
9246 [NumberType],
9247 (ctx, [n]) => Math.ceil(n.evaluate(ctx))
9248 ],
9249 'filter-==': [
9250 BooleanType,
9251 [StringType, ValueType],
9252 (ctx, [k, v]) => ctx.properties()[k.value] === v.value
9253 ],
9254 'filter-id-==': [
9255 BooleanType,
9256 [ValueType],
9257 (ctx, [v]) => ctx.id() === v.value
9258 ],
9259 'filter-type-==': [
9260 BooleanType,
9261 [StringType],
9262 (ctx, [v]) => ctx.geometryType() === v.value
9263 ],
9264 'filter-<': [
9265 BooleanType,
9266 [StringType, ValueType],
9267 (ctx, [k, v]) => {
9268 const a = ctx.properties()[k.value];
9269 const b = v.value;
9270 return typeof a === typeof b && a < b;
9271 }
9272 ],
9273 'filter-id-<': [
9274 BooleanType,
9275 [ValueType],
9276 (ctx, [v]) => {
9277 const a = ctx.id();
9278 const b = v.value;
9279 return typeof a === typeof b && a < b;
9280 }
9281 ],
9282 'filter->': [
9283 BooleanType,
9284 [StringType, ValueType],
9285 (ctx, [k, v]) => {
9286 const a = ctx.properties()[k.value];
9287 const b = v.value;
9288 return typeof a === typeof b && a > b;
9289 }
9290 ],
9291 'filter-id->': [
9292 BooleanType,
9293 [ValueType],
9294 (ctx, [v]) => {
9295 const a = ctx.id();
9296 const b = v.value;
9297 return typeof a === typeof b && a > b;
9298 }
9299 ],
9300 'filter-<=': [
9301 BooleanType,
9302 [StringType, ValueType],
9303 (ctx, [k, v]) => {
9304 const a = ctx.properties()[k.value];
9305 const b = v.value;
9306 return typeof a === typeof b && a <= b;
9307 }
9308 ],
9309 'filter-id-<=': [
9310 BooleanType,
9311 [ValueType],
9312 (ctx, [v]) => {
9313 const a = ctx.id();
9314 const b = v.value;
9315 return typeof a === typeof b && a <= b;
9316 }
9317 ],
9318 'filter->=': [
9319 BooleanType,
9320 [StringType, ValueType],
9321 (ctx, [k, v]) => {
9322 const a = ctx.properties()[k.value];
9323 const b = v.value;
9324 return typeof a === typeof b && a >= b;
9325 }
9326 ],
9327 'filter-id->=': [
9328 BooleanType,
9329 [ValueType],
9330 (ctx, [v]) => {
9331 const a = ctx.id();
9332 const b = v.value;
9333 return typeof a === typeof b && a >= b;
9334 }
9335 ],
9336 'filter-has': [
9337 BooleanType,
9338 [ValueType],
9339 (ctx, [k]) => k.value in ctx.properties()
9340 ],
9341 'filter-has-id': [
9342 BooleanType,
9343 [],
9344 (ctx) => (ctx.id() !== null && ctx.id() !== undefined)
9345 ],
9346 'filter-type-in': [
9347 BooleanType,
9348 [array$1(StringType)],
9349 (ctx, [v]) => v.value.indexOf(ctx.geometryType()) >= 0
9350 ],
9351 'filter-id-in': [
9352 BooleanType,
9353 [array$1(ValueType)],
9354 (ctx, [v]) => v.value.indexOf(ctx.id()) >= 0
9355 ],
9356 'filter-in-small': [
9357 BooleanType,
9358 [StringType, array$1(ValueType)],
9359 // assumes v is an array literal
9360 (ctx, [k, v]) => v.value.indexOf(ctx.properties()[k.value]) >= 0
9361 ],
9362 'filter-in-large': [
9363 BooleanType,
9364 [StringType, array$1(ValueType)],
9365 // assumes v is a array literal with values sorted in ascending order and of a single type
9366 (ctx, [k, v]) => binarySearch(ctx.properties()[k.value], v.value, 0, v.value.length - 1)
9367 ],
9368 'all': {
9369 type: BooleanType,
9370 overloads: [
9371 [
9372 [BooleanType, BooleanType],
9373 (ctx, [a, b]) => a.evaluate(ctx) && b.evaluate(ctx)
9374 ],
9375 [
9376 varargs(BooleanType),
9377 (ctx, args) => {
9378 for (const arg of args) {
9379 if (!arg.evaluate(ctx))
9380 return false;
9381 }
9382 return true;
9383 }
9384 ]
9385 ]
9386 },
9387 'any': {
9388 type: BooleanType,
9389 overloads: [
9390 [
9391 [BooleanType, BooleanType],
9392 (ctx, [a, b]) => a.evaluate(ctx) || b.evaluate(ctx)
9393 ],
9394 [
9395 varargs(BooleanType),
9396 (ctx, args) => {
9397 for (const arg of args) {
9398 if (arg.evaluate(ctx))
9399 return true;
9400 }
9401 return false;
9402 }
9403 ]
9404 ]
9405 },
9406 '!': [
9407 BooleanType,
9408 [BooleanType],
9409 (ctx, [b]) => !b.evaluate(ctx)
9410 ],
9411 'is-supported-script': [
9412 BooleanType,
9413 [StringType],
9414 // At parse time this will always return true, so we need to exclude this expression with isGlobalPropertyConstant
9415 (ctx, [s]) => {
9416 const isSupportedScript = ctx.globals && ctx.globals.isSupportedScript;
9417 if (isSupportedScript) {
9418 return isSupportedScript(s.evaluate(ctx));
9419 }
9420 return true;
9421 }
9422 ],
9423 'upcase': [
9424 StringType,
9425 [StringType],
9426 (ctx, [s]) => s.evaluate(ctx).toUpperCase()
9427 ],
9428 'downcase': [
9429 StringType,
9430 [StringType],
9431 (ctx, [s]) => s.evaluate(ctx).toLowerCase()
9432 ],
9433 'concat': [
9434 StringType,
9435 varargs(ValueType),
9436 (ctx, args) => args.map(arg => toString(arg.evaluate(ctx))).join('')
9437 ],
9438 'resolved-locale': [
9439 StringType,
9440 [CollatorType],
9441 (ctx, [collator]) => collator.evaluate(ctx).resolvedLocale()
9442 ]
9443});
9444
9445function success(value) {
9446 return { result: 'success', value };
9447}
9448function error(value) {
9449 return { result: 'error', value };
9450}
9451
9452function supportsPropertyExpression(spec) {
9453 return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven';
9454}
9455function supportsZoomExpression(spec) {
9456 return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1;
9457}
9458function supportsInterpolation(spec) {
9459 return !!spec.expression && spec.expression.interpolated;
9460}
9461
9462function getType(val) {
9463 if (val instanceof Number) {
9464 return 'number';
9465 }
9466 else if (val instanceof String) {
9467 return 'string';
9468 }
9469 else if (val instanceof Boolean) {
9470 return 'boolean';
9471 }
9472 else if (Array.isArray(val)) {
9473 return 'array';
9474 }
9475 else if (val === null) {
9476 return 'null';
9477 }
9478 else {
9479 return typeof val;
9480 }
9481}
9482
9483function isFunction(value) {
9484 return typeof value === 'object' && value !== null && !Array.isArray(value);
9485}
9486function identityFunction(x) {
9487 return x;
9488}
9489function createFunction(parameters, propertySpec) {
9490 const isColor = propertySpec.type === 'color';
9491 const zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object';
9492 const featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;
9493 const zoomDependent = zoomAndFeatureDependent || !featureDependent;
9494 const type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval');
9495 if (isColor) {
9496 parameters = extend({}, parameters);
9497 if (parameters.stops) {
9498 parameters.stops = parameters.stops.map((stop) => {
9499 return [stop[0], Color.parse(stop[1])];
9500 });
9501 }
9502 if (parameters.default) {
9503 parameters.default = Color.parse(parameters.default);
9504 }
9505 else {
9506 parameters.default = Color.parse(propertySpec.default);
9507 }
9508 }
9509 if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) { // eslint-disable-line import/namespace
9510 throw new Error(`Unknown color space: ${parameters.colorSpace}`);
9511 }
9512 let innerFun;
9513 let hashedStops;
9514 let categoricalKeyType;
9515 if (type === 'exponential') {
9516 innerFun = evaluateExponentialFunction;
9517 }
9518 else if (type === 'interval') {
9519 innerFun = evaluateIntervalFunction;
9520 }
9521 else if (type === 'categorical') {
9522 innerFun = evaluateCategoricalFunction;
9523 // For categorical functions, generate an Object as a hashmap of the stops for fast searching
9524 hashedStops = Object.create(null);
9525 for (const stop of parameters.stops) {
9526 hashedStops[stop[0]] = stop[1];
9527 }
9528 // Infer key type based on first stop key-- used to encforce strict type checking later
9529 categoricalKeyType = typeof parameters.stops[0][0];
9530 }
9531 else if (type === 'identity') {
9532 innerFun = evaluateIdentityFunction;
9533 }
9534 else {
9535 throw new Error(`Unknown function type "${type}"`);
9536 }
9537 if (zoomAndFeatureDependent) {
9538 const featureFunctions = {};
9539 const zoomStops = [];
9540 for (let s = 0; s < parameters.stops.length; s++) {
9541 const stop = parameters.stops[s];
9542 const zoom = stop[0].zoom;
9543 if (featureFunctions[zoom] === undefined) {
9544 featureFunctions[zoom] = {
9545 zoom,
9546 type: parameters.type,
9547 property: parameters.property,
9548 default: parameters.default,
9549 stops: []
9550 };
9551 zoomStops.push(zoom);
9552 }
9553 featureFunctions[zoom].stops.push([stop[0].value, stop[1]]);
9554 }
9555 const featureFunctionStops = [];
9556 for (const z of zoomStops) {
9557 featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]);
9558 }
9559 const interpolationType = { name: 'linear' };
9560 return {
9561 kind: 'composite',
9562 interpolationType,
9563 interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType),
9564 zoomStops: featureFunctionStops.map(s => s[0]),
9565 evaluate({ zoom }, properties) {
9566 return evaluateExponentialFunction({
9567 stops: featureFunctionStops,
9568 base: parameters.base
9569 }, propertySpec, zoom).evaluate(zoom, properties);
9570 }
9571 };
9572 }
9573 else if (zoomDependent) {
9574 const interpolationType = type === 'exponential' ?
9575 { name: 'exponential', base: parameters.base !== undefined ? parameters.base : 1 } : null;
9576 return {
9577 kind: 'camera',
9578 interpolationType,
9579 interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType),
9580 zoomStops: parameters.stops.map(s => s[0]),
9581 evaluate: ({ zoom }) => innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType)
9582 };
9583 }
9584 else {
9585 return {
9586 kind: 'source',
9587 evaluate(_, feature) {
9588 const value = feature && feature.properties ? feature.properties[parameters.property] : undefined;
9589 if (value === undefined) {
9590 return coalesce(parameters.default, propertySpec.default);
9591 }
9592 return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType);
9593 }
9594 };
9595 }
9596}
9597function coalesce(a, b, c) {
9598 if (a !== undefined)
9599 return a;
9600 if (b !== undefined)
9601 return b;
9602 if (c !== undefined)
9603 return c;
9604}
9605function evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) {
9606 const evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input
9607 return coalesce(evaluated, parameters.default, propertySpec.default);
9608}
9609function evaluateIntervalFunction(parameters, propertySpec, input) {
9610 // Edge cases
9611 if (getType(input) !== 'number')
9612 return coalesce(parameters.default, propertySpec.default);
9613 const n = parameters.stops.length;
9614 if (n === 1)
9615 return parameters.stops[0][1];
9616 if (input <= parameters.stops[0][0])
9617 return parameters.stops[0][1];
9618 if (input >= parameters.stops[n - 1][0])
9619 return parameters.stops[n - 1][1];
9620 const index = findStopLessThanOrEqualTo(parameters.stops.map((stop) => stop[0]), input);
9621 return parameters.stops[index][1];
9622}
9623function evaluateExponentialFunction(parameters, propertySpec, input) {
9624 const base = parameters.base !== undefined ? parameters.base : 1;
9625 // Edge cases
9626 if (getType(input) !== 'number')
9627 return coalesce(parameters.default, propertySpec.default);
9628 const n = parameters.stops.length;
9629 if (n === 1)
9630 return parameters.stops[0][1];
9631 if (input <= parameters.stops[0][0])
9632 return parameters.stops[0][1];
9633 if (input >= parameters.stops[n - 1][0])
9634 return parameters.stops[n - 1][1];
9635 const index = findStopLessThanOrEqualTo(parameters.stops.map((stop) => stop[0]), input);
9636 const t = interpolationFactor(input, base, parameters.stops[index][0], parameters.stops[index + 1][0]);
9637 const outputLower = parameters.stops[index][1];
9638 const outputUpper = parameters.stops[index + 1][1];
9639 let interp = interpolate[propertySpec.type] || identityFunction; // eslint-disable-line import/namespace
9640 if (parameters.colorSpace && parameters.colorSpace !== 'rgb') {
9641 const colorspace = colorSpaces[parameters.colorSpace]; // eslint-disable-line import/namespace
9642 interp = (a, b) => colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t));
9643 }
9644 if (typeof outputLower.evaluate === 'function') {
9645 return {
9646 evaluate(...args) {
9647 const evaluatedLower = outputLower.evaluate.apply(undefined, args);
9648 const evaluatedUpper = outputUpper.evaluate.apply(undefined, args);
9649 // Special case for fill-outline-color, which has no spec default.
9650 if (evaluatedLower === undefined || evaluatedUpper === undefined) {
9651 return undefined;
9652 }
9653 return interp(evaluatedLower, evaluatedUpper, t);
9654 }
9655 };
9656 }
9657 return interp(outputLower, outputUpper, t);
9658}
9659function evaluateIdentityFunction(parameters, propertySpec, input) {
9660 if (propertySpec.type === 'color') {
9661 input = Color.parse(input);
9662 }
9663 else if (propertySpec.type === 'formatted') {
9664 input = Formatted.fromString(input.toString());
9665 }
9666 else if (propertySpec.type === 'resolvedImage') {
9667 input = ResolvedImage.fromString(input.toString());
9668 }
9669 else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) {
9670 input = undefined;
9671 }
9672 return coalesce(input, parameters.default, propertySpec.default);
9673}
9674/**
9675 * Returns a ratio that can be used to interpolate between exponential function
9676 * stops.
9677 *
9678 * How it works:
9679 * Two consecutive stop values define a (scaled and shifted) exponential
9680 * function `f(x) = a * base^x + b`, where `base` is the user-specified base,
9681 * and `a` and `b` are constants affording sufficient degrees of freedom to fit
9682 * the function to the given stops.
9683 *
9684 * Here's a bit of algebra that lets us compute `f(x)` directly from the stop
9685 * values without explicitly solving for `a` and `b`:
9686 *
9687 * First stop value: `f(x0) = y0 = a * base^x0 + b`
9688 * Second stop value: `f(x1) = y1 = a * base^x1 + b`
9689 * => `y1 - y0 = a(base^x1 - base^x0)`
9690 * => `a = (y1 - y0)/(base^x1 - base^x0)`
9691 *
9692 * Desired value: `f(x) = y = a * base^x + b`
9693 * => `f(x) = y0 + a * (base^x - base^x0)`
9694 *
9695 * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a
9696 * little algebra:
9697 * ```
9698 * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0)
9699 * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0)
9700 * ```
9701 *
9702 * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have
9703 * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as
9704 * an interpolation factor between the two stops' output values.
9705 *
9706 * (Note: a slightly different form for `ratio`,
9707 * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer
9708 * expensive `Math.pow()` operations.)
9709 *
9710 * @private
9711 */
9712function interpolationFactor(input, base, lowerValue, upperValue) {
9713 const difference = upperValue - lowerValue;
9714 const progress = input - lowerValue;
9715 if (difference === 0) {
9716 return 0;
9717 }
9718 else if (base === 1) {
9719 return progress / difference;
9720 }
9721 else {
9722 return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);
9723 }
9724}
9725
9726class StyleExpression {
9727 constructor(expression, propertySpec) {
9728 this.expression = expression;
9729 this._warningHistory = {};
9730 this._evaluator = new EvaluationContext();
9731 this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null;
9732 this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null;
9733 }
9734 evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {
9735 this._evaluator.globals = globals;
9736 this._evaluator.feature = feature;
9737 this._evaluator.featureState = featureState;
9738 this._evaluator.canonical = canonical;
9739 this._evaluator.availableImages = availableImages || null;
9740 this._evaluator.formattedSection = formattedSection;
9741 return this.expression.evaluate(this._evaluator);
9742 }
9743 evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {
9744 this._evaluator.globals = globals;
9745 this._evaluator.feature = feature || null;
9746 this._evaluator.featureState = featureState || null;
9747 this._evaluator.canonical = canonical;
9748 this._evaluator.availableImages = availableImages || null;
9749 this._evaluator.formattedSection = formattedSection || null;
9750 try {
9751 const val = this.expression.evaluate(this._evaluator);
9752 // eslint-disable-next-line no-self-compare
9753 if (val === null || val === undefined || (typeof val === 'number' && val !== val)) {
9754 return this._defaultValue;
9755 }
9756 if (this._enumValues && !(val in this._enumValues)) {
9757 throw new RuntimeError(`Expected value to be one of ${Object.keys(this._enumValues).map(v => JSON.stringify(v)).join(', ')}, but found ${JSON.stringify(val)} instead.`);
9758 }
9759 return val;
9760 }
9761 catch (e) {
9762 if (!this._warningHistory[e.message]) {
9763 this._warningHistory[e.message] = true;
9764 if (typeof console !== 'undefined') {
9765 console.warn(e.message);
9766 }
9767 }
9768 return this._defaultValue;
9769 }
9770 }
9771}
9772function isExpression(expression) {
9773 return Array.isArray(expression) && expression.length > 0 &&
9774 typeof expression[0] === 'string' && expression[0] in expressions;
9775}
9776/**
9777 * Parse and typecheck the given style spec JSON expression. If
9778 * options.defaultValue is provided, then the resulting StyleExpression's
9779 * `evaluate()` method will handle errors by logging a warning (once per
9780 * message) and returning the default value. Otherwise, it will throw
9781 * evaluation errors.
9782 *
9783 * @private
9784 */
9785function createExpression(expression, propertySpec) {
9786 const parser = new ParsingContext$1(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined);
9787 // For string-valued properties, coerce to string at the top level rather than asserting.
9788 const parsed = parser.parse(expression, undefined, undefined, undefined, propertySpec && propertySpec.type === 'string' ? { typeAnnotation: 'coerce' } : undefined);
9789 if (!parsed) {
9790 assert$1(parser.errors.length > 0);
9791 return error(parser.errors);
9792 }
9793 return success(new StyleExpression(parsed, propertySpec));
9794}
9795class ZoomConstantExpression {
9796 constructor(kind, expression) {
9797 this.kind = kind;
9798 this._styleExpression = expression;
9799 this.isStateDependent = kind !== 'constant' && !isStateConstant(expression.expression);
9800 }
9801 evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {
9802 return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);
9803 }
9804 evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {
9805 return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);
9806 }
9807}
9808class ZoomDependentExpression {
9809 constructor(kind, expression, zoomStops, interpolationType) {
9810 this.kind = kind;
9811 this.zoomStops = zoomStops;
9812 this._styleExpression = expression;
9813 this.isStateDependent = kind !== 'camera' && !isStateConstant(expression.expression);
9814 this.interpolationType = interpolationType;
9815 }
9816 evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {
9817 return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);
9818 }
9819 evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {
9820 return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);
9821 }
9822 interpolationFactor(input, lower, upper) {
9823 if (this.interpolationType) {
9824 return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper);
9825 }
9826 else {
9827 return 0;
9828 }
9829 }
9830}
9831function createPropertyExpression(expressionInput, propertySpec) {
9832 const expression = createExpression(expressionInput, propertySpec);
9833 if (expression.result === 'error') {
9834 return expression;
9835 }
9836 const parsed = expression.value.expression;
9837 const isFeatureConstant$1 = isFeatureConstant(parsed);
9838 if (!isFeatureConstant$1 && !supportsPropertyExpression(propertySpec)) {
9839 return error([new ParsingError('', 'data expressions not supported')]);
9840 }
9841 const isZoomConstant = isGlobalPropertyConstant(parsed, ['zoom']);
9842 if (!isZoomConstant && !supportsZoomExpression(propertySpec)) {
9843 return error([new ParsingError('', 'zoom expressions not supported')]);
9844 }
9845 const zoomCurve = findZoomCurve(parsed);
9846 if (!zoomCurve && !isZoomConstant) {
9847 return error([new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]);
9848 }
9849 else if (zoomCurve instanceof ParsingError) {
9850 return error([zoomCurve]);
9851 }
9852 else if (zoomCurve instanceof Interpolate && !supportsInterpolation(propertySpec)) {
9853 return error([new ParsingError('', '"interpolate" expressions cannot be used with this property')]);
9854 }
9855 if (!zoomCurve) {
9856 return success(isFeatureConstant$1 ?
9857 new ZoomConstantExpression('constant', expression.value) :
9858 new ZoomConstantExpression('source', expression.value));
9859 }
9860 const interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined;
9861 return success(isFeatureConstant$1 ?
9862 new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType) :
9863 new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType));
9864}
9865// serialization wrapper for old-style stop functions normalized to the
9866// expression interface
9867class StylePropertyFunction {
9868 constructor(parameters, specification) {
9869 this._parameters = parameters;
9870 this._specification = specification;
9871 extend(this, createFunction(this._parameters, this._specification));
9872 }
9873 static deserialize(serialized) {
9874 return new StylePropertyFunction(serialized._parameters, serialized._specification);
9875 }
9876 static serialize(input) {
9877 return {
9878 _parameters: input._parameters,
9879 _specification: input._specification
9880 };
9881 }
9882}
9883function normalizePropertyExpression(value, specification) {
9884 if (isFunction(value)) {
9885 return new StylePropertyFunction(value, specification);
9886 }
9887 else if (isExpression(value)) {
9888 const expression = createPropertyExpression(value, specification);
9889 if (expression.result === 'error') {
9890 // this should have been caught in validation
9891 throw new Error(expression.value.map(err => `${err.key}: ${err.message}`).join(', '));
9892 }
9893 return expression.value;
9894 }
9895 else {
9896 let constant = value;
9897 if (typeof value === 'string' && specification.type === 'color') {
9898 constant = Color.parse(value);
9899 }
9900 return {
9901 kind: 'constant',
9902 evaluate: () => constant
9903 };
9904 }
9905}
9906// Zoom-dependent expressions may only use ["zoom"] as the input to a top-level "step" or "interpolate"
9907// expression (collectively referred to as a "curve"). The curve may be wrapped in one or more "let" or
9908// "coalesce" expressions.
9909function findZoomCurve(expression) {
9910 let result = null;
9911 if (expression instanceof Let) {
9912 result = findZoomCurve(expression.result);
9913 }
9914 else if (expression instanceof Coalesce) {
9915 for (const arg of expression.args) {
9916 result = findZoomCurve(arg);
9917 if (result) {
9918 break;
9919 }
9920 }
9921 }
9922 else if ((expression instanceof Step || expression instanceof Interpolate) &&
9923 expression.input instanceof CompoundExpression &&
9924 expression.input.name === 'zoom') {
9925 result = expression;
9926 }
9927 if (result instanceof ParsingError) {
9928 return result;
9929 }
9930 expression.eachChild((child) => {
9931 const childResult = findZoomCurve(child);
9932 if (childResult instanceof ParsingError) {
9933 result = childResult;
9934 }
9935 else if (!result && childResult) {
9936 result = new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.');
9937 }
9938 else if (result && childResult && result !== childResult) {
9939 result = new ParsingError('', 'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.');
9940 }
9941 });
9942 return result;
9943}
9944function getExpectedType(spec) {
9945 const types = {
9946 color: ColorType,
9947 string: StringType,
9948 number: NumberType,
9949 enum: StringType,
9950 boolean: BooleanType,
9951 formatted: FormattedType,
9952 resolvedImage: ResolvedImageType
9953 };
9954 if (spec.type === 'array') {
9955 return array$1(types[spec.value] || ValueType, spec.length);
9956 }
9957 return types[spec.type];
9958}
9959function getDefaultValue(spec) {
9960 if (spec.type === 'color' && isFunction(spec.default)) {
9961 // Special case for heatmap-color: it uses the 'default:' to define a
9962 // default color ramp, but createExpression expects a simple value to fall
9963 // back to in case of runtime errors
9964 return new Color(0, 0, 0, 0);
9965 }
9966 else if (spec.type === 'color') {
9967 return Color.parse(spec.default) || null;
9968 }
9969 else if (spec.default === undefined) {
9970 return null;
9971 }
9972 else {
9973 return spec.default;
9974 }
9975}
9976
9977function validateObject(options) {
9978 const key = options.key;
9979 const object = options.value;
9980 const elementSpecs = options.valueSpec || {};
9981 const elementValidators = options.objectElementValidators || {};
9982 const style = options.style;
9983 const styleSpec = options.styleSpec;
9984 let errors = [];
9985 const type = getType(object);
9986 if (type !== 'object') {
9987 return [new ValidationError(key, object, `object expected, ${type} found`)];
9988 }
9989 for (const objectKey in object) {
9990 const elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint'
9991 const elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*'];
9992 let validateElement;
9993 if (elementValidators[elementSpecKey]) {
9994 validateElement = elementValidators[elementSpecKey];
9995 }
9996 else if (elementSpecs[elementSpecKey]) {
9997 validateElement = validate;
9998 }
9999 else if (elementValidators['*']) {
10000 validateElement = elementValidators['*'];
10001 }
10002 else if (elementSpecs['*']) {
10003 validateElement = validate;
10004 }
10005 else {
10006 errors.push(new ValidationError(key, object[objectKey], `unknown property "${objectKey}"`));
10007 continue;
10008 }
10009 errors = errors.concat(validateElement({
10010 key: (key ? `${key}.` : key) + objectKey,
10011 value: object[objectKey],
10012 valueSpec: elementSpec,
10013 style,
10014 styleSpec,
10015 object,
10016 objectKey
10017 }, object));
10018 }
10019 for (const elementSpecKey in elementSpecs) {
10020 // Don't check `required` when there's a custom validator for that property.
10021 if (elementValidators[elementSpecKey]) {
10022 continue;
10023 }
10024 if (elementSpecs[elementSpecKey].required && elementSpecs[elementSpecKey]['default'] === undefined && object[elementSpecKey] === undefined) {
10025 errors.push(new ValidationError(key, object, `missing required property "${elementSpecKey}"`));
10026 }
10027 }
10028 return errors;
10029}
10030
10031function validateArray(options) {
10032 const array = options.value;
10033 const arraySpec = options.valueSpec;
10034 const style = options.style;
10035 const styleSpec = options.styleSpec;
10036 const key = options.key;
10037 const validateArrayElement = options.arrayElementValidator || validate;
10038 if (getType(array) !== 'array') {
10039 return [new ValidationError(key, array, `array expected, ${getType(array)} found`)];
10040 }
10041 if (arraySpec.length && array.length !== arraySpec.length) {
10042 return [new ValidationError(key, array, `array length ${arraySpec.length} expected, length ${array.length} found`)];
10043 }
10044 if (arraySpec['min-length'] && array.length < arraySpec['min-length']) {
10045 return [new ValidationError(key, array, `array length at least ${arraySpec['min-length']} expected, length ${array.length} found`)];
10046 }
10047 let arrayElementSpec = {
10048 'type': arraySpec.value,
10049 'values': arraySpec.values
10050 };
10051 if (styleSpec.$version < 7) {
10052 arrayElementSpec['function'] = arraySpec.function;
10053 }
10054 if (getType(arraySpec.value) === 'object') {
10055 arrayElementSpec = arraySpec.value;
10056 }
10057 let errors = [];
10058 for (let i = 0; i < array.length; i++) {
10059 errors = errors.concat(validateArrayElement({
10060 array,
10061 arrayIndex: i,
10062 value: array[i],
10063 valueSpec: arrayElementSpec,
10064 style,
10065 styleSpec,
10066 key: `${key}[${i}]`
10067 }));
10068 }
10069 return errors;
10070}
10071
10072function validateNumber(options) {
10073 const key = options.key;
10074 const value = options.value;
10075 const valueSpec = options.valueSpec;
10076 let type = getType(value);
10077 // eslint-disable-next-line no-self-compare
10078 if (type === 'number' && value !== value) {
10079 type = 'NaN';
10080 }
10081 if (type !== 'number') {
10082 return [new ValidationError(key, value, `number expected, ${type} found`)];
10083 }
10084 if ('minimum' in valueSpec && value < valueSpec.minimum) {
10085 return [new ValidationError(key, value, `${value} is less than the minimum value ${valueSpec.minimum}`)];
10086 }
10087 if ('maximum' in valueSpec && value > valueSpec.maximum) {
10088 return [new ValidationError(key, value, `${value} is greater than the maximum value ${valueSpec.maximum}`)];
10089 }
10090 return [];
10091}
10092
10093function validateFunction(options) {
10094 const functionValueSpec = options.valueSpec;
10095 const functionType = unbundle(options.value.type);
10096 let stopKeyType;
10097 let stopDomainValues = {};
10098 let previousStopDomainValue;
10099 let previousStopDomainZoom;
10100 const isZoomFunction = functionType !== 'categorical' && options.value.property === undefined;
10101 const isPropertyFunction = !isZoomFunction;
10102 const isZoomAndPropertyFunction = getType(options.value.stops) === 'array' &&
10103 getType(options.value.stops[0]) === 'array' &&
10104 getType(options.value.stops[0][0]) === 'object';
10105 const errors = validateObject({
10106 key: options.key,
10107 value: options.value,
10108 valueSpec: options.styleSpec.function,
10109 style: options.style,
10110 styleSpec: options.styleSpec,
10111 objectElementValidators: {
10112 stops: validateFunctionStops,
10113 default: validateFunctionDefault
10114 }
10115 });
10116 if (functionType === 'identity' && isZoomFunction) {
10117 errors.push(new ValidationError(options.key, options.value, 'missing required property "property"'));
10118 }
10119 if (functionType !== 'identity' && !options.value.stops) {
10120 errors.push(new ValidationError(options.key, options.value, 'missing required property "stops"'));
10121 }
10122 if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) {
10123 errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported'));
10124 }
10125 if (options.styleSpec.$version >= 8) {
10126 if (isPropertyFunction && !supportsPropertyExpression(options.valueSpec)) {
10127 errors.push(new ValidationError(options.key, options.value, 'property functions not supported'));
10128 }
10129 else if (isZoomFunction && !supportsZoomExpression(options.valueSpec)) {
10130 errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported'));
10131 }
10132 }
10133 if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) {
10134 errors.push(new ValidationError(options.key, options.value, '"property" property is required'));
10135 }
10136 return errors;
10137 function validateFunctionStops(options) {
10138 if (functionType === 'identity') {
10139 return [new ValidationError(options.key, options.value, 'identity function may not have a "stops" property')];
10140 }
10141 let errors = [];
10142 const value = options.value;
10143 errors = errors.concat(validateArray({
10144 key: options.key,
10145 value,
10146 valueSpec: options.valueSpec,
10147 style: options.style,
10148 styleSpec: options.styleSpec,
10149 arrayElementValidator: validateFunctionStop
10150 }));
10151 if (getType(value) === 'array' && value.length === 0) {
10152 errors.push(new ValidationError(options.key, value, 'array must have at least one stop'));
10153 }
10154 return errors;
10155 }
10156 function validateFunctionStop(options) {
10157 let errors = [];
10158 const value = options.value;
10159 const key = options.key;
10160 if (getType(value) !== 'array') {
10161 return [new ValidationError(key, value, `array expected, ${getType(value)} found`)];
10162 }
10163 if (value.length !== 2) {
10164 return [new ValidationError(key, value, `array length 2 expected, length ${value.length} found`)];
10165 }
10166 if (isZoomAndPropertyFunction) {
10167 if (getType(value[0]) !== 'object') {
10168 return [new ValidationError(key, value, `object expected, ${getType(value[0])} found`)];
10169 }
10170 if (value[0].zoom === undefined) {
10171 return [new ValidationError(key, value, 'object stop key must have zoom')];
10172 }
10173 if (value[0].value === undefined) {
10174 return [new ValidationError(key, value, 'object stop key must have value')];
10175 }
10176 if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) {
10177 return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')];
10178 }
10179 if (unbundle(value[0].zoom) !== previousStopDomainZoom) {
10180 previousStopDomainZoom = unbundle(value[0].zoom);
10181 previousStopDomainValue = undefined;
10182 stopDomainValues = {};
10183 }
10184 errors = errors.concat(validateObject({
10185 key: `${key}[0]`,
10186 value: value[0],
10187 valueSpec: { zoom: {} },
10188 style: options.style,
10189 styleSpec: options.styleSpec,
10190 objectElementValidators: { zoom: validateNumber, value: validateStopDomainValue }
10191 }));
10192 }
10193 else {
10194 errors = errors.concat(validateStopDomainValue({
10195 key: `${key}[0]`,
10196 value: value[0],
10197 valueSpec: {},
10198 style: options.style,
10199 styleSpec: options.styleSpec
10200 }, value));
10201 }
10202 if (isExpression(deepUnbundle(value[1]))) {
10203 return errors.concat([new ValidationError(`${key}[1]`, value[1], 'expressions are not allowed in function stops.')]);
10204 }
10205 return errors.concat(validate({
10206 key: `${key}[1]`,
10207 value: value[1],
10208 valueSpec: functionValueSpec,
10209 style: options.style,
10210 styleSpec: options.styleSpec
10211 }));
10212 }
10213 function validateStopDomainValue(options, stop) {
10214 const type = getType(options.value);
10215 const value = unbundle(options.value);
10216 const reportValue = options.value !== null ? options.value : stop;
10217 if (!stopKeyType) {
10218 stopKeyType = type;
10219 }
10220 else if (type !== stopKeyType) {
10221 return [new ValidationError(options.key, reportValue, `${type} stop domain type must match previous stop domain type ${stopKeyType}`)];
10222 }
10223 if (type !== 'number' && type !== 'string' && type !== 'boolean') {
10224 return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')];
10225 }
10226 if (type !== 'number' && functionType !== 'categorical') {
10227 let message = `number expected, ${type} found`;
10228 if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) {
10229 message += '\nIf you intended to use a categorical function, specify `"type": "categorical"`.';
10230 }
10231 return [new ValidationError(options.key, reportValue, message)];
10232 }
10233 if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) {
10234 return [new ValidationError(options.key, reportValue, `integer expected, found ${value}`)];
10235 }
10236 if (functionType !== 'categorical' && type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) {
10237 return [new ValidationError(options.key, reportValue, 'stop domain values must appear in ascending order')];
10238 }
10239 else {
10240 previousStopDomainValue = value;
10241 }
10242 if (functionType === 'categorical' && value in stopDomainValues) {
10243 return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')];
10244 }
10245 else {
10246 stopDomainValues[value] = true;
10247 }
10248 return [];
10249 }
10250 function validateFunctionDefault(options) {
10251 return validate({
10252 key: options.key,
10253 value: options.value,
10254 valueSpec: functionValueSpec,
10255 style: options.style,
10256 styleSpec: options.styleSpec
10257 });
10258 }
10259}
10260
10261function validateExpression(options) {
10262 const expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec);
10263 if (expression.result === 'error') {
10264 return expression.value.map((error) => {
10265 return new ValidationError(`${options.key}${error.key}`, options.value, error.message);
10266 });
10267 }
10268 const expressionObj = expression.value.expression || expression.value._styleExpression.expression;
10269 if (options.expressionContext === 'property' && (options.propertyKey === 'text-font') &&
10270 !expressionObj.outputDefined()) {
10271 return [new ValidationError(options.key, options.value, `Invalid data expression for "${options.propertyKey}". Output values must be contained as literals within the expression.`)];
10272 }
10273 if (options.expressionContext === 'property' && options.propertyType === 'layout' &&
10274 (!isStateConstant(expressionObj))) {
10275 return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with layout properties.')];
10276 }
10277 if (options.expressionContext === 'filter' && !isStateConstant(expressionObj)) {
10278 return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with filters.')];
10279 }
10280 if (options.expressionContext && options.expressionContext.indexOf('cluster') === 0) {
10281 if (!isGlobalPropertyConstant(expressionObj, ['zoom', 'feature-state'])) {
10282 return [new ValidationError(options.key, options.value, '"zoom" and "feature-state" expressions are not supported with cluster properties.')];
10283 }
10284 if (options.expressionContext === 'cluster-initial' && !isFeatureConstant(expressionObj)) {
10285 return [new ValidationError(options.key, options.value, 'Feature data expressions are not supported with initial expression part of cluster properties.')];
10286 }
10287 }
10288 return [];
10289}
10290
10291function validateBoolean(options) {
10292 const value = options.value;
10293 const key = options.key;
10294 const type = getType(value);
10295 if (type !== 'boolean') {
10296 return [new ValidationError(key, value, `boolean expected, ${type} found`)];
10297 }
10298 return [];
10299}
10300
10301function validateColor(options) {
10302 const key = options.key;
10303 const value = options.value;
10304 const type = getType(value);
10305 if (type !== 'string') {
10306 return [new ValidationError(key, value, `color expected, ${type} found`)];
10307 }
10308 if (parseCSSColor_1(value) === null) {
10309 return [new ValidationError(key, value, `color expected, "${value}" found`)];
10310 }
10311 return [];
10312}
10313
10314function validateEnum(options) {
10315 const key = options.key;
10316 const value = options.value;
10317 const valueSpec = options.valueSpec;
10318 const errors = [];
10319 if (Array.isArray(valueSpec.values)) { // <=v7
10320 if (valueSpec.values.indexOf(unbundle(value)) === -1) {
10321 errors.push(new ValidationError(key, value, `expected one of [${valueSpec.values.join(', ')}], ${JSON.stringify(value)} found`));
10322 }
10323 }
10324 else { // >=v8
10325 if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) {
10326 errors.push(new ValidationError(key, value, `expected one of [${Object.keys(valueSpec.values).join(', ')}], ${JSON.stringify(value)} found`));
10327 }
10328 }
10329 return errors;
10330}
10331
10332function isExpressionFilter(filter) {
10333 if (filter === true || filter === false) {
10334 return true;
10335 }
10336 if (!Array.isArray(filter) || filter.length === 0) {
10337 return false;
10338 }
10339 switch (filter[0]) {
10340 case 'has':
10341 return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type';
10342 case 'in':
10343 return filter.length >= 3 && (typeof filter[1] !== 'string' || Array.isArray(filter[2]));
10344 case '!in':
10345 case '!has':
10346 case 'none':
10347 return false;
10348 case '==':
10349 case '!=':
10350 case '>':
10351 case '>=':
10352 case '<':
10353 case '<=':
10354 return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2]));
10355 case 'any':
10356 case 'all':
10357 for (const f of filter.slice(1)) {
10358 if (!isExpressionFilter(f) && typeof f !== 'boolean') {
10359 return false;
10360 }
10361 }
10362 return true;
10363 default:
10364 return true;
10365 }
10366}
10367const filterSpec = {
10368 'type': 'boolean',
10369 'default': false,
10370 'transition': false,
10371 'property-type': 'data-driven',
10372 'expression': {
10373 'interpolated': false,
10374 'parameters': ['zoom', 'feature']
10375 }
10376};
10377/**
10378 * Given a filter expressed as nested arrays, return a new function
10379 * that evaluates whether a given feature (with a .properties or .tags property)
10380 * passes its test.
10381 *
10382 * @private
10383 * @param {Array} filter maplibre gl filter
10384 * @returns {Function} filter-evaluating function
10385 */
10386function createFilter(filter) {
10387 if (filter === null || filter === undefined) {
10388 return { filter: () => true, needGeometry: false };
10389 }
10390 if (!isExpressionFilter(filter)) {
10391 filter = convertFilter(filter);
10392 }
10393 const compiled = createExpression(filter, filterSpec);
10394 if (compiled.result === 'error') {
10395 throw new Error(compiled.value.map(err => `${err.key}: ${err.message}`).join(', '));
10396 }
10397 else {
10398 const needGeometry = geometryNeeded(filter);
10399 return { filter: (globalProperties, feature, canonical) => compiled.value.evaluate(globalProperties, feature, {}, canonical),
10400 needGeometry };
10401 }
10402}
10403// Comparison function to sort numbers and strings
10404function compare(a, b) {
10405 return a < b ? -1 : a > b ? 1 : 0;
10406}
10407function geometryNeeded(filter) {
10408 if (!Array.isArray(filter))
10409 return false;
10410 if (filter[0] === 'within')
10411 return true;
10412 for (let index = 1; index < filter.length; index++) {
10413 if (geometryNeeded(filter[index]))
10414 return true;
10415 }
10416 return false;
10417}
10418function convertFilter(filter) {
10419 if (!filter)
10420 return true;
10421 const op = filter[0];
10422 if (filter.length <= 1)
10423 return (op !== 'any');
10424 const converted = op === '==' ? convertComparisonOp(filter[1], filter[2], '==') :
10425 op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) :
10426 op === '<' ||
10427 op === '>' ||
10428 op === '<=' ||
10429 op === '>=' ? convertComparisonOp(filter[1], filter[2], op) :
10430 op === 'any' ? convertDisjunctionOp(filter.slice(1)) :
10431 op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) :
10432 op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) :
10433 op === 'in' ? convertInOp(filter[1], filter.slice(2)) :
10434 op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) :
10435 op === 'has' ? convertHasOp(filter[1]) :
10436 op === '!has' ? convertNegation(convertHasOp(filter[1])) :
10437 op === 'within' ? filter :
10438 true;
10439 return converted;
10440}
10441function convertComparisonOp(property, value, op) {
10442 switch (property) {
10443 case '$type':
10444 return [`filter-type-${op}`, value];
10445 case '$id':
10446 return [`filter-id-${op}`, value];
10447 default:
10448 return [`filter-${op}`, property, value];
10449 }
10450}
10451function convertDisjunctionOp(filters) {
10452 return ['any'].concat(filters.map(convertFilter));
10453}
10454function convertInOp(property, values) {
10455 if (values.length === 0) {
10456 return false;
10457 }
10458 switch (property) {
10459 case '$type':
10460 return ['filter-type-in', ['literal', values]];
10461 case '$id':
10462 return ['filter-id-in', ['literal', values]];
10463 default:
10464 if (values.length > 200 && !values.some(v => typeof v !== typeof values[0])) {
10465 return ['filter-in-large', property, ['literal', values.sort(compare)]];
10466 }
10467 else {
10468 return ['filter-in-small', property, ['literal', values]];
10469 }
10470 }
10471}
10472function convertHasOp(property) {
10473 switch (property) {
10474 case '$type':
10475 return true;
10476 case '$id':
10477 return ['filter-has-id'];
10478 default:
10479 return ['filter-has', property];
10480 }
10481}
10482function convertNegation(filter) {
10483 return ['!', filter];
10484}
10485
10486function validateFilter$1(options) {
10487 if (isExpressionFilter(deepUnbundle(options.value))) {
10488 return validateExpression(extend({}, options, {
10489 expressionContext: 'filter',
10490 valueSpec: { value: 'boolean' }
10491 }));
10492 }
10493 else {
10494 return validateNonExpressionFilter(options);
10495 }
10496}
10497function validateNonExpressionFilter(options) {
10498 const value = options.value;
10499 const key = options.key;
10500 if (getType(value) !== 'array') {
10501 return [new ValidationError(key, value, `array expected, ${getType(value)} found`)];
10502 }
10503 const styleSpec = options.styleSpec;
10504 let type;
10505 let errors = [];
10506 if (value.length < 1) {
10507 return [new ValidationError(key, value, 'filter array must have at least 1 element')];
10508 }
10509 errors = errors.concat(validateEnum({
10510 key: `${key}[0]`,
10511 value: value[0],
10512 valueSpec: styleSpec.filter_operator,
10513 style: options.style,
10514 styleSpec: options.styleSpec
10515 }));
10516 switch (unbundle(value[0])) {
10517 case '<':
10518 case '<=':
10519 case '>':
10520 case '>=':
10521 if (value.length >= 2 && unbundle(value[1]) === '$type') {
10522 errors.push(new ValidationError(key, value, `"$type" cannot be use with operator "${value[0]}"`));
10523 }
10524 /* falls through */
10525 case '==':
10526 case '!=':
10527 if (value.length !== 3) {
10528 errors.push(new ValidationError(key, value, `filter array for operator "${value[0]}" must have 3 elements`));
10529 }
10530 /* falls through */
10531 case 'in':
10532 case '!in':
10533 if (value.length >= 2) {
10534 type = getType(value[1]);
10535 if (type !== 'string') {
10536 errors.push(new ValidationError(`${key}[1]`, value[1], `string expected, ${type} found`));
10537 }
10538 }
10539 for (let i = 2; i < value.length; i++) {
10540 type = getType(value[i]);
10541 if (unbundle(value[1]) === '$type') {
10542 errors = errors.concat(validateEnum({
10543 key: `${key}[${i}]`,
10544 value: value[i],
10545 valueSpec: styleSpec.geometry_type,
10546 style: options.style,
10547 styleSpec: options.styleSpec
10548 }));
10549 }
10550 else if (type !== 'string' && type !== 'number' && type !== 'boolean') {
10551 errors.push(new ValidationError(`${key}[${i}]`, value[i], `string, number, or boolean expected, ${type} found`));
10552 }
10553 }
10554 break;
10555 case 'any':
10556 case 'all':
10557 case 'none':
10558 for (let i = 1; i < value.length; i++) {
10559 errors = errors.concat(validateNonExpressionFilter({
10560 key: `${key}[${i}]`,
10561 value: value[i],
10562 style: options.style,
10563 styleSpec: options.styleSpec
10564 }));
10565 }
10566 break;
10567 case 'has':
10568 case '!has':
10569 type = getType(value[1]);
10570 if (value.length !== 2) {
10571 errors.push(new ValidationError(key, value, `filter array for "${value[0]}" operator must have 2 elements`));
10572 }
10573 else if (type !== 'string') {
10574 errors.push(new ValidationError(`${key}[1]`, value[1], `string expected, ${type} found`));
10575 }
10576 break;
10577 case 'within':
10578 type = getType(value[1]);
10579 if (value.length !== 2) {
10580 errors.push(new ValidationError(key, value, `filter array for "${value[0]}" operator must have 2 elements`));
10581 }
10582 else if (type !== 'object') {
10583 errors.push(new ValidationError(`${key}[1]`, value[1], `object expected, ${type} found`));
10584 }
10585 break;
10586 }
10587 return errors;
10588}
10589
10590function validateProperty(options, propertyType) {
10591 const key = options.key;
10592 const style = options.style;
10593 const styleSpec = options.styleSpec;
10594 const value = options.value;
10595 const propertyKey = options.objectKey;
10596 const layerSpec = styleSpec[`${propertyType}_${options.layerType}`];
10597 if (!layerSpec)
10598 return [];
10599 const transitionMatch = propertyKey.match(/^(.*)-transition$/);
10600 if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) {
10601 return validate({
10602 key,
10603 value,
10604 valueSpec: styleSpec.transition,
10605 style,
10606 styleSpec
10607 });
10608 }
10609 const valueSpec = options.valueSpec || layerSpec[propertyKey];
10610 if (!valueSpec) {
10611 return [new ValidationError(key, value, `unknown property "${propertyKey}"`)];
10612 }
10613 let tokenMatch;
10614 if (getType(value) === 'string' && supportsPropertyExpression(valueSpec) && !valueSpec.tokens && (tokenMatch = /^{([^}]+)}$/.exec(value))) {
10615 return [new ValidationError(key, value, `"${propertyKey}" does not support interpolation syntax\n` +
10616 `Use an identity property function instead: \`{ "type": "identity", "property": ${JSON.stringify(tokenMatch[1])} }\`.`)];
10617 }
10618 const errors = [];
10619 if (options.layerType === 'symbol') {
10620 if (propertyKey === 'text-field' && style && !style.glyphs) {
10621 errors.push(new ValidationError(key, value, 'use of "text-field" requires a style "glyphs" property'));
10622 }
10623 if (propertyKey === 'text-font' && isFunction(deepUnbundle(value)) && unbundle(value.type) === 'identity') {
10624 errors.push(new ValidationError(key, value, '"text-font" does not support identity functions'));
10625 }
10626 }
10627 return errors.concat(validate({
10628 key: options.key,
10629 value,
10630 valueSpec,
10631 style,
10632 styleSpec,
10633 expressionContext: 'property',
10634 propertyType,
10635 propertyKey
10636 }));
10637}
10638
10639function validatePaintProperty$1(options) {
10640 return validateProperty(options, 'paint');
10641}
10642
10643function validateLayoutProperty$1(options) {
10644 return validateProperty(options, 'layout');
10645}
10646
10647function validateLayer(options) {
10648 let errors = [];
10649 const layer = options.value;
10650 const key = options.key;
10651 const style = options.style;
10652 const styleSpec = options.styleSpec;
10653 if (!layer.type && !layer.ref) {
10654 errors.push(new ValidationError(key, layer, 'either "type" or "ref" is required'));
10655 }
10656 let type = unbundle(layer.type);
10657 const ref = unbundle(layer.ref);
10658 if (layer.id) {
10659 const layerId = unbundle(layer.id);
10660 for (let i = 0; i < options.arrayIndex; i++) {
10661 const otherLayer = style.layers[i];
10662 if (unbundle(otherLayer.id) === layerId) {
10663 errors.push(new ValidationError(key, layer.id, `duplicate layer id "${layer.id}", previously used at line ${otherLayer.id.__line__}`));
10664 }
10665 }
10666 }
10667 if ('ref' in layer) {
10668 ['type', 'source', 'source-layer', 'filter', 'layout'].forEach((p) => {
10669 if (p in layer) {
10670 errors.push(new ValidationError(key, layer[p], `"${p}" is prohibited for ref layers`));
10671 }
10672 });
10673 let parent;
10674 style.layers.forEach((layer) => {
10675 if (unbundle(layer.id) === ref)
10676 parent = layer;
10677 });
10678 if (!parent) {
10679 errors.push(new ValidationError(key, layer.ref, `ref layer "${ref}" not found`));
10680 }
10681 else if (parent.ref) {
10682 errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer'));
10683 }
10684 else {
10685 type = unbundle(parent.type);
10686 }
10687 }
10688 else if (type !== 'background') {
10689 if (!layer.source) {
10690 errors.push(new ValidationError(key, layer, 'missing required property "source"'));
10691 }
10692 else {
10693 const source = style.sources && style.sources[layer.source];
10694 const sourceType = source && unbundle(source.type);
10695 if (!source) {
10696 errors.push(new ValidationError(key, layer.source, `source "${layer.source}" not found`));
10697 }
10698 else if (sourceType === 'vector' && type === 'raster') {
10699 errors.push(new ValidationError(key, layer.source, `layer "${layer.id}" requires a raster source`));
10700 }
10701 else if (sourceType === 'raster' && type !== 'raster') {
10702 errors.push(new ValidationError(key, layer.source, `layer "${layer.id}" requires a vector source`));
10703 }
10704 else if (sourceType === 'vector' && !layer['source-layer']) {
10705 errors.push(new ValidationError(key, layer, `layer "${layer.id}" must specify a "source-layer"`));
10706 }
10707 else if (sourceType === 'raster-dem' && type !== 'hillshade') {
10708 errors.push(new ValidationError(key, layer.source, 'raster-dem source can only be used with layer type \'hillshade\'.'));
10709 }
10710 else if (type === 'line' && layer.paint && layer.paint['line-gradient'] &&
10711 (sourceType !== 'geojson' || !source.lineMetrics)) {
10712 errors.push(new ValidationError(key, layer, `layer "${layer.id}" specifies a line-gradient, which requires a GeoJSON source with \`lineMetrics\` enabled.`));
10713 }
10714 }
10715 }
10716 errors = errors.concat(validateObject({
10717 key,
10718 value: layer,
10719 valueSpec: styleSpec.layer,
10720 style: options.style,
10721 styleSpec: options.styleSpec,
10722 objectElementValidators: {
10723 '*'() {
10724 return [];
10725 },
10726 // We don't want to enforce the spec's `"requires": true` for backward compatibility with refs;
10727 // the actual requirement is validated above. See https://github.com/mapbox/mapbox-gl-js/issues/5772.
10728 type() {
10729 return validate({
10730 key: `${key}.type`,
10731 value: layer.type,
10732 valueSpec: styleSpec.layer.type,
10733 style: options.style,
10734 styleSpec: options.styleSpec,
10735 object: layer,
10736 objectKey: 'type'
10737 });
10738 },
10739 filter: validateFilter$1,
10740 layout(options) {
10741 return validateObject({
10742 layer,
10743 key: options.key,
10744 value: options.value,
10745 style: options.style,
10746 styleSpec: options.styleSpec,
10747 objectElementValidators: {
10748 '*'(options) {
10749 return validateLayoutProperty$1(extend({ layerType: type }, options));
10750 }
10751 }
10752 });
10753 },
10754 paint(options) {
10755 return validateObject({
10756 layer,
10757 key: options.key,
10758 value: options.value,
10759 style: options.style,
10760 styleSpec: options.styleSpec,
10761 objectElementValidators: {
10762 '*'(options) {
10763 return validatePaintProperty$1(extend({ layerType: type }, options));
10764 }
10765 }
10766 });
10767 }
10768 }
10769 }));
10770 return errors;
10771}
10772
10773function validateString(options) {
10774 const value = options.value;
10775 const key = options.key;
10776 const type = getType(value);
10777 if (type !== 'string') {
10778 return [new ValidationError(key, value, `string expected, ${type} found`)];
10779 }
10780 return [];
10781}
10782
10783const objectElementValidators = {
10784 promoteId: validatePromoteId
10785};
10786function validateSource$1(options) {
10787 const value = options.value;
10788 const key = options.key;
10789 const styleSpec = options.styleSpec;
10790 const style = options.style;
10791 if (!value.type) {
10792 return [new ValidationError(key, value, '"type" is required')];
10793 }
10794 const type = unbundle(value.type);
10795 let errors;
10796 switch (type) {
10797 case 'vector':
10798 case 'raster':
10799 case 'raster-dem':
10800 errors = validateObject({
10801 key,
10802 value,
10803 valueSpec: styleSpec[`source_${type.replace('-', '_')}`],
10804 style: options.style,
10805 styleSpec,
10806 objectElementValidators
10807 });
10808 return errors;
10809 case 'geojson':
10810 errors = validateObject({
10811 key,
10812 value,
10813 valueSpec: styleSpec.source_geojson,
10814 style,
10815 styleSpec,
10816 objectElementValidators
10817 });
10818 if (value.cluster) {
10819 for (const prop in value.clusterProperties) {
10820 const [operator, mapExpr] = value.clusterProperties[prop];
10821 const reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator;
10822 errors.push(...validateExpression({
10823 key: `${key}.${prop}.map`,
10824 value: mapExpr,
10825 expressionContext: 'cluster-map'
10826 }));
10827 errors.push(...validateExpression({
10828 key: `${key}.${prop}.reduce`,
10829 value: reduceExpr,
10830 expressionContext: 'cluster-reduce'
10831 }));
10832 }
10833 }
10834 return errors;
10835 case 'video':
10836 return validateObject({
10837 key,
10838 value,
10839 valueSpec: styleSpec.source_video,
10840 style,
10841 styleSpec
10842 });
10843 case 'image':
10844 return validateObject({
10845 key,
10846 value,
10847 valueSpec: styleSpec.source_image,
10848 style,
10849 styleSpec
10850 });
10851 case 'canvas':
10852 return [new ValidationError(key, null, 'Please use runtime APIs to add canvas sources, rather than including them in stylesheets.', 'source.canvas')];
10853 default:
10854 return validateEnum({
10855 key: `${key}.type`,
10856 value: value.type,
10857 valueSpec: { values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image'] },
10858 style,
10859 styleSpec
10860 });
10861 }
10862}
10863function validatePromoteId({ key, value }) {
10864 if (getType(value) === 'string') {
10865 return validateString({ key, value });
10866 }
10867 else {
10868 const errors = [];
10869 for (const prop in value) {
10870 errors.push(...validateString({ key: `${key}.${prop}`, value: value[prop] }));
10871 }
10872 return errors;
10873 }
10874}
10875
10876function validateLight$1(options) {
10877 const light = options.value;
10878 const styleSpec = options.styleSpec;
10879 const lightSpec = styleSpec.light;
10880 const style = options.style;
10881 let errors = [];
10882 const rootType = getType(light);
10883 if (light === undefined) {
10884 return errors;
10885 }
10886 else if (rootType !== 'object') {
10887 errors = errors.concat([new ValidationError('light', light, `object expected, ${rootType} found`)]);
10888 return errors;
10889 }
10890 for (const key in light) {
10891 const transitionMatch = key.match(/^(.*)-transition$/);
10892 if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) {
10893 errors = errors.concat(validate({
10894 key,
10895 value: light[key],
10896 valueSpec: styleSpec.transition,
10897 style,
10898 styleSpec
10899 }));
10900 }
10901 else if (lightSpec[key]) {
10902 errors = errors.concat(validate({
10903 key,
10904 value: light[key],
10905 valueSpec: lightSpec[key],
10906 style,
10907 styleSpec
10908 }));
10909 }
10910 else {
10911 errors = errors.concat([new ValidationError(key, light[key], `unknown property "${key}"`)]);
10912 }
10913 }
10914 return errors;
10915}
10916
10917function validateFormatted(options) {
10918 if (validateString(options).length === 0) {
10919 return [];
10920 }
10921 return validateExpression(options);
10922}
10923
10924function validateImage(options) {
10925 if (validateString(options).length === 0) {
10926 return [];
10927 }
10928 return validateExpression(options);
10929}
10930
10931const VALIDATORS = {
10932 '*'() {
10933 return [];
10934 },
10935 'array': validateArray,
10936 'boolean': validateBoolean,
10937 'number': validateNumber,
10938 'color': validateColor,
10939 'constants': validateConstants,
10940 'enum': validateEnum,
10941 'filter': validateFilter$1,
10942 'function': validateFunction,
10943 'layer': validateLayer,
10944 'object': validateObject,
10945 'source': validateSource$1,
10946 'light': validateLight$1,
10947 'string': validateString,
10948 'formatted': validateFormatted,
10949 'resolvedImage': validateImage
10950};
10951// Main recursive validation function. Tracks:
10952//
10953// - key: string representing location of validation in style tree. Used only
10954// for more informative error reporting.
10955// - value: current value from style being evaluated. May be anything from a
10956// high level object that needs to be descended into deeper or a simple
10957// scalar value.
10958// - valueSpec: current spec being evaluated. Tracks value.
10959// - styleSpec: current full spec being evaluated.
10960function validate(options) {
10961 const value = options.value;
10962 const valueSpec = options.valueSpec;
10963 const styleSpec = options.styleSpec;
10964 if (valueSpec.expression && isFunction(unbundle(value))) {
10965 return validateFunction(options);
10966 }
10967 else if (valueSpec.expression && isExpression(deepUnbundle(value))) {
10968 return validateExpression(options);
10969 }
10970 else if (valueSpec.type && VALIDATORS[valueSpec.type]) {
10971 return VALIDATORS[valueSpec.type](options);
10972 }
10973 else {
10974 const valid = validateObject(extend({}, options, {
10975 valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec
10976 }));
10977 return valid;
10978 }
10979}
10980
10981function validateGlyphsURL (options) {
10982 const value = options.value;
10983 const key = options.key;
10984 const errors = validateString(options);
10985 if (errors.length)
10986 return errors;
10987 if (value.indexOf('{fontstack}') === -1) {
10988 errors.push(new ValidationError(key, value, '"glyphs" url must include a "{fontstack}" token'));
10989 }
10990 if (value.indexOf('{range}') === -1) {
10991 errors.push(new ValidationError(key, value, '"glyphs" url must include a "{range}" token'));
10992 }
10993 return errors;
10994}
10995
10996/**
10997 * Validate a MapLibre GL style against the style specification. This entrypoint,
10998 * `maplibre-gl-style-spec/lib/validate_style.min`, is designed to produce as
10999 * small a browserify bundle as possible by omitting unnecessary functionality
11000 * and legacy style specifications.
11001 *
11002 * @private
11003 * @param {Object} style The style to be validated.
11004 * @param {Object} [styleSpec] The style specification to validate against.
11005 * If omitted, the latest style spec is used.
11006 * @returns {Array<ValidationError>}
11007 * @example
11008 * var validate = require('maplibre-gl-style-spec/lib/validate_style.min');
11009 * var errors = validate(style);
11010 */
11011function validateStyleMin(style, styleSpec = spec) {
11012 let errors = [];
11013 errors = errors.concat(validate({
11014 key: '',
11015 value: style,
11016 valueSpec: styleSpec.$root,
11017 styleSpec,
11018 style,
11019 objectElementValidators: {
11020 glyphs: validateGlyphsURL,
11021 '*'() {
11022 return [];
11023 }
11024 }
11025 }));
11026 if (style.constants) {
11027 errors = errors.concat(validateConstants({
11028 key: 'constants',
11029 value: style.constants,
11030 style,
11031 styleSpec
11032 }));
11033 }
11034 return sortErrors(errors);
11035}
11036validateStyleMin.source = wrapCleanErrors(validateSource$1);
11037validateStyleMin.light = wrapCleanErrors(validateLight$1);
11038validateStyleMin.layer = wrapCleanErrors(validateLayer);
11039validateStyleMin.filter = wrapCleanErrors(validateFilter$1);
11040validateStyleMin.paintProperty = wrapCleanErrors(validatePaintProperty$1);
11041validateStyleMin.layoutProperty = wrapCleanErrors(validateLayoutProperty$1);
11042function sortErrors(errors) {
11043 return [].concat(errors).sort((a, b) => {
11044 return a.line - b.line;
11045 });
11046}
11047function wrapCleanErrors(inner) {
11048 return function (...args) {
11049 return sortErrors(inner.apply(this, args));
11050 };
11051}
11052
11053const validateStyle = validateStyleMin;
11054const validateSource = validateStyle.source;
11055const validateLight = validateStyle.light;
11056const validateFilter = validateStyle.filter;
11057const validatePaintProperty = validateStyle.paintProperty;
11058const validateLayoutProperty = validateStyle.layoutProperty;
11059function emitValidationErrors(emitter, errors) {
11060 let hasErrors = false;
11061 if (errors && errors.length) {
11062 for (const error of errors) {
11063 emitter.fire(new ErrorEvent(new Error(error.message)));
11064 hasErrors = true;
11065 }
11066 }
11067 return hasErrors;
11068}
11069
11070/*
11071This file was copied from https://github.com/mapbox/grid-index and was
11072migrated from JavaScript to TypeScript.
11073
11074Copyright (c) 2016, Mapbox
11075
11076Permission to use, copy, modify, and/or distribute this software for any purpose
11077with or without fee is hereby granted, provided that the above copyright notice
11078and this permission notice appear in all copies.
11079
11080THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
11081REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
11082FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11083INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
11084OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
11085TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
11086THIS SOFTWARE.
11087*/
11088const NUM_PARAMS = 3;
11089class TransferableGridIndex {
11090 constructor(extent, n, padding) {
11091 const cells = this.cells = [];
11092 if (extent instanceof ArrayBuffer) {
11093 this.arrayBuffer = extent;
11094 const array = new Int32Array(this.arrayBuffer);
11095 extent = array[0];
11096 n = array[1];
11097 padding = array[2];
11098 this.d = n + 2 * padding;
11099 for (let k = 0; k < this.d * this.d; k++) {
11100 const start = array[NUM_PARAMS + k];
11101 const end = array[NUM_PARAMS + k + 1];
11102 cells.push(start === end ? null : array.subarray(start, end));
11103 }
11104 const keysOffset = array[NUM_PARAMS + cells.length];
11105 const bboxesOffset = array[NUM_PARAMS + cells.length + 1];
11106 this.keys = array.subarray(keysOffset, bboxesOffset);
11107 this.bboxes = array.subarray(bboxesOffset);
11108 this.insert = this._insertReadonly;
11109 }
11110 else {
11111 this.d = n + 2 * padding;
11112 for (let i = 0; i < this.d * this.d; i++) {
11113 cells.push([]);
11114 }
11115 this.keys = [];
11116 this.bboxes = [];
11117 }
11118 this.n = n;
11119 this.extent = extent;
11120 this.padding = padding;
11121 this.scale = n / extent;
11122 this.uid = 0;
11123 const p = (padding / n) * extent;
11124 this.min = -p;
11125 this.max = extent + p;
11126 }
11127 insert(key, x1, y1, x2, y2) {
11128 this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++, undefined, undefined);
11129 this.keys.push(key);
11130 this.bboxes.push(x1);
11131 this.bboxes.push(y1);
11132 this.bboxes.push(x2);
11133 this.bboxes.push(y2);
11134 }
11135 _insertReadonly() {
11136 throw new Error('Cannot insert into a GridIndex created from an ArrayBuffer.');
11137 }
11138 _insertCell(x1, y1, x2, y2, cellIndex, uid) {
11139 this.cells[cellIndex].push(uid);
11140 }
11141 query(x1, y1, x2, y2, intersectionTest) {
11142 const min = this.min;
11143 const max = this.max;
11144 if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) {
11145 // We use `Array#slice` because `this.keys` may be a `Int32Array` and
11146 // some browsers (Safari and IE) do not support `TypedArray#slice`
11147 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility
11148 return Array.prototype.slice.call(this.keys);
11149 }
11150 else {
11151 const result = [];
11152 const seenUids = {};
11153 this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest);
11154 return result;
11155 }
11156 }
11157 _queryCell(x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) {
11158 const cell = this.cells[cellIndex];
11159 if (cell !== null) {
11160 const keys = this.keys;
11161 const bboxes = this.bboxes;
11162 for (let u = 0; u < cell.length; u++) {
11163 const uid = cell[u];
11164 if (seenUids[uid] === undefined) {
11165 const offset = uid * 4;
11166 if (intersectionTest ?
11167 intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) :
11168 ((x1 <= bboxes[offset + 2]) &&
11169 (y1 <= bboxes[offset + 3]) &&
11170 (x2 >= bboxes[offset + 0]) &&
11171 (y2 >= bboxes[offset + 1]))) {
11172 seenUids[uid] = true;
11173 result.push(keys[uid]);
11174 }
11175 else {
11176 seenUids[uid] = false;
11177 }
11178 }
11179 }
11180 }
11181 }
11182 _forEachCell(x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) {
11183 const cx1 = this._convertToCellCoord(x1);
11184 const cy1 = this._convertToCellCoord(y1);
11185 const cx2 = this._convertToCellCoord(x2);
11186 const cy2 = this._convertToCellCoord(y2);
11187 for (let x = cx1; x <= cx2; x++) {
11188 for (let y = cy1; y <= cy2; y++) {
11189 const cellIndex = this.d * y + x;
11190 if (intersectionTest && !intersectionTest(this._convertFromCellCoord(x), this._convertFromCellCoord(y), this._convertFromCellCoord(x + 1), this._convertFromCellCoord(y + 1)))
11191 continue;
11192 if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest))
11193 return;
11194 }
11195 }
11196 }
11197 _convertFromCellCoord(x) {
11198 return (x - this.padding) / this.scale;
11199 }
11200 _convertToCellCoord(x) {
11201 return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding));
11202 }
11203 toArrayBuffer() {
11204 if (this.arrayBuffer)
11205 return this.arrayBuffer;
11206 const cells = this.cells;
11207 const metadataLength = NUM_PARAMS + this.cells.length + 1 + 1;
11208 let totalCellLength = 0;
11209 for (let i = 0; i < this.cells.length; i++) {
11210 totalCellLength += this.cells[i].length;
11211 }
11212 const array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length);
11213 array[0] = this.extent;
11214 array[1] = this.n;
11215 array[2] = this.padding;
11216 let offset = metadataLength;
11217 for (let k = 0; k < cells.length; k++) {
11218 const cell = cells[k];
11219 array[NUM_PARAMS + k] = offset;
11220 array.set(cell, offset);
11221 offset += cell.length;
11222 }
11223 array[NUM_PARAMS + cells.length] = offset;
11224 array.set(this.keys, offset);
11225 offset += this.keys.length;
11226 array[NUM_PARAMS + cells.length + 1] = offset;
11227 array.set(this.bboxes, offset);
11228 offset += this.bboxes.length;
11229 return array.buffer;
11230 }
11231 static serialize(grid, transferables) {
11232 const buffer = grid.toArrayBuffer();
11233 if (transferables) {
11234 transferables.push(buffer);
11235 }
11236 return { buffer };
11237 }
11238 static deserialize(serialized) {
11239 return new TransferableGridIndex(serialized.buffer);
11240 }
11241}
11242
11243const registry = {};
11244/**
11245 * Register the given class as serializable.
11246 *
11247 * @param options
11248 * @param options.omit List of properties to omit from serialization (e.g., cached/computed properties)
11249 * @param options.shallow List of properties that should be serialized by a simple shallow copy, rather than by a recursive call to serialize().
11250 *
11251 * @private
11252 */
11253function register(name, klass, options = {}) {
11254 assert$1(!registry[name], `${name} is already registered.`);
11255 Object.defineProperty(klass, '_classRegistryKey', {
11256 value: name,
11257 writeable: false
11258 });
11259 registry[name] = {
11260 klass,
11261 omit: options.omit || [],
11262 shallow: options.shallow || []
11263 };
11264}
11265register('Object', Object);
11266register('TransferableGridIndex', TransferableGridIndex);
11267register('Color', Color);
11268register('Error', Error);
11269register('AJAXError', AJAXError);
11270register('ResolvedImage', ResolvedImage);
11271register('StylePropertyFunction', StylePropertyFunction);
11272register('StyleExpression', StyleExpression, { omit: ['_evaluator'] });
11273register('ZoomDependentExpression', ZoomDependentExpression);
11274register('ZoomConstantExpression', ZoomConstantExpression);
11275register('CompoundExpression', CompoundExpression, { omit: ['_evaluate'] });
11276for (const name in expressions) {
11277 if (expressions[name]._classRegistryKey)
11278 continue;
11279 register(`Expression_${name}`, expressions[name]);
11280}
11281function isArrayBuffer(value) {
11282 return value && typeof ArrayBuffer !== 'undefined' &&
11283 (value instanceof ArrayBuffer || (value.constructor && value.constructor.name === 'ArrayBuffer'));
11284}
11285/**
11286 * Serialize the given object for transfer to or from a web worker.
11287 *
11288 * For non-builtin types, recursively serialize each property (possibly
11289 * omitting certain properties - see register()), and package the result along
11290 * with the constructor's `name` so that the appropriate constructor can be
11291 * looked up in `deserialize()`.
11292 *
11293 * If a `transferables` array is provided, add any transferable objects (i.e.,
11294 * any ArrayBuffers or ArrayBuffer views) to the list. (If a copy is needed,
11295 * this should happen in the client code, before using serialize().)
11296 *
11297 * @private
11298 */
11299function serialize(input, transferables) {
11300 if (input === null ||
11301 input === undefined ||
11302 typeof input === 'boolean' ||
11303 typeof input === 'number' ||
11304 typeof input === 'string' ||
11305 input instanceof Boolean ||
11306 input instanceof Number ||
11307 input instanceof String ||
11308 input instanceof Date ||
11309 input instanceof RegExp ||
11310 input instanceof Blob) {
11311 return input;
11312 }
11313 if (isArrayBuffer(input)) {
11314 if (transferables) {
11315 transferables.push(input);
11316 }
11317 return input;
11318 }
11319 if (isImageBitmap(input)) {
11320 if (transferables) {
11321 transferables.push(input);
11322 }
11323 return input;
11324 }
11325 if (ArrayBuffer.isView(input)) {
11326 const view = input;
11327 if (transferables) {
11328 transferables.push(view.buffer);
11329 }
11330 return view;
11331 }
11332 if (input instanceof ImageData) {
11333 if (transferables) {
11334 transferables.push(input.data.buffer);
11335 }
11336 return input;
11337 }
11338 if (Array.isArray(input)) {
11339 const serialized = [];
11340 for (const item of input) {
11341 serialized.push(serialize(item, transferables));
11342 }
11343 return serialized;
11344 }
11345 if (typeof input === 'object') {
11346 const klass = input.constructor;
11347 const name = klass._classRegistryKey;
11348 if (!name) {
11349 throw new Error('can\'t serialize object of unregistered class');
11350 }
11351 assert$1(registry[name]);
11352 const properties = klass.serialize ?
11353 // (Temporary workaround) allow a class to provide static
11354 // `serialize()` and `deserialize()` methods to bypass the generic
11355 // approach.
11356 // This temporary workaround lets us use the generic serialization
11357 // approach for objects whose members include instances of dynamic
11358 // StructArray types. Once we refactor StructArray to be static,
11359 // we can remove this complexity.
11360 klass.serialize(input, transferables) : {};
11361 if (!klass.serialize) {
11362 for (const key in input) {
11363 // any cast due to https://github.com/facebook/flow/issues/5393
11364 if (!input.hasOwnProperty(key))
11365 continue; // eslint-disable-line no-prototype-builtins
11366 if (registry[name].omit.indexOf(key) >= 0)
11367 continue;
11368 const property = input[key];
11369 properties[key] = registry[name].shallow.indexOf(key) >= 0 ?
11370 property :
11371 serialize(property, transferables);
11372 }
11373 if (input instanceof Error) {
11374 properties.message = input.message;
11375 }
11376 }
11377 else {
11378 // make sure statically serialized object survives transfer of $name property
11379 assert$1(!transferables || properties !== transferables[transferables.length - 1]);
11380 }
11381 if (properties.$name) {
11382 throw new Error('$name property is reserved for worker serialization logic.');
11383 }
11384 if (name !== 'Object') {
11385 properties.$name = name;
11386 }
11387 return properties;
11388 }
11389 throw new Error(`can't serialize object of type ${typeof input}`);
11390}
11391function deserialize(input) {
11392 if (input === null ||
11393 input === undefined ||
11394 typeof input === 'boolean' ||
11395 typeof input === 'number' ||
11396 typeof input === 'string' ||
11397 input instanceof Boolean ||
11398 input instanceof Number ||
11399 input instanceof String ||
11400 input instanceof Date ||
11401 input instanceof RegExp ||
11402 input instanceof Blob ||
11403 isArrayBuffer(input) ||
11404 isImageBitmap(input) ||
11405 ArrayBuffer.isView(input) ||
11406 input instanceof ImageData) {
11407 return input;
11408 }
11409 if (Array.isArray(input)) {
11410 return input.map(deserialize);
11411 }
11412 if (typeof input === 'object') {
11413 const name = input.$name || 'Object';
11414 if (!registry[name]) {
11415 throw new Error(`can't deserialize unregistered class ${name}`);
11416 }
11417 const { klass } = registry[name];
11418 if (!klass) {
11419 throw new Error(`can't deserialize unregistered class ${name}`);
11420 }
11421 if (klass.deserialize) {
11422 return klass.deserialize(input);
11423 }
11424 const result = Object.create(klass.prototype);
11425 for (const key of Object.keys(input)) {
11426 if (key === '$name')
11427 continue;
11428 const value = input[key];
11429 result[key] = registry[name].shallow.indexOf(key) >= 0 ? value : deserialize(value);
11430 }
11431 return result;
11432 }
11433 throw new Error(`can't deserialize object of type ${typeof input}`);
11434}
11435
11436class ZoomHistory {
11437 constructor() {
11438 this.first = true;
11439 }
11440 update(z, now) {
11441 const floorZ = Math.floor(z);
11442 if (this.first) {
11443 this.first = false;
11444 this.lastIntegerZoom = floorZ;
11445 this.lastIntegerZoomTime = 0;
11446 this.lastZoom = z;
11447 this.lastFloorZoom = floorZ;
11448 return true;
11449 }
11450 if (this.lastFloorZoom > floorZ) {
11451 this.lastIntegerZoom = floorZ + 1;
11452 this.lastIntegerZoomTime = now;
11453 }
11454 else if (this.lastFloorZoom < floorZ) {
11455 this.lastIntegerZoom = floorZ;
11456 this.lastIntegerZoomTime = now;
11457 }
11458 if (z !== this.lastZoom) {
11459 this.lastZoom = z;
11460 this.lastFloorZoom = floorZ;
11461 return true;
11462 }
11463 return false;
11464 }
11465}
11466
11467// The following table comes from <http://www.unicode.org/Public/12.0.0/ucd/Blocks.txt>.
11468// Keep it synchronized with <http://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt>.
11469const unicodeBlockLookup = {
11470 // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F,
11471 'Latin-1 Supplement': (char) => char >= 0x0080 && char <= 0x00FF,
11472 // 'Latin Extended-A': (char) => char >= 0x0100 && char <= 0x017F,
11473 // 'Latin Extended-B': (char) => char >= 0x0180 && char <= 0x024F,
11474 // 'IPA Extensions': (char) => char >= 0x0250 && char <= 0x02AF,
11475 // 'Spacing Modifier Letters': (char) => char >= 0x02B0 && char <= 0x02FF,
11476 // 'Combining Diacritical Marks': (char) => char >= 0x0300 && char <= 0x036F,
11477 // 'Greek and Coptic': (char) => char >= 0x0370 && char <= 0x03FF,
11478 // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF,
11479 // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F,
11480 // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F,
11481 //'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF,
11482 'Arabic': (char) => char >= 0x0600 && char <= 0x06FF,
11483 //'Syriac': (char) => char >= 0x0700 && char <= 0x074F,
11484 'Arabic Supplement': (char) => char >= 0x0750 && char <= 0x077F,
11485 // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF,
11486 // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF,
11487 // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F,
11488 // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F,
11489 // 'Syriac Supplement': (char) => char >= 0x0860 && char <= 0x086F,
11490 'Arabic Extended-A': (char) => char >= 0x08A0 && char <= 0x08FF,
11491 // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F,
11492 // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF,
11493 // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F,
11494 // 'Gujarati': (char) => char >= 0x0A80 && char <= 0x0AFF,
11495 // 'Oriya': (char) => char >= 0x0B00 && char <= 0x0B7F,
11496 // 'Tamil': (char) => char >= 0x0B80 && char <= 0x0BFF,
11497 // 'Telugu': (char) => char >= 0x0C00 && char <= 0x0C7F,
11498 // 'Kannada': (char) => char >= 0x0C80 && char <= 0x0CFF,
11499 // 'Malayalam': (char) => char >= 0x0D00 && char <= 0x0D7F,
11500 // 'Sinhala': (char) => char >= 0x0D80 && char <= 0x0DFF,
11501 // 'Thai': (char) => char >= 0x0E00 && char <= 0x0E7F,
11502 // 'Lao': (char) => char >= 0x0E80 && char <= 0x0EFF,
11503 // 'Tibetan': (char) => char >= 0x0F00 && char <= 0x0FFF,
11504 // 'Myanmar': (char) => char >= 0x1000 && char <= 0x109F,
11505 // 'Georgian': (char) => char >= 0x10A0 && char <= 0x10FF,
11506 'Hangul Jamo': (char) => char >= 0x1100 && char <= 0x11FF,
11507 // 'Ethiopic': (char) => char >= 0x1200 && char <= 0x137F,
11508 // 'Ethiopic Supplement': (char) => char >= 0x1380 && char <= 0x139F,
11509 // 'Cherokee': (char) => char >= 0x13A0 && char <= 0x13FF,
11510 'Unified Canadian Aboriginal Syllabics': (char) => char >= 0x1400 && char <= 0x167F,
11511 // 'Ogham': (char) => char >= 0x1680 && char <= 0x169F,
11512 // 'Runic': (char) => char >= 0x16A0 && char <= 0x16FF,
11513 // 'Tagalog': (char) => char >= 0x1700 && char <= 0x171F,
11514 // 'Hanunoo': (char) => char >= 0x1720 && char <= 0x173F,
11515 // 'Buhid': (char) => char >= 0x1740 && char <= 0x175F,
11516 // 'Tagbanwa': (char) => char >= 0x1760 && char <= 0x177F,
11517 'Khmer': (char) => char >= 0x1780 && char <= 0x17FF,
11518 // 'Mongolian': (char) => char >= 0x1800 && char <= 0x18AF,
11519 'Unified Canadian Aboriginal Syllabics Extended': (char) => char >= 0x18B0 && char <= 0x18FF,
11520 // 'Limbu': (char) => char >= 0x1900 && char <= 0x194F,
11521 // 'Tai Le': (char) => char >= 0x1950 && char <= 0x197F,
11522 // 'New Tai Lue': (char) => char >= 0x1980 && char <= 0x19DF,
11523 // 'Khmer Symbols': (char) => char >= 0x19E0 && char <= 0x19FF,
11524 // 'Buginese': (char) => char >= 0x1A00 && char <= 0x1A1F,
11525 // 'Tai Tham': (char) => char >= 0x1A20 && char <= 0x1AAF,
11526 // 'Combining Diacritical Marks Extended': (char) => char >= 0x1AB0 && char <= 0x1AFF,
11527 // 'Balinese': (char) => char >= 0x1B00 && char <= 0x1B7F,
11528 // 'Sundanese': (char) => char >= 0x1B80 && char <= 0x1BBF,
11529 // 'Batak': (char) => char >= 0x1BC0 && char <= 0x1BFF,
11530 // 'Lepcha': (char) => char >= 0x1C00 && char <= 0x1C4F,
11531 // 'Ol Chiki': (char) => char >= 0x1C50 && char <= 0x1C7F,
11532 // 'Cyrillic Extended-C': (char) => char >= 0x1C80 && char <= 0x1C8F,
11533 // 'Georgian Extended': (char) => char >= 0x1C90 && char <= 0x1CBF,
11534 // 'Sundanese Supplement': (char) => char >= 0x1CC0 && char <= 0x1CCF,
11535 // 'Vedic Extensions': (char) => char >= 0x1CD0 && char <= 0x1CFF,
11536 // 'Phonetic Extensions': (char) => char >= 0x1D00 && char <= 0x1D7F,
11537 // 'Phonetic Extensions Supplement': (char) => char >= 0x1D80 && char <= 0x1DBF,
11538 // 'Combining Diacritical Marks Supplement': (char) => char >= 0x1DC0 && char <= 0x1DFF,
11539 // 'Latin Extended Additional': (char) => char >= 0x1E00 && char <= 0x1EFF,
11540 // 'Greek Extended': (char) => char >= 0x1F00 && char <= 0x1FFF,
11541 'General Punctuation': (char) => char >= 0x2000 && char <= 0x206F,
11542 // 'Superscripts and Subscripts': (char) => char >= 0x2070 && char <= 0x209F,
11543 // 'Currency Symbols': (char) => char >= 0x20A0 && char <= 0x20CF,
11544 // 'Combining Diacritical Marks for Symbols': (char) => char >= 0x20D0 && char <= 0x20FF,
11545 'Letterlike Symbols': (char) => char >= 0x2100 && char <= 0x214F,
11546 'Number Forms': (char) => char >= 0x2150 && char <= 0x218F,
11547 // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF,
11548 // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF,
11549 'Miscellaneous Technical': (char) => char >= 0x2300 && char <= 0x23FF,
11550 'Control Pictures': (char) => char >= 0x2400 && char <= 0x243F,
11551 'Optical Character Recognition': (char) => char >= 0x2440 && char <= 0x245F,
11552 'Enclosed Alphanumerics': (char) => char >= 0x2460 && char <= 0x24FF,
11553 // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F,
11554 // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F,
11555 'Geometric Shapes': (char) => char >= 0x25A0 && char <= 0x25FF,
11556 'Miscellaneous Symbols': (char) => char >= 0x2600 && char <= 0x26FF,
11557 // 'Dingbats': (char) => char >= 0x2700 && char <= 0x27BF,
11558 // 'Miscellaneous Mathematical Symbols-A': (char) => char >= 0x27C0 && char <= 0x27EF,
11559 // 'Supplemental Arrows-A': (char) => char >= 0x27F0 && char <= 0x27FF,
11560 // 'Braille Patterns': (char) => char >= 0x2800 && char <= 0x28FF,
11561 // 'Supplemental Arrows-B': (char) => char >= 0x2900 && char <= 0x297F,
11562 // 'Miscellaneous Mathematical Symbols-B': (char) => char >= 0x2980 && char <= 0x29FF,
11563 // 'Supplemental Mathematical Operators': (char) => char >= 0x2A00 && char <= 0x2AFF,
11564 'Miscellaneous Symbols and Arrows': (char) => char >= 0x2B00 && char <= 0x2BFF,
11565 // 'Glagolitic': (char) => char >= 0x2C00 && char <= 0x2C5F,
11566 // 'Latin Extended-C': (char) => char >= 0x2C60 && char <= 0x2C7F,
11567 // 'Coptic': (char) => char >= 0x2C80 && char <= 0x2CFF,
11568 // 'Georgian Supplement': (char) => char >= 0x2D00 && char <= 0x2D2F,
11569 // 'Tifinagh': (char) => char >= 0x2D30 && char <= 0x2D7F,
11570 // 'Ethiopic Extended': (char) => char >= 0x2D80 && char <= 0x2DDF,
11571 // 'Cyrillic Extended-A': (char) => char >= 0x2DE0 && char <= 0x2DFF,
11572 // 'Supplemental Punctuation': (char) => char >= 0x2E00 && char <= 0x2E7F,
11573 'CJK Radicals Supplement': (char) => char >= 0x2E80 && char <= 0x2EFF,
11574 'Kangxi Radicals': (char) => char >= 0x2F00 && char <= 0x2FDF,
11575 'Ideographic Description Characters': (char) => char >= 0x2FF0 && char <= 0x2FFF,
11576 'CJK Symbols and Punctuation': (char) => char >= 0x3000 && char <= 0x303F,
11577 'Hiragana': (char) => char >= 0x3040 && char <= 0x309F,
11578 'Katakana': (char) => char >= 0x30A0 && char <= 0x30FF,
11579 'Bopomofo': (char) => char >= 0x3100 && char <= 0x312F,
11580 'Hangul Compatibility Jamo': (char) => char >= 0x3130 && char <= 0x318F,
11581 'Kanbun': (char) => char >= 0x3190 && char <= 0x319F,
11582 'Bopomofo Extended': (char) => char >= 0x31A0 && char <= 0x31BF,
11583 'CJK Strokes': (char) => char >= 0x31C0 && char <= 0x31EF,
11584 'Katakana Phonetic Extensions': (char) => char >= 0x31F0 && char <= 0x31FF,
11585 'Enclosed CJK Letters and Months': (char) => char >= 0x3200 && char <= 0x32FF,
11586 'CJK Compatibility': (char) => char >= 0x3300 && char <= 0x33FF,
11587 'CJK Unified Ideographs Extension A': (char) => char >= 0x3400 && char <= 0x4DBF,
11588 'Yijing Hexagram Symbols': (char) => char >= 0x4DC0 && char <= 0x4DFF,
11589 'CJK Unified Ideographs': (char) => char >= 0x4E00 && char <= 0x9FFF,
11590 'Yi Syllables': (char) => char >= 0xA000 && char <= 0xA48F,
11591 'Yi Radicals': (char) => char >= 0xA490 && char <= 0xA4CF,
11592 // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF,
11593 // 'Vai': (char) => char >= 0xA500 && char <= 0xA63F,
11594 // 'Cyrillic Extended-B': (char) => char >= 0xA640 && char <= 0xA69F,
11595 // 'Bamum': (char) => char >= 0xA6A0 && char <= 0xA6FF,
11596 // 'Modifier Tone Letters': (char) => char >= 0xA700 && char <= 0xA71F,
11597 // 'Latin Extended-D': (char) => char >= 0xA720 && char <= 0xA7FF,
11598 // 'Syloti Nagri': (char) => char >= 0xA800 && char <= 0xA82F,
11599 // 'Common Indic Number Forms': (char) => char >= 0xA830 && char <= 0xA83F,
11600 // 'Phags-pa': (char) => char >= 0xA840 && char <= 0xA87F,
11601 // 'Saurashtra': (char) => char >= 0xA880 && char <= 0xA8DF,
11602 // 'Devanagari Extended': (char) => char >= 0xA8E0 && char <= 0xA8FF,
11603 // 'Kayah Li': (char) => char >= 0xA900 && char <= 0xA92F,
11604 // 'Rejang': (char) => char >= 0xA930 && char <= 0xA95F,
11605 'Hangul Jamo Extended-A': (char) => char >= 0xA960 && char <= 0xA97F,
11606 // 'Javanese': (char) => char >= 0xA980 && char <= 0xA9DF,
11607 // 'Myanmar Extended-B': (char) => char >= 0xA9E0 && char <= 0xA9FF,
11608 // 'Cham': (char) => char >= 0xAA00 && char <= 0xAA5F,
11609 // 'Myanmar Extended-A': (char) => char >= 0xAA60 && char <= 0xAA7F,
11610 // 'Tai Viet': (char) => char >= 0xAA80 && char <= 0xAADF,
11611 // 'Meetei Mayek Extensions': (char) => char >= 0xAAE0 && char <= 0xAAFF,
11612 // 'Ethiopic Extended-A': (char) => char >= 0xAB00 && char <= 0xAB2F,
11613 // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F,
11614 // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF,
11615 // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF,
11616 'Hangul Syllables': (char) => char >= 0xAC00 && char <= 0xD7AF,
11617 'Hangul Jamo Extended-B': (char) => char >= 0xD7B0 && char <= 0xD7FF,
11618 // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F,
11619 // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF,
11620 // 'Low Surrogates': (char) => char >= 0xDC00 && char <= 0xDFFF,
11621 'Private Use Area': (char) => char >= 0xE000 && char <= 0xF8FF,
11622 'CJK Compatibility Ideographs': (char) => char >= 0xF900 && char <= 0xFAFF,
11623 // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F,
11624 'Arabic Presentation Forms-A': (char) => char >= 0xFB50 && char <= 0xFDFF,
11625 // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F,
11626 'Vertical Forms': (char) => char >= 0xFE10 && char <= 0xFE1F,
11627 // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F,
11628 'CJK Compatibility Forms': (char) => char >= 0xFE30 && char <= 0xFE4F,
11629 'Small Form Variants': (char) => char >= 0xFE50 && char <= 0xFE6F,
11630 'Arabic Presentation Forms-B': (char) => char >= 0xFE70 && char <= 0xFEFF,
11631 'Halfwidth and Fullwidth Forms': (char) => char >= 0xFF00 && char <= 0xFFEF
11632 // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF,
11633 // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F,
11634 // 'Linear B Ideograms': (char) => char >= 0x10080 && char <= 0x100FF,
11635 // 'Aegean Numbers': (char) => char >= 0x10100 && char <= 0x1013F,
11636 // 'Ancient Greek Numbers': (char) => char >= 0x10140 && char <= 0x1018F,
11637 // 'Ancient Symbols': (char) => char >= 0x10190 && char <= 0x101CF,
11638 // 'Phaistos Disc': (char) => char >= 0x101D0 && char <= 0x101FF,
11639 // 'Lycian': (char) => char >= 0x10280 && char <= 0x1029F,
11640 // 'Carian': (char) => char >= 0x102A0 && char <= 0x102DF,
11641 // 'Coptic Epact Numbers': (char) => char >= 0x102E0 && char <= 0x102FF,
11642 // 'Old Italic': (char) => char >= 0x10300 && char <= 0x1032F,
11643 // 'Gothic': (char) => char >= 0x10330 && char <= 0x1034F,
11644 // 'Old Permic': (char) => char >= 0x10350 && char <= 0x1037F,
11645 // 'Ugaritic': (char) => char >= 0x10380 && char <= 0x1039F,
11646 // 'Old Persian': (char) => char >= 0x103A0 && char <= 0x103DF,
11647 // 'Deseret': (char) => char >= 0x10400 && char <= 0x1044F,
11648 // 'Shavian': (char) => char >= 0x10450 && char <= 0x1047F,
11649 // 'Osmanya': (char) => char >= 0x10480 && char <= 0x104AF,
11650 // 'Osage': (char) => char >= 0x104B0 && char <= 0x104FF,
11651 // 'Elbasan': (char) => char >= 0x10500 && char <= 0x1052F,
11652 // 'Caucasian Albanian': (char) => char >= 0x10530 && char <= 0x1056F,
11653 // 'Linear A': (char) => char >= 0x10600 && char <= 0x1077F,
11654 // 'Cypriot Syllabary': (char) => char >= 0x10800 && char <= 0x1083F,
11655 // 'Imperial Aramaic': (char) => char >= 0x10840 && char <= 0x1085F,
11656 // 'Palmyrene': (char) => char >= 0x10860 && char <= 0x1087F,
11657 // 'Nabataean': (char) => char >= 0x10880 && char <= 0x108AF,
11658 // 'Hatran': (char) => char >= 0x108E0 && char <= 0x108FF,
11659 // 'Phoenician': (char) => char >= 0x10900 && char <= 0x1091F,
11660 // 'Lydian': (char) => char >= 0x10920 && char <= 0x1093F,
11661 // 'Meroitic Hieroglyphs': (char) => char >= 0x10980 && char <= 0x1099F,
11662 // 'Meroitic Cursive': (char) => char >= 0x109A0 && char <= 0x109FF,
11663 // 'Kharoshthi': (char) => char >= 0x10A00 && char <= 0x10A5F,
11664 // 'Old South Arabian': (char) => char >= 0x10A60 && char <= 0x10A7F,
11665 // 'Old North Arabian': (char) => char >= 0x10A80 && char <= 0x10A9F,
11666 // 'Manichaean': (char) => char >= 0x10AC0 && char <= 0x10AFF,
11667 // 'Avestan': (char) => char >= 0x10B00 && char <= 0x10B3F,
11668 // 'Inscriptional Parthian': (char) => char >= 0x10B40 && char <= 0x10B5F,
11669 // 'Inscriptional Pahlavi': (char) => char >= 0x10B60 && char <= 0x10B7F,
11670 // 'Psalter Pahlavi': (char) => char >= 0x10B80 && char <= 0x10BAF,
11671 // 'Old Turkic': (char) => char >= 0x10C00 && char <= 0x10C4F,
11672 // 'Old Hungarian': (char) => char >= 0x10C80 && char <= 0x10CFF,
11673 // 'Hanifi Rohingya': (char) => char >= 0x10D00 && char <= 0x10D3F,
11674 // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F,
11675 // 'Old Sogdian': (char) => char >= 0x10F00 && char <= 0x10F2F,
11676 // 'Sogdian': (char) => char >= 0x10F30 && char <= 0x10F6F,
11677 // 'Elymaic': (char) => char >= 0x10FE0 && char <= 0x10FFF,
11678 // 'Brahmi': (char) => char >= 0x11000 && char <= 0x1107F,
11679 // 'Kaithi': (char) => char >= 0x11080 && char <= 0x110CF,
11680 // 'Sora Sompeng': (char) => char >= 0x110D0 && char <= 0x110FF,
11681 // 'Chakma': (char) => char >= 0x11100 && char <= 0x1114F,
11682 // 'Mahajani': (char) => char >= 0x11150 && char <= 0x1117F,
11683 // 'Sharada': (char) => char >= 0x11180 && char <= 0x111DF,
11684 // 'Sinhala Archaic Numbers': (char) => char >= 0x111E0 && char <= 0x111FF,
11685 // 'Khojki': (char) => char >= 0x11200 && char <= 0x1124F,
11686 // 'Multani': (char) => char >= 0x11280 && char <= 0x112AF,
11687 // 'Khudawadi': (char) => char >= 0x112B0 && char <= 0x112FF,
11688 // 'Grantha': (char) => char >= 0x11300 && char <= 0x1137F,
11689 // 'Newa': (char) => char >= 0x11400 && char <= 0x1147F,
11690 // 'Tirhuta': (char) => char >= 0x11480 && char <= 0x114DF,
11691 // 'Siddham': (char) => char >= 0x11580 && char <= 0x115FF,
11692 // 'Modi': (char) => char >= 0x11600 && char <= 0x1165F,
11693 // 'Mongolian Supplement': (char) => char >= 0x11660 && char <= 0x1167F,
11694 // 'Takri': (char) => char >= 0x11680 && char <= 0x116CF,
11695 // 'Ahom': (char) => char >= 0x11700 && char <= 0x1173F,
11696 // 'Dogra': (char) => char >= 0x11800 && char <= 0x1184F,
11697 // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF,
11698 // 'Nandinagari': (char) => char >= 0x119A0 && char <= 0x119FF,
11699 // 'Zanabazar Square': (char) => char >= 0x11A00 && char <= 0x11A4F,
11700 // 'Soyombo': (char) => char >= 0x11A50 && char <= 0x11AAF,
11701 // 'Pau Cin Hau': (char) => char >= 0x11AC0 && char <= 0x11AFF,
11702 // 'Bhaiksuki': (char) => char >= 0x11C00 && char <= 0x11C6F,
11703 // 'Marchen': (char) => char >= 0x11C70 && char <= 0x11CBF,
11704 // 'Masaram Gondi': (char) => char >= 0x11D00 && char <= 0x11D5F,
11705 // 'Gunjala Gondi': (char) => char >= 0x11D60 && char <= 0x11DAF,
11706 // 'Makasar': (char) => char >= 0x11EE0 && char <= 0x11EFF,
11707 // 'Tamil Supplement': (char) => char >= 0x11FC0 && char <= 0x11FFF,
11708 // 'Cuneiform': (char) => char >= 0x12000 && char <= 0x123FF,
11709 // 'Cuneiform Numbers and Punctuation': (char) => char >= 0x12400 && char <= 0x1247F,
11710 // 'Early Dynastic Cuneiform': (char) => char >= 0x12480 && char <= 0x1254F,
11711 // 'Egyptian Hieroglyphs': (char) => char >= 0x13000 && char <= 0x1342F,
11712 // 'Egyptian Hieroglyph Format Controls': (char) => char >= 0x13430 && char <= 0x1343F,
11713 // 'Anatolian Hieroglyphs': (char) => char >= 0x14400 && char <= 0x1467F,
11714 // 'Bamum Supplement': (char) => char >= 0x16800 && char <= 0x16A3F,
11715 // 'Mro': (char) => char >= 0x16A40 && char <= 0x16A6F,
11716 // 'Bassa Vah': (char) => char >= 0x16AD0 && char <= 0x16AFF,
11717 // 'Pahawh Hmong': (char) => char >= 0x16B00 && char <= 0x16B8F,
11718 // 'Medefaidrin': (char) => char >= 0x16E40 && char <= 0x16E9F,
11719 // 'Miao': (char) => char >= 0x16F00 && char <= 0x16F9F,
11720 // 'Ideographic Symbols and Punctuation': (char) => char >= 0x16FE0 && char <= 0x16FFF,
11721 // 'Tangut': (char) => char >= 0x17000 && char <= 0x187FF,
11722 // 'Tangut Components': (char) => char >= 0x18800 && char <= 0x18AFF,
11723 // 'Kana Supplement': (char) => char >= 0x1B000 && char <= 0x1B0FF,
11724 // 'Kana Extended-A': (char) => char >= 0x1B100 && char <= 0x1B12F,
11725 // 'Small Kana Extension': (char) => char >= 0x1B130 && char <= 0x1B16F,
11726 // 'Nushu': (char) => char >= 0x1B170 && char <= 0x1B2FF,
11727 // 'Duployan': (char) => char >= 0x1BC00 && char <= 0x1BC9F,
11728 // 'Shorthand Format Controls': (char) => char >= 0x1BCA0 && char <= 0x1BCAF,
11729 // 'Byzantine Musical Symbols': (char) => char >= 0x1D000 && char <= 0x1D0FF,
11730 // 'Musical Symbols': (char) => char >= 0x1D100 && char <= 0x1D1FF,
11731 // 'Ancient Greek Musical Notation': (char) => char >= 0x1D200 && char <= 0x1D24F,
11732 // 'Mayan Numerals': (char) => char >= 0x1D2E0 && char <= 0x1D2FF,
11733 // 'Tai Xuan Jing Symbols': (char) => char >= 0x1D300 && char <= 0x1D35F,
11734 // 'Counting Rod Numerals': (char) => char >= 0x1D360 && char <= 0x1D37F,
11735 // 'Mathematical Alphanumeric Symbols': (char) => char >= 0x1D400 && char <= 0x1D7FF,
11736 // 'Sutton SignWriting': (char) => char >= 0x1D800 && char <= 0x1DAAF,
11737 // 'Glagolitic Supplement': (char) => char >= 0x1E000 && char <= 0x1E02F,
11738 // 'Nyiakeng Puachue Hmong': (char) => char >= 0x1E100 && char <= 0x1E14F,
11739 // 'Wancho': (char) => char >= 0x1E2C0 && char <= 0x1E2FF,
11740 // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF,
11741 // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F,
11742 // 'Indic Siyaq Numbers': (char) => char >= 0x1EC70 && char <= 0x1ECBF,
11743 // 'Ottoman Siyaq Numbers': (char) => char >= 0x1ED00 && char <= 0x1ED4F,
11744 // 'Arabic Mathematical Alphabetic Symbols': (char) => char >= 0x1EE00 && char <= 0x1EEFF,
11745 // 'Mahjong Tiles': (char) => char >= 0x1F000 && char <= 0x1F02F,
11746 // 'Domino Tiles': (char) => char >= 0x1F030 && char <= 0x1F09F,
11747 // 'Playing Cards': (char) => char >= 0x1F0A0 && char <= 0x1F0FF,
11748 // 'Enclosed Alphanumeric Supplement': (char) => char >= 0x1F100 && char <= 0x1F1FF,
11749 // 'Enclosed Ideographic Supplement': (char) => char >= 0x1F200 && char <= 0x1F2FF,
11750 // 'Miscellaneous Symbols and Pictographs': (char) => char >= 0x1F300 && char <= 0x1F5FF,
11751 // 'Emoticons': (char) => char >= 0x1F600 && char <= 0x1F64F,
11752 // 'Ornamental Dingbats': (char) => char >= 0x1F650 && char <= 0x1F67F,
11753 // 'Transport and Map Symbols': (char) => char >= 0x1F680 && char <= 0x1F6FF,
11754 // 'Alchemical Symbols': (char) => char >= 0x1F700 && char <= 0x1F77F,
11755 // 'Geometric Shapes Extended': (char) => char >= 0x1F780 && char <= 0x1F7FF,
11756 // 'Supplemental Arrows-C': (char) => char >= 0x1F800 && char <= 0x1F8FF,
11757 // 'Supplemental Symbols and Pictographs': (char) => char >= 0x1F900 && char <= 0x1F9FF,
11758 // 'Chess Symbols': (char) => char >= 0x1FA00 && char <= 0x1FA6F,
11759 // 'Symbols and Pictographs Extended-A': (char) => char >= 0x1FA70 && char <= 0x1FAFF,
11760 // 'CJK Unified Ideographs Extension B': (char) => char >= 0x20000 && char <= 0x2A6DF,
11761 // 'CJK Unified Ideographs Extension C': (char) => char >= 0x2A700 && char <= 0x2B73F,
11762 // 'CJK Unified Ideographs Extension D': (char) => char >= 0x2B740 && char <= 0x2B81F,
11763 // 'CJK Unified Ideographs Extension E': (char) => char >= 0x2B820 && char <= 0x2CEAF,
11764 // 'CJK Unified Ideographs Extension F': (char) => char >= 0x2CEB0 && char <= 0x2EBEF,
11765 // 'CJK Compatibility Ideographs Supplement': (char) => char >= 0x2F800 && char <= 0x2FA1F,
11766 // 'Tags': (char) => char >= 0xE0000 && char <= 0xE007F,
11767 // 'Variation Selectors Supplement': (char) => char >= 0xE0100 && char <= 0xE01EF,
11768 // 'Supplementary Private Use Area-A': (char) => char >= 0xF0000 && char <= 0xFFFFF,
11769 // 'Supplementary Private Use Area-B': (char) => char >= 0x100000 && char <= 0x10FFFF,
11770};
11771
11772/* eslint-disable new-cap */
11773function allowsIdeographicBreaking(chars) {
11774 for (const char of chars) {
11775 if (!charAllowsIdeographicBreaking(char.charCodeAt(0)))
11776 return false;
11777 }
11778 return true;
11779}
11780function allowsVerticalWritingMode(chars) {
11781 for (const char of chars) {
11782 if (charHasUprightVerticalOrientation(char.charCodeAt(0)))
11783 return true;
11784 }
11785 return false;
11786}
11787function allowsLetterSpacing(chars) {
11788 for (const char of chars) {
11789 if (!charAllowsLetterSpacing(char.charCodeAt(0)))
11790 return false;
11791 }
11792 return true;
11793}
11794function charAllowsLetterSpacing(char) {
11795 if (unicodeBlockLookup['Arabic'](char))
11796 return false;
11797 if (unicodeBlockLookup['Arabic Supplement'](char))
11798 return false;
11799 if (unicodeBlockLookup['Arabic Extended-A'](char))
11800 return false;
11801 if (unicodeBlockLookup['Arabic Presentation Forms-A'](char))
11802 return false;
11803 if (unicodeBlockLookup['Arabic Presentation Forms-B'](char))
11804 return false;
11805 return true;
11806}
11807function charAllowsIdeographicBreaking(char) {
11808 // Return early for characters outside all ideographic ranges.
11809 if (char < 0x2E80)
11810 return false;
11811 if (unicodeBlockLookup['Bopomofo Extended'](char))
11812 return true;
11813 if (unicodeBlockLookup['Bopomofo'](char))
11814 return true;
11815 if (unicodeBlockLookup['CJK Compatibility Forms'](char))
11816 return true;
11817 if (unicodeBlockLookup['CJK Compatibility Ideographs'](char))
11818 return true;
11819 if (unicodeBlockLookup['CJK Compatibility'](char))
11820 return true;
11821 if (unicodeBlockLookup['CJK Radicals Supplement'](char))
11822 return true;
11823 if (unicodeBlockLookup['CJK Strokes'](char))
11824 return true;
11825 if (unicodeBlockLookup['CJK Symbols and Punctuation'](char))
11826 return true;
11827 if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char))
11828 return true;
11829 if (unicodeBlockLookup['CJK Unified Ideographs'](char))
11830 return true;
11831 if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char))
11832 return true;
11833 if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char))
11834 return true;
11835 if (unicodeBlockLookup['Hiragana'](char))
11836 return true;
11837 if (unicodeBlockLookup['Ideographic Description Characters'](char))
11838 return true;
11839 if (unicodeBlockLookup['Kangxi Radicals'](char))
11840 return true;
11841 if (unicodeBlockLookup['Katakana Phonetic Extensions'](char))
11842 return true;
11843 if (unicodeBlockLookup['Katakana'](char))
11844 return true;
11845 if (unicodeBlockLookup['Vertical Forms'](char))
11846 return true;
11847 if (unicodeBlockLookup['Yi Radicals'](char))
11848 return true;
11849 if (unicodeBlockLookup['Yi Syllables'](char))
11850 return true;
11851 return false;
11852}
11853// The following logic comes from
11854// <http://www.unicode.org/Public/12.0.0/ucd/VerticalOrientation.txt>.
11855// Keep it synchronized with
11856// <http://www.unicode.org/Public/UCD/latest/ucd/VerticalOrientation.txt>.
11857// The data file denotes with “U” or “Tu” any codepoint that may be drawn
11858// upright in vertical text but does not distinguish between upright and
11859// “neutral” characters.
11860// Blocks in the Unicode supplementary planes are excluded from this module due
11861// to <https://github.com/mapbox/mapbox-gl/issues/29>.
11862/**
11863 * Returns true if the given Unicode codepoint identifies a character with
11864 * upright orientation.
11865 *
11866 * A character has upright orientation if it is drawn upright (unrotated)
11867 * whether the line is oriented horizontally or vertically, even if both
11868 * adjacent characters can be rotated. For example, a Chinese character is
11869 * always drawn upright. An uprightly oriented character causes an adjacent
11870 * “neutral” character to be drawn upright as well.
11871 * @private
11872 */
11873function charHasUprightVerticalOrientation(char) {
11874 if (char === 0x02EA /* modifier letter yin departing tone mark */ ||
11875 char === 0x02EB /* modifier letter yang departing tone mark */) {
11876 return true;
11877 }
11878 // Return early for characters outside all ranges whose characters remain
11879 // upright in vertical writing mode.
11880 if (char < 0x1100)
11881 return false;
11882 if (unicodeBlockLookup['Bopomofo Extended'](char))
11883 return true;
11884 if (unicodeBlockLookup['Bopomofo'](char))
11885 return true;
11886 if (unicodeBlockLookup['CJK Compatibility Forms'](char)) {
11887 if (!((char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F) /* wavy low line */)) {
11888 return true;
11889 }
11890 }
11891 if (unicodeBlockLookup['CJK Compatibility Ideographs'](char))
11892 return true;
11893 if (unicodeBlockLookup['CJK Compatibility'](char))
11894 return true;
11895 if (unicodeBlockLookup['CJK Radicals Supplement'](char))
11896 return true;
11897 if (unicodeBlockLookup['CJK Strokes'](char))
11898 return true;
11899 if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) {
11900 if (!((char >= 0x3008 /* left angle bracket */ && char <= 0x3011) /* right black lenticular bracket */) &&
11901 !((char >= 0x3014 /* left tortoise shell bracket */ && char <= 0x301F) /* low double prime quotation mark */) &&
11902 char !== 0x3030 /* wavy dash */) {
11903 return true;
11904 }
11905 }
11906 if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char))
11907 return true;
11908 if (unicodeBlockLookup['CJK Unified Ideographs'](char))
11909 return true;
11910 if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char))
11911 return true;
11912 if (unicodeBlockLookup['Hangul Compatibility Jamo'](char))
11913 return true;
11914 if (unicodeBlockLookup['Hangul Jamo Extended-A'](char))
11915 return true;
11916 if (unicodeBlockLookup['Hangul Jamo Extended-B'](char))
11917 return true;
11918 if (unicodeBlockLookup['Hangul Jamo'](char))
11919 return true;
11920 if (unicodeBlockLookup['Hangul Syllables'](char))
11921 return true;
11922 if (unicodeBlockLookup['Hiragana'](char))
11923 return true;
11924 if (unicodeBlockLookup['Ideographic Description Characters'](char))
11925 return true;
11926 if (unicodeBlockLookup['Kanbun'](char))
11927 return true;
11928 if (unicodeBlockLookup['Kangxi Radicals'](char))
11929 return true;
11930 if (unicodeBlockLookup['Katakana Phonetic Extensions'](char))
11931 return true;
11932 if (unicodeBlockLookup['Katakana'](char)) {
11933 if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) {
11934 return true;
11935 }
11936 }
11937 if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) {
11938 if (char !== 0xFF08 /* fullwidth left parenthesis */ &&
11939 char !== 0xFF09 /* fullwidth right parenthesis */ &&
11940 char !== 0xFF0D /* fullwidth hyphen-minus */ &&
11941 !((char >= 0xFF1A /* fullwidth colon */ && char <= 0xFF1E) /* fullwidth greater-than sign */) &&
11942 char !== 0xFF3B /* fullwidth left square bracket */ &&
11943 char !== 0xFF3D /* fullwidth right square bracket */ &&
11944 char !== 0xFF3F /* fullwidth low line */ &&
11945 !(char >= 0xFF5B /* fullwidth left curly bracket */ && char <= 0xFFDF) &&
11946 char !== 0xFFE3 /* fullwidth macron */ &&
11947 !(char >= 0xFFE8 /* halfwidth forms light vertical */ && char <= 0xFFEF)) {
11948 return true;
11949 }
11950 }
11951 if (unicodeBlockLookup['Small Form Variants'](char)) {
11952 if (!((char >= 0xFE58 /* small em dash */ && char <= 0xFE5E) /* small right tortoise shell bracket */) &&
11953 !((char >= 0xFE63 /* small hyphen-minus */ && char <= 0xFE66) /* small equals sign */)) {
11954 return true;
11955 }
11956 }
11957 if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics'](char))
11958 return true;
11959 if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics Extended'](char))
11960 return true;
11961 if (unicodeBlockLookup['Vertical Forms'](char))
11962 return true;
11963 if (unicodeBlockLookup['Yijing Hexagram Symbols'](char))
11964 return true;
11965 if (unicodeBlockLookup['Yi Syllables'](char))
11966 return true;
11967 if (unicodeBlockLookup['Yi Radicals'](char))
11968 return true;
11969 return false;
11970}
11971/**
11972 * Returns true if the given Unicode codepoint identifies a character with
11973 * neutral orientation.
11974 *
11975 * A character has neutral orientation if it may be drawn rotated or unrotated
11976 * when the line is oriented vertically, depending on the orientation of the
11977 * adjacent characters. For example, along a verticlly oriented line, the vulgar
11978 * fraction ½ is drawn upright among Chinese characters but rotated among Latin
11979 * letters. A neutrally oriented character does not influence whether an
11980 * adjacent character is drawn upright or rotated.
11981 * @private
11982 */
11983function charHasNeutralVerticalOrientation(char) {
11984 if (unicodeBlockLookup['Latin-1 Supplement'](char)) {
11985 if (char === 0x00A7 /* section sign */ ||
11986 char === 0x00A9 /* copyright sign */ ||
11987 char === 0x00AE /* registered sign */ ||
11988 char === 0x00B1 /* plus-minus sign */ ||
11989 char === 0x00BC /* vulgar fraction one quarter */ ||
11990 char === 0x00BD /* vulgar fraction one half */ ||
11991 char === 0x00BE /* vulgar fraction three quarters */ ||
11992 char === 0x00D7 /* multiplication sign */ ||
11993 char === 0x00F7 /* division sign */) {
11994 return true;
11995 }
11996 }
11997 if (unicodeBlockLookup['General Punctuation'](char)) {
11998 if (char === 0x2016 /* double vertical line */ ||
11999 char === 0x2020 /* dagger */ ||
12000 char === 0x2021 /* double dagger */ ||
12001 char === 0x2030 /* per mille sign */ ||
12002 char === 0x2031 /* per ten thousand sign */ ||
12003 char === 0x203B /* reference mark */ ||
12004 char === 0x203C /* double exclamation mark */ ||
12005 char === 0x2042 /* asterism */ ||
12006 char === 0x2047 /* double question mark */ ||
12007 char === 0x2048 /* question exclamation mark */ ||
12008 char === 0x2049 /* exclamation question mark */ ||
12009 char === 0x2051 /* two asterisks aligned vertically */) {
12010 return true;
12011 }
12012 }
12013 if (unicodeBlockLookup['Letterlike Symbols'](char))
12014 return true;
12015 if (unicodeBlockLookup['Number Forms'](char))
12016 return true;
12017 if (unicodeBlockLookup['Miscellaneous Technical'](char)) {
12018 if ((char >= 0x2300 /* diameter sign */ && char <= 0x2307 /* wavy line */) ||
12019 (char >= 0x230C /* bottom right crop */ && char <= 0x231F /* bottom right corner */) ||
12020 (char >= 0x2324 /* up arrowhead between two horizontal bars */ && char <= 0x2328 /* keyboard */) ||
12021 char === 0x232B /* erase to the left */ ||
12022 (char >= 0x237D /* shouldered open box */ && char <= 0x239A /* clear screen symbol */) ||
12023 (char >= 0x23BE /* dentistry symbol light vertical and top right */ && char <= 0x23CD /* square foot */) ||
12024 char === 0x23CF /* eject symbol */ ||
12025 (char >= 0x23D1 /* metrical breve */ && char <= 0x23DB /* fuse */) ||
12026 (char >= 0x23E2 /* white trapezium */ && char <= 0x23FF)) {
12027 return true;
12028 }
12029 }
12030 if (unicodeBlockLookup['Control Pictures'](char) && char !== 0x2423 /* open box */)
12031 return true;
12032 if (unicodeBlockLookup['Optical Character Recognition'](char))
12033 return true;
12034 if (unicodeBlockLookup['Enclosed Alphanumerics'](char))
12035 return true;
12036 if (unicodeBlockLookup['Geometric Shapes'](char))
12037 return true;
12038 if (unicodeBlockLookup['Miscellaneous Symbols'](char)) {
12039 if (!((char >= 0x261A /* black left pointing index */ && char <= 0x261F) /* white down pointing index */)) {
12040 return true;
12041 }
12042 }
12043 if (unicodeBlockLookup['Miscellaneous Symbols and Arrows'](char)) {
12044 if ((char >= 0x2B12 /* square with top half black */ && char <= 0x2B2F /* white vertical ellipse */) ||
12045 (char >= 0x2B50 /* white medium star */ && char <= 0x2B59 /* heavy circled saltire */) ||
12046 (char >= 0x2BB8 /* upwards white arrow from bar with horizontal bar */ && char <= 0x2BEB)) {
12047 return true;
12048 }
12049 }
12050 if (unicodeBlockLookup['CJK Symbols and Punctuation'](char))
12051 return true;
12052 if (unicodeBlockLookup['Katakana'](char))
12053 return true;
12054 if (unicodeBlockLookup['Private Use Area'](char))
12055 return true;
12056 if (unicodeBlockLookup['CJK Compatibility Forms'](char))
12057 return true;
12058 if (unicodeBlockLookup['Small Form Variants'](char))
12059 return true;
12060 if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char))
12061 return true;
12062 if (char === 0x221E /* infinity */ ||
12063 char === 0x2234 /* therefore */ ||
12064 char === 0x2235 /* because */ ||
12065 (char >= 0x2700 /* black safety scissors */ && char <= 0x2767 /* rotated floral heart bullet */) ||
12066 (char >= 0x2776 /* dingbat negative circled digit one */ && char <= 0x2793 /* dingbat negative circled sans-serif number ten */) ||
12067 char === 0xFFFC /* object replacement character */ ||
12068 char === 0xFFFD /* replacement character */) {
12069 return true;
12070 }
12071 return false;
12072}
12073/**
12074 * Returns true if the given Unicode codepoint identifies a character with
12075 * rotated orientation.
12076 *
12077 * A character has rotated orientation if it is drawn rotated when the line is
12078 * oriented vertically, even if both adjacent characters are upright. For
12079 * example, a Latin letter is drawn rotated along a vertical line. A rotated
12080 * character causes an adjacent “neutral” character to be drawn rotated as well.
12081 * @private
12082 */
12083function charHasRotatedVerticalOrientation(char) {
12084 return !(charHasUprightVerticalOrientation(char) ||
12085 charHasNeutralVerticalOrientation(char));
12086}
12087function charInComplexShapingScript(char) {
12088 return unicodeBlockLookup['Arabic'](char) ||
12089 unicodeBlockLookup['Arabic Supplement'](char) ||
12090 unicodeBlockLookup['Arabic Extended-A'](char) ||
12091 unicodeBlockLookup['Arabic Presentation Forms-A'](char) ||
12092 unicodeBlockLookup['Arabic Presentation Forms-B'](char);
12093}
12094function charInRTLScript(char) {
12095 // Main blocks for Hebrew, Arabic, Thaana and other RTL scripts
12096 return (char >= 0x0590 && char <= 0x08FF) ||
12097 unicodeBlockLookup['Arabic Presentation Forms-A'](char) ||
12098 unicodeBlockLookup['Arabic Presentation Forms-B'](char);
12099}
12100function charInSupportedScript(char, canRenderRTL) {
12101 // This is a rough heuristic: whether we "can render" a script
12102 // actually depends on the properties of the font being used
12103 // and whether differences from the ideal rendering are considered
12104 // semantically significant.
12105 // Even in Latin script, we "can't render" combinations such as the fi
12106 // ligature, but we don't consider that semantically significant.
12107 if (!canRenderRTL && charInRTLScript(char)) {
12108 return false;
12109 }
12110 if ((char >= 0x0900 && char <= 0x0DFF) ||
12111 // Main blocks for Indic scripts and Sinhala
12112 (char >= 0x0F00 && char <= 0x109F) ||
12113 // Main blocks for Tibetan and Myanmar
12114 unicodeBlockLookup['Khmer'](char)) {
12115 // These blocks cover common scripts that require
12116 // complex text shaping, based on unicode script metadata:
12117 // http://www.unicode.org/repos/cldr/trunk/common/properties/scriptMetadata.txt
12118 // where "Web Rank <= 32" "Shaping Required = YES"
12119 return false;
12120 }
12121 return true;
12122}
12123function stringContainsRTLText(chars) {
12124 for (const char of chars) {
12125 if (charInRTLScript(char.charCodeAt(0))) {
12126 return true;
12127 }
12128 }
12129 return false;
12130}
12131function isStringInSupportedScript(chars, canRenderRTL) {
12132 for (const char of chars) {
12133 if (!charInSupportedScript(char.charCodeAt(0), canRenderRTL)) {
12134 return false;
12135 }
12136 }
12137 return true;
12138}
12139
12140const status = {
12141 unavailable: 'unavailable',
12142 deferred: 'deferred',
12143 loading: 'loading',
12144 loaded: 'loaded',
12145 error: 'error'
12146};
12147let _completionCallback = null;
12148//Variables defining the current state of the plugin
12149let pluginStatus = status.unavailable;
12150let pluginURL = null;
12151const triggerPluginCompletionEvent = function (error) {
12152 // NetworkError's are not correctly reflected by the plugin status which prevents reloading plugin
12153 if (error && typeof error === 'string' && error.indexOf('NetworkError') > -1) {
12154 pluginStatus = status.error;
12155 }
12156 if (_completionCallback) {
12157 _completionCallback(error);
12158 }
12159};
12160function sendPluginStateToWorker() {
12161 evented.fire(new Event('pluginStateChange', { pluginStatus, pluginURL }));
12162}
12163const evented = new Evented();
12164const getRTLTextPluginStatus = function () {
12165 return pluginStatus;
12166};
12167const registerForPluginStateChange = function (callback) {
12168 // Do an initial sync of the state
12169 callback({ pluginStatus, pluginURL });
12170 // Listen for all future state changes
12171 evented.on('pluginStateChange', callback);
12172 return callback;
12173};
12174const clearRTLTextPlugin = function () {
12175 pluginStatus = status.unavailable;
12176 pluginURL = null;
12177};
12178const setRTLTextPlugin = function (url, callback, deferred = false) {
12179 if (pluginStatus === status.deferred || pluginStatus === status.loading || pluginStatus === status.loaded) {
12180 throw new Error('setRTLTextPlugin cannot be called multiple times.');
12181 }
12182 pluginURL = exported$1.resolveURL(url);
12183 pluginStatus = status.deferred;
12184 _completionCallback = callback;
12185 sendPluginStateToWorker();
12186 //Start downloading the plugin immediately if not intending to lazy-load
12187 if (!deferred) {
12188 downloadRTLTextPlugin();
12189 }
12190};
12191const downloadRTLTextPlugin = function () {
12192 if (pluginStatus !== status.deferred || !pluginURL) {
12193 throw new Error('rtl-text-plugin cannot be downloaded unless a pluginURL is specified');
12194 }
12195 pluginStatus = status.loading;
12196 sendPluginStateToWorker();
12197 if (pluginURL) {
12198 getArrayBuffer({ url: pluginURL }, (error) => {
12199 if (error) {
12200 triggerPluginCompletionEvent(error);
12201 }
12202 else {
12203 pluginStatus = status.loaded;
12204 sendPluginStateToWorker();
12205 }
12206 });
12207 }
12208};
12209const plugin = {
12210 applyArabicShaping: null,
12211 processBidirectionalText: null,
12212 processStyledBidirectionalText: null,
12213 isLoaded() {
12214 return pluginStatus === status.loaded || // Main Thread: loaded if the completion callback returned successfully
12215 plugin.applyArabicShaping != null; // Web-worker: loaded if the plugin functions have been compiled
12216 },
12217 isLoading() {
12218 return pluginStatus === status.loading;
12219 },
12220 setState(state) {
12221 assert$1(isWorker(), 'Cannot set the state of the rtl-text-plugin when not in the web-worker context');
12222 pluginStatus = state.pluginStatus;
12223 pluginURL = state.pluginURL;
12224 },
12225 isParsed() {
12226 assert$1(isWorker(), 'rtl-text-plugin is only parsed on the worker-threads');
12227 return plugin.applyArabicShaping != null &&
12228 plugin.processBidirectionalText != null &&
12229 plugin.processStyledBidirectionalText != null;
12230 },
12231 getPluginURL() {
12232 assert$1(isWorker(), 'rtl-text-plugin url can only be queried from the worker threads');
12233 return pluginURL;
12234 }
12235};
12236const lazyLoadRTLTextPlugin = function () {
12237 if (!plugin.isLoading() &&
12238 !plugin.isLoaded() &&
12239 getRTLTextPluginStatus() === 'deferred') {
12240 downloadRTLTextPlugin();
12241 }
12242};
12243
12244class EvaluationParameters {
12245 // "options" may also be another EvaluationParameters to copy, see CrossFadedProperty.possiblyEvaluate
12246 constructor(zoom, options) {
12247 this.zoom = zoom;
12248 if (options) {
12249 this.now = options.now;
12250 this.fadeDuration = options.fadeDuration;
12251 this.zoomHistory = options.zoomHistory;
12252 this.transition = options.transition;
12253 }
12254 else {
12255 this.now = 0;
12256 this.fadeDuration = 0;
12257 this.zoomHistory = new ZoomHistory();
12258 this.transition = {};
12259 }
12260 }
12261 isSupportedScript(str) {
12262 return isStringInSupportedScript(str, plugin.isLoaded());
12263 }
12264 crossFadingFactor() {
12265 if (this.fadeDuration === 0) {
12266 return 1;
12267 }
12268 else {
12269 return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1);
12270 }
12271 }
12272 getCrossfadeParameters() {
12273 const z = this.zoom;
12274 const fraction = z - Math.floor(z);
12275 const t = this.crossFadingFactor();
12276 return z > this.zoomHistory.lastIntegerZoom ?
12277 { fromScale: 2, toScale: 1, t: fraction + (1 - fraction) * t } :
12278 { fromScale: 0.5, toScale: 1, t: 1 - (1 - t) * fraction };
12279 }
12280}
12281
12282/**
12283 * `PropertyValue` represents the value part of a property key-value unit. It's used to represent both
12284 * paint and layout property values, and regardless of whether or not their property supports data-driven
12285 * expressions.
12286 *
12287 * `PropertyValue` stores the raw input value as seen in a style or a runtime styling API call, i.e. one of the
12288 * following:
12289 *
12290 * * A constant value of the type appropriate for the property
12291 * * A function which produces a value of that type (but functions are quasi-deprecated in favor of expressions)
12292 * * An expression which produces a value of that type
12293 * * "undefined"/"not present", in which case the property is assumed to take on its default value.
12294 *
12295 * In addition to storing the original input value, `PropertyValue` also stores a normalized representation,
12296 * effectively treating functions as if they are expressions, and constant or default values as if they are
12297 * (constant) expressions.
12298 *
12299 * @private
12300 */
12301class PropertyValue {
12302 constructor(property, value) {
12303 this.property = property;
12304 this.value = value;
12305 this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification);
12306 }
12307 isDataDriven() {
12308 return this.expression.kind === 'source' || this.expression.kind === 'composite';
12309 }
12310 possiblyEvaluate(parameters, canonical, availableImages) {
12311 return this.property.possiblyEvaluate(this, parameters, canonical, availableImages);
12312 }
12313}
12314/**
12315 * Paint properties are _transitionable_: they can change in a fluid manner, interpolating or cross-fading between
12316 * old and new value. The duration of the transition, and the delay before it begins, is configurable.
12317 *
12318 * `TransitionablePropertyValue` is a compositional class that stores both the property value and that transition
12319 * configuration.
12320 *
12321 * A `TransitionablePropertyValue` can calculate the next step in the evaluation chain for paint property values:
12322 * `TransitioningPropertyValue`.
12323 *
12324 * @private
12325 */
12326class TransitionablePropertyValue {
12327 constructor(property) {
12328 this.property = property;
12329 this.value = new PropertyValue(property, undefined);
12330 }
12331 transitioned(parameters, prior) {
12332 return new TransitioningPropertyValue(this.property, this.value, prior, // eslint-disable-line no-use-before-define
12333 extend$1({}, parameters.transition, this.transition), parameters.now);
12334 }
12335 untransitioned() {
12336 return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); // eslint-disable-line no-use-before-define
12337 }
12338}
12339/**
12340 * `Transitionable` stores a map of all (property name, `TransitionablePropertyValue`) pairs for paint properties of a
12341 * given layer type. It can calculate the `TransitioningPropertyValue`s for all of them at once, producing a
12342 * `Transitioning` instance for the same set of properties.
12343 *
12344 * @private
12345 */
12346class Transitionable {
12347 constructor(properties) {
12348 this._properties = properties;
12349 this._values = Object.create(properties.defaultTransitionablePropertyValues);
12350 }
12351 getValue(name) {
12352 return clone$9(this._values[name].value.value);
12353 }
12354 setValue(name, value) {
12355 if (!Object.prototype.hasOwnProperty.call(this._values, name)) {
12356 this._values[name] = new TransitionablePropertyValue(this._values[name].property);
12357 }
12358 // Note that we do not _remove_ an own property in the case where a value is being reset
12359 // to the default: the transition might still be non-default.
12360 this._values[name].value = new PropertyValue(this._values[name].property, value === null ? undefined : clone$9(value));
12361 }
12362 getTransition(name) {
12363 return clone$9(this._values[name].transition);
12364 }
12365 setTransition(name, value) {
12366 if (!Object.prototype.hasOwnProperty.call(this._values, name)) {
12367 this._values[name] = new TransitionablePropertyValue(this._values[name].property);
12368 }
12369 this._values[name].transition = clone$9(value) || undefined;
12370 }
12371 serialize() {
12372 const result = {};
12373 for (const property of Object.keys(this._values)) {
12374 const value = this.getValue(property);
12375 if (value !== undefined) {
12376 result[property] = value;
12377 }
12378 const transition = this.getTransition(property);
12379 if (transition !== undefined) {
12380 result[`${property}-transition`] = transition;
12381 }
12382 }
12383 return result;
12384 }
12385 transitioned(parameters, prior) {
12386 const result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define
12387 for (const property of Object.keys(this._values)) {
12388 result._values[property] = this._values[property].transitioned(parameters, prior._values[property]);
12389 }
12390 return result;
12391 }
12392 untransitioned() {
12393 const result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define
12394 for (const property of Object.keys(this._values)) {
12395 result._values[property] = this._values[property].untransitioned();
12396 }
12397 return result;
12398 }
12399}
12400// ------- Transitioning -------
12401/**
12402 * `TransitioningPropertyValue` implements the first of two intermediate steps in the evaluation chain of a paint
12403 * property value. In this step, transitions between old and new values are handled: as long as the transition is in
12404 * progress, `TransitioningPropertyValue` maintains a reference to the prior value, and interpolates between it and
12405 * the new value based on the current time and the configured transition duration and delay. The product is the next
12406 * step in the evaluation chain: the "possibly evaluated" result type `R`. See below for more on this concept.
12407 *
12408 * @private
12409 */
12410class TransitioningPropertyValue {
12411 constructor(property, value, prior, transition, now) {
12412 this.property = property;
12413 this.value = value;
12414 this.begin = now + transition.delay || 0;
12415 this.end = this.begin + transition.duration || 0;
12416 if (property.specification.transition && (transition.delay || transition.duration)) {
12417 this.prior = prior;
12418 }
12419 }
12420 possiblyEvaluate(parameters, canonical, availableImages) {
12421 const now = parameters.now || 0;
12422 const finalValue = this.value.possiblyEvaluate(parameters, canonical, availableImages);
12423 const prior = this.prior;
12424 if (!prior) {
12425 // No prior value.
12426 return finalValue;
12427 }
12428 else if (now > this.end) {
12429 // Transition from prior value is now complete.
12430 this.prior = null;
12431 return finalValue;
12432 }
12433 else if (this.value.isDataDriven()) {
12434 // Transitions to data-driven properties are not supported.
12435 // We snap immediately to the data-driven value so that, when we perform layout,
12436 // we see the data-driven function and can use it to populate vertex buffers.
12437 this.prior = null;
12438 return finalValue;
12439 }
12440 else if (now < this.begin) {
12441 // Transition hasn't started yet.
12442 return prior.possiblyEvaluate(parameters, canonical, availableImages);
12443 }
12444 else {
12445 // Interpolate between recursively-calculated prior value and final.
12446 const t = (now - this.begin) / (this.end - this.begin);
12447 return this.property.interpolate(prior.possiblyEvaluate(parameters, canonical, availableImages), finalValue, easeCubicInOut(t));
12448 }
12449 }
12450}
12451/**
12452 * `Transitioning` stores a map of all (property name, `TransitioningPropertyValue`) pairs for paint properties of a
12453 * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a
12454 * `PossiblyEvaluated` instance for the same set of properties.
12455 *
12456 * @private
12457 */
12458class Transitioning {
12459 constructor(properties) {
12460 this._properties = properties;
12461 this._values = Object.create(properties.defaultTransitioningPropertyValues);
12462 }
12463 possiblyEvaluate(parameters, canonical, availableImages) {
12464 const result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define
12465 for (const property of Object.keys(this._values)) {
12466 result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages);
12467 }
12468 return result;
12469 }
12470 hasTransition() {
12471 for (const property of Object.keys(this._values)) {
12472 if (this._values[property].prior) {
12473 return true;
12474 }
12475 }
12476 return false;
12477 }
12478}
12479// ------- Layout -------
12480/**
12481 * Because layout properties are not transitionable, they have a simpler representation and evaluation chain than
12482 * paint properties: `PropertyValue`s are possibly evaluated, producing possibly evaluated values, which are then
12483 * fully evaluated.
12484 *
12485 * `Layout` stores a map of all (property name, `PropertyValue`) pairs for layout properties of a
12486 * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a
12487 * `PossiblyEvaluated` instance for the same set of properties.
12488 *
12489 * @private
12490 */
12491class Layout {
12492 constructor(properties) {
12493 this._properties = properties;
12494 this._values = Object.create(properties.defaultPropertyValues);
12495 }
12496 getValue(name) {
12497 return clone$9(this._values[name].value);
12498 }
12499 setValue(name, value) {
12500 this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : clone$9(value));
12501 }
12502 serialize() {
12503 const result = {};
12504 for (const property of Object.keys(this._values)) {
12505 const value = this.getValue(property);
12506 if (value !== undefined) {
12507 result[property] = value;
12508 }
12509 }
12510 return result;
12511 }
12512 possiblyEvaluate(parameters, canonical, availableImages) {
12513 const result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define
12514 for (const property of Object.keys(this._values)) {
12515 result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages);
12516 }
12517 return result;
12518 }
12519}
12520/**
12521 * `PossiblyEvaluatedPropertyValue` is used for data-driven paint and layout property values. It holds a
12522 * `PossiblyEvaluatedValue` and the `GlobalProperties` that were used to generate it. You're not allowed to supply
12523 * a different set of `GlobalProperties` when performing the final evaluation because they would be ignored in the
12524 * case where the input value was a constant or camera function.
12525 *
12526 * @private
12527 */
12528class PossiblyEvaluatedPropertyValue {
12529 constructor(property, value, parameters) {
12530 this.property = property;
12531 this.value = value;
12532 this.parameters = parameters;
12533 }
12534 isConstant() {
12535 return this.value.kind === 'constant';
12536 }
12537 constantOr(value) {
12538 if (this.value.kind === 'constant') {
12539 return this.value.value;
12540 }
12541 else {
12542 return value;
12543 }
12544 }
12545 evaluate(feature, featureState, canonical, availableImages) {
12546 return this.property.evaluate(this.value, this.parameters, feature, featureState, canonical, availableImages);
12547 }
12548}
12549/**
12550 * `PossiblyEvaluated` stores a map of all (property name, `R`) pairs for paint or layout properties of a
12551 * given layer type.
12552 * @private
12553 */
12554class PossiblyEvaluated {
12555 constructor(properties) {
12556 this._properties = properties;
12557 this._values = Object.create(properties.defaultPossiblyEvaluatedValues);
12558 }
12559 get(name) {
12560 return this._values[name];
12561 }
12562}
12563/**
12564 * An implementation of `Property` for properties that do not permit data-driven (source or composite) expressions.
12565 * This restriction allows us to declare statically that the result of possibly evaluating this kind of property
12566 * is in fact always the scalar type `T`, and can be used without further evaluating the value on a per-feature basis.
12567 *
12568 * @private
12569 */
12570class DataConstantProperty {
12571 constructor(specification) {
12572 this.specification = specification;
12573 }
12574 possiblyEvaluate(value, parameters) {
12575 assert$1(!value.isDataDriven());
12576 return value.expression.evaluate(parameters);
12577 }
12578 interpolate(a, b, t) {
12579 const interp = interpolate[this.specification.type];
12580 if (interp) {
12581 return interp(a, b, t);
12582 }
12583 else {
12584 return a;
12585 }
12586 }
12587}
12588/**
12589 * An implementation of `Property` for properties that permit data-driven (source or composite) expressions.
12590 * The result of possibly evaluating this kind of property is `PossiblyEvaluatedPropertyValue<T>`; obtaining
12591 * a scalar value `T` requires further evaluation on a per-feature basis.
12592 *
12593 * @private
12594 */
12595class DataDrivenProperty {
12596 constructor(specification, overrides) {
12597 this.specification = specification;
12598 this.overrides = overrides;
12599 }
12600 possiblyEvaluate(value, parameters, canonical, availableImages) {
12601 if (value.expression.kind === 'constant' || value.expression.kind === 'camera') {
12602 return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: value.expression.evaluate(parameters, null, {}, canonical, availableImages) }, parameters);
12603 }
12604 else {
12605 return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters);
12606 }
12607 }
12608 interpolate(a, b, t) {
12609 // If either possibly-evaluated value is non-constant, give up: we aren't able to interpolate data-driven values.
12610 if (a.value.kind !== 'constant' || b.value.kind !== 'constant') {
12611 return a;
12612 }
12613 // Special case hack solely for fill-outline-color. The undefined value is subsequently handled in
12614 // FillStyleLayer#recalculate, which sets fill-outline-color to the fill-color value if the former
12615 // is a PossiblyEvaluatedPropertyValue containing a constant undefined value. In addition to the
12616 // return value here, the other source of a PossiblyEvaluatedPropertyValue containing a constant
12617 // undefined value is the "default value" for fill-outline-color held in
12618 // `Properties#defaultPossiblyEvaluatedValues`, which serves as the prototype of
12619 // `PossiblyEvaluated#_values`.
12620 if (a.value.value === undefined || b.value.value === undefined) {
12621 return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: undefined }, a.parameters);
12622 }
12623 const interp = interpolate[this.specification.type];
12624 if (interp) {
12625 return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: interp(a.value.value, b.value.value, t) }, a.parameters);
12626 }
12627 else {
12628 return a;
12629 }
12630 }
12631 evaluate(value, parameters, feature, featureState, canonical, availableImages) {
12632 if (value.kind === 'constant') {
12633 return value.value;
12634 }
12635 else {
12636 return value.evaluate(parameters, feature, featureState, canonical, availableImages);
12637 }
12638 }
12639}
12640/**
12641 * An implementation of `Property` for data driven `line-pattern` which are transitioned by cross-fading
12642 * rather than interpolation.
12643 *
12644 * @private
12645 */
12646class CrossFadedDataDrivenProperty extends DataDrivenProperty {
12647 possiblyEvaluate(value, parameters, canonical, availableImages) {
12648 if (value.value === undefined) {
12649 return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: undefined }, parameters);
12650 }
12651 else if (value.expression.kind === 'constant') {
12652 const evaluatedValue = value.expression.evaluate(parameters, null, {}, canonical, availableImages);
12653 const isImageExpression = value.property.specification.type === 'resolvedImage';
12654 const constantValue = isImageExpression && typeof evaluatedValue !== 'string' ? evaluatedValue.name : evaluatedValue;
12655 const constant = this._calculate(constantValue, constantValue, constantValue, parameters);
12656 return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: constant }, parameters);
12657 }
12658 else if (value.expression.kind === 'camera') {
12659 const cameraVal = this._calculate(value.expression.evaluate({ zoom: parameters.zoom - 1.0 }), value.expression.evaluate({ zoom: parameters.zoom }), value.expression.evaluate({ zoom: parameters.zoom + 1.0 }), parameters);
12660 return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: cameraVal }, parameters);
12661 }
12662 else {
12663 // source or composite expression
12664 return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters);
12665 }
12666 }
12667 evaluate(value, globals, feature, featureState, canonical, availableImages) {
12668 if (value.kind === 'source') {
12669 const constant = value.evaluate(globals, feature, featureState, canonical, availableImages);
12670 return this._calculate(constant, constant, constant, globals);
12671 }
12672 else if (value.kind === 'composite') {
12673 return this._calculate(value.evaluate({ zoom: Math.floor(globals.zoom) - 1.0 }, feature, featureState), value.evaluate({ zoom: Math.floor(globals.zoom) }, feature, featureState), value.evaluate({ zoom: Math.floor(globals.zoom) + 1.0 }, feature, featureState), globals);
12674 }
12675 else {
12676 return value.value;
12677 }
12678 }
12679 _calculate(min, mid, max, parameters) {
12680 const z = parameters.zoom;
12681 return z > parameters.zoomHistory.lastIntegerZoom ? { from: min, to: mid } : { from: max, to: mid };
12682 }
12683 interpolate(a) {
12684 return a;
12685 }
12686}
12687/**
12688 * An implementation of `Property` for `*-pattern` and `line-dasharray`, which are transitioned by cross-fading
12689 * rather than interpolation.
12690 *
12691 * @private
12692 */
12693class CrossFadedProperty {
12694 constructor(specification) {
12695 this.specification = specification;
12696 }
12697 possiblyEvaluate(value, parameters, canonical, availableImages) {
12698 if (value.value === undefined) {
12699 return undefined;
12700 }
12701 else if (value.expression.kind === 'constant') {
12702 const constant = value.expression.evaluate(parameters, null, {}, canonical, availableImages);
12703 return this._calculate(constant, constant, constant, parameters);
12704 }
12705 else {
12706 assert$1(!value.isDataDriven());
12707 return this._calculate(value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom - 1.0), parameters)), value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom), parameters)), value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom + 1.0), parameters)), parameters);
12708 }
12709 }
12710 _calculate(min, mid, max, parameters) {
12711 const z = parameters.zoom;
12712 return z > parameters.zoomHistory.lastIntegerZoom ? { from: min, to: mid } : { from: max, to: mid };
12713 }
12714 interpolate(a) {
12715 return a;
12716 }
12717}
12718/**
12719 * An implementation of `Property` for `heatmap-color` and `line-gradient`. Interpolation is a no-op, and
12720 * evaluation returns a boolean value in order to indicate its presence, but the real
12721 * evaluation happens in StyleLayer classes.
12722 *
12723 * @private
12724 */
12725class ColorRampProperty {
12726 constructor(specification) {
12727 this.specification = specification;
12728 }
12729 possiblyEvaluate(value, parameters, canonical, availableImages) {
12730 return !!value.expression.evaluate(parameters, null, {}, canonical, availableImages);
12731 }
12732 interpolate() { return false; }
12733}
12734/**
12735 * `Properties` holds objects containing default values for the layout or paint property set of a given
12736 * layer type. These objects are immutable, and they are used as the prototypes for the `_values` members of
12737 * `Transitionable`, `Transitioning`, `Layout`, and `PossiblyEvaluated`. This allows these classes to avoid
12738 * doing work in the common case where a property has no explicit value set and should be considered to take
12739 * on the default value: using `for (const property of Object.keys(this._values))`, they can iterate over
12740 * only the _own_ properties of `_values`, skipping repeated calculation of transitions and possible/final
12741 * evaluations for defaults, the result of which will always be the same.
12742 *
12743 * @private
12744 */
12745class Properties {
12746 constructor(properties) {
12747 this.properties = properties;
12748 this.defaultPropertyValues = {};
12749 this.defaultTransitionablePropertyValues = {};
12750 this.defaultTransitioningPropertyValues = {};
12751 this.defaultPossiblyEvaluatedValues = {};
12752 this.overridableProperties = [];
12753 for (const property in properties) {
12754 const prop = properties[property];
12755 if (prop.specification.overridable) {
12756 this.overridableProperties.push(property);
12757 }
12758 const defaultPropertyValue = this.defaultPropertyValues[property] =
12759 new PropertyValue(prop, undefined);
12760 const defaultTransitionablePropertyValue = this.defaultTransitionablePropertyValues[property] =
12761 new TransitionablePropertyValue(prop);
12762 this.defaultTransitioningPropertyValues[property] =
12763 defaultTransitionablePropertyValue.untransitioned();
12764 this.defaultPossiblyEvaluatedValues[property] =
12765 defaultPropertyValue.possiblyEvaluate({});
12766 }
12767 }
12768}
12769register('DataDrivenProperty', DataDrivenProperty);
12770register('DataConstantProperty', DataConstantProperty);
12771register('CrossFadedDataDrivenProperty', CrossFadedDataDrivenProperty);
12772register('CrossFadedProperty', CrossFadedProperty);
12773register('ColorRampProperty', ColorRampProperty);
12774
12775const TRANSITION_SUFFIX = '-transition';
12776class StyleLayer extends Evented {
12777 constructor(layer, properties) {
12778 super();
12779 this.id = layer.id;
12780 this.type = layer.type;
12781 this._featureFilter = { filter: () => true, needGeometry: false };
12782 if (layer.type === 'custom')
12783 return;
12784 layer = layer;
12785 this.metadata = layer.metadata;
12786 this.minzoom = layer.minzoom;
12787 this.maxzoom = layer.maxzoom;
12788 if (layer.type !== 'background') {
12789 this.source = layer.source;
12790 this.sourceLayer = layer['source-layer'];
12791 this.filter = layer.filter;
12792 }
12793 if (properties.layout) {
12794 this._unevaluatedLayout = new Layout(properties.layout);
12795 }
12796 if (properties.paint) {
12797 this._transitionablePaint = new Transitionable(properties.paint);
12798 for (const property in layer.paint) {
12799 this.setPaintProperty(property, layer.paint[property], { validate: false });
12800 }
12801 for (const property in layer.layout) {
12802 this.setLayoutProperty(property, layer.layout[property], { validate: false });
12803 }
12804 this._transitioningPaint = this._transitionablePaint.untransitioned();
12805 //$FlowFixMe
12806 this.paint = new PossiblyEvaluated(properties.paint);
12807 }
12808 }
12809 getCrossfadeParameters() {
12810 return this._crossfadeParameters;
12811 }
12812 getLayoutProperty(name) {
12813 if (name === 'visibility') {
12814 return this.visibility;
12815 }
12816 return this._unevaluatedLayout.getValue(name);
12817 }
12818 setLayoutProperty(name, value, options = {}) {
12819 if (value !== null && value !== undefined) {
12820 const key = `layers.${this.id}.layout.${name}`;
12821 if (this._validate(validateLayoutProperty, key, name, value, options)) {
12822 return;
12823 }
12824 }
12825 if (name === 'visibility') {
12826 this.visibility = value;
12827 return;
12828 }
12829 this._unevaluatedLayout.setValue(name, value);
12830 }
12831 getPaintProperty(name) {
12832 if (name.endsWith(TRANSITION_SUFFIX)) {
12833 return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length));
12834 }
12835 else {
12836 return this._transitionablePaint.getValue(name);
12837 }
12838 }
12839 setPaintProperty(name, value, options = {}) {
12840 if (value !== null && value !== undefined) {
12841 const key = `layers.${this.id}.paint.${name}`;
12842 if (this._validate(validatePaintProperty, key, name, value, options)) {
12843 return false;
12844 }
12845 }
12846 if (name.endsWith(TRANSITION_SUFFIX)) {
12847 this._transitionablePaint.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value || undefined);
12848 return false;
12849 }
12850 else {
12851 const transitionable = this._transitionablePaint._values[name];
12852 const isCrossFadedProperty = transitionable.property.specification['property-type'] === 'cross-faded-data-driven';
12853 const wasDataDriven = transitionable.value.isDataDriven();
12854 const oldValue = transitionable.value;
12855 this._transitionablePaint.setValue(name, value);
12856 this._handleSpecialPaintPropertyUpdate(name);
12857 const newValue = this._transitionablePaint._values[name].value;
12858 const isDataDriven = newValue.isDataDriven();
12859 // if a cross-faded value is changed, we need to make sure the new icons get added to each tile's iconAtlas
12860 // so a call to _updateLayer is necessary, and we return true from this function so it gets called in
12861 // Style#setPaintProperty
12862 return isDataDriven || wasDataDriven || isCrossFadedProperty || this._handleOverridablePaintPropertyUpdate(name, oldValue, newValue);
12863 }
12864 }
12865 _handleSpecialPaintPropertyUpdate(_) {
12866 // No-op; can be overridden by derived classes.
12867 }
12868 // eslint-disable-next-line @typescript-eslint/no-unused-vars
12869 _handleOverridablePaintPropertyUpdate(name, oldValue, newValue) {
12870 // No-op; can be overridden by derived classes.
12871 return false;
12872 }
12873 isHidden(zoom) {
12874 if (this.minzoom && zoom < this.minzoom)
12875 return true;
12876 if (this.maxzoom && zoom >= this.maxzoom)
12877 return true;
12878 return this.visibility === 'none';
12879 }
12880 updateTransitions(parameters) {
12881 this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint);
12882 }
12883 hasTransition() {
12884 return this._transitioningPaint.hasTransition();
12885 }
12886 recalculate(parameters, availableImages) {
12887 if (parameters.getCrossfadeParameters) {
12888 this._crossfadeParameters = parameters.getCrossfadeParameters();
12889 }
12890 if (this._unevaluatedLayout) {
12891 this.layout = this._unevaluatedLayout.possiblyEvaluate(parameters, undefined, availableImages);
12892 }
12893 this.paint = this._transitioningPaint.possiblyEvaluate(parameters, undefined, availableImages);
12894 }
12895 serialize() {
12896 const output = {
12897 'id': this.id,
12898 'type': this.type,
12899 'source': this.source,
12900 'source-layer': this.sourceLayer,
12901 'metadata': this.metadata,
12902 'minzoom': this.minzoom,
12903 'maxzoom': this.maxzoom,
12904 'filter': this.filter,
12905 'layout': this._unevaluatedLayout && this._unevaluatedLayout.serialize(),
12906 'paint': this._transitionablePaint && this._transitionablePaint.serialize()
12907 };
12908 if (this.visibility) {
12909 output.layout = output.layout || {};
12910 output.layout.visibility = this.visibility;
12911 }
12912 return filterObject(output, (value, key) => {
12913 return value !== undefined &&
12914 !(key === 'layout' && !Object.keys(value).length) &&
12915 !(key === 'paint' && !Object.keys(value).length);
12916 });
12917 }
12918 _validate(validate, key, name, value, options = {}) {
12919 if (options && options.validate === false) {
12920 return false;
12921 }
12922 return emitValidationErrors(this, validate.call(validateStyle, {
12923 key,
12924 layerType: this.type,
12925 objectKey: name,
12926 value,
12927 styleSpec: spec,
12928 // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407
12929 style: { glyphs: true, sprite: true }
12930 }));
12931 }
12932 is3D() {
12933 return false;
12934 }
12935 isTileClipped() {
12936 return false;
12937 }
12938 hasOffscreenPass() {
12939 return false;
12940 }
12941 resize() {
12942 // noop
12943 }
12944 isStateDependent() {
12945 for (const property in this.paint._values) {
12946 const value = this.paint.get(property);
12947 if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) {
12948 continue;
12949 }
12950 if ((value.value.kind === 'source' || value.value.kind === 'composite') &&
12951 value.value.isStateDependent) {
12952 return true;
12953 }
12954 }
12955 return false;
12956 }
12957}
12958
12959// Note: all "sizes" are measured in bytes
12960const viewTypes = {
12961 'Int8': Int8Array,
12962 'Uint8': Uint8Array,
12963 'Int16': Int16Array,
12964 'Uint16': Uint16Array,
12965 'Int32': Int32Array,
12966 'Uint32': Uint32Array,
12967 'Float32': Float32Array
12968};
12969/**
12970 * @private
12971 */
12972class Struct {
12973 /**
12974 * @param {StructArray} structArray The StructArray the struct is stored in
12975 * @param {number} index The index of the struct in the StructArray.
12976 * @private
12977 */
12978 constructor(structArray, index) {
12979 this._structArray = structArray;
12980 this._pos1 = index * this.size;
12981 this._pos2 = this._pos1 / 2;
12982 this._pos4 = this._pos1 / 4;
12983 this._pos8 = this._pos1 / 8;
12984 }
12985}
12986const DEFAULT_CAPACITY = 128;
12987const RESIZE_MULTIPLIER = 5;
12988/**
12989 * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray`
12990 * making it behave like an array of typed structs.
12991 *
12992 * Conceptually, a StructArray is comprised of elements, i.e., instances of its
12993 * associated struct type. Each particular struct type, together with an
12994 * alignment size, determines the memory layout of a StructArray whose elements
12995 * are of that type. Thus, for each such layout that we need, we have
12996 * a corrseponding StructArrayLayout class, inheriting from StructArray and
12997 * implementing `emplaceBack()` and `_refreshViews()`.
12998 *
12999 * In some cases, where we need to access particular elements of a StructArray,
13000 * we implement a more specific subclass that inherits from one of the
13001 * StructArrayLayouts and adds a `get(i): T` accessor that returns a structured
13002 * object whose properties are proxies into the underlying memory space for the
13003 * i-th element. This affords the convience of working with (seemingly) plain
13004 * Javascript objects without the overhead of serializing/deserializing them
13005 * into ArrayBuffers for efficient web worker transfer.
13006 *
13007 * @private
13008 */
13009class StructArray {
13010 constructor() {
13011 this.isTransferred = false;
13012 this.capacity = -1;
13013 this.resize(0);
13014 }
13015 /**
13016 * Serialize a StructArray instance. Serializes both the raw data and the
13017 * metadata needed to reconstruct the StructArray base class during
13018 * deserialization.
13019 * @private
13020 */
13021 static serialize(array, transferables) {
13022 assert$1(!array.isTransferred);
13023 array._trim();
13024 if (transferables) {
13025 array.isTransferred = true;
13026 transferables.push(array.arrayBuffer);
13027 }
13028 return {
13029 length: array.length,
13030 arrayBuffer: array.arrayBuffer,
13031 };
13032 }
13033 static deserialize(input) {
13034 const structArray = Object.create(this.prototype);
13035 structArray.arrayBuffer = input.arrayBuffer;
13036 structArray.length = input.length;
13037 structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement;
13038 structArray._refreshViews();
13039 return structArray;
13040 }
13041 /**
13042 * Resize the array to discard unused capacity.
13043 */
13044 _trim() {
13045 if (this.length !== this.capacity) {
13046 this.capacity = this.length;
13047 this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);
13048 this._refreshViews();
13049 }
13050 }
13051 /**
13052 * Resets the the length of the array to 0 without de-allocating capcacity.
13053 */
13054 clear() {
13055 this.length = 0;
13056 }
13057 /**
13058 * Resize the array.
13059 * If `n` is greater than the current length then additional elements with undefined values are added.
13060 * If `n` is less than the current length then the array will be reduced to the first `n` elements.
13061 * @param {number} n The new size of the array.
13062 */
13063 resize(n) {
13064 assert$1(!this.isTransferred);
13065 this.reserve(n);
13066 this.length = n;
13067 }
13068 /**
13069 * Indicate a planned increase in size, so that any necessary allocation may
13070 * be done once, ahead of time.
13071 * @param {number} n The expected size of the array.
13072 */
13073 reserve(n) {
13074 if (n > this.capacity) {
13075 this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY);
13076 this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);
13077 const oldUint8Array = this.uint8;
13078 this._refreshViews();
13079 if (oldUint8Array)
13080 this.uint8.set(oldUint8Array);
13081 }
13082 }
13083 /**
13084 * Create TypedArray views for the current ArrayBuffer.
13085 */
13086 _refreshViews() {
13087 throw new Error('_refreshViews() must be implemented by each concrete StructArray layout');
13088 }
13089}
13090/**
13091 * Given a list of member fields, create a full StructArrayLayout, in
13092 * particular calculating the correct byte offset for each field. This data
13093 * is used at build time to generate StructArrayLayout_*#emplaceBack() and
13094 * other accessors, and at runtime for binding vertex buffer attributes.
13095 *
13096 * @private
13097 */
13098function createLayout(members, alignment = 1) {
13099 let offset = 0;
13100 let maxSize = 0;
13101 const layoutMembers = members.map((member) => {
13102 assert$1(member.name.length);
13103 const typeSize = sizeOf(member.type);
13104 const memberOffset = offset = align$1(offset, Math.max(alignment, typeSize));
13105 const components = member.components || 1;
13106 maxSize = Math.max(maxSize, typeSize);
13107 offset += typeSize * components;
13108 return {
13109 name: member.name,
13110 type: member.type,
13111 components,
13112 offset: memberOffset,
13113 };
13114 });
13115 const size = align$1(offset, Math.max(maxSize, alignment));
13116 return {
13117 members: layoutMembers,
13118 size,
13119 alignment
13120 };
13121}
13122function sizeOf(type) {
13123 return viewTypes[type].BYTES_PER_ELEMENT;
13124}
13125function align$1(offset, size) {
13126 return Math.ceil(offset / size) * size;
13127}
13128
13129// This file is generated. Edit build/generate-struct-arrays.ts, then run `npm run codegen`.
13130/**
13131 * Implementation of the StructArray layout:
13132 * [0]: Int16[2]
13133 *
13134 * @private
13135 */
13136class StructArrayLayout2i4 extends StructArray {
13137 _refreshViews() {
13138 this.uint8 = new Uint8Array(this.arrayBuffer);
13139 this.int16 = new Int16Array(this.arrayBuffer);
13140 }
13141 emplaceBack(v0, v1) {
13142 const i = this.length;
13143 this.resize(i + 1);
13144 return this.emplace(i, v0, v1);
13145 }
13146 emplace(i, v0, v1) {
13147 const o2 = i * 2;
13148 this.int16[o2 + 0] = v0;
13149 this.int16[o2 + 1] = v1;
13150 return i;
13151 }
13152}
13153StructArrayLayout2i4.prototype.bytesPerElement = 4;
13154register('StructArrayLayout2i4', StructArrayLayout2i4);
13155/**
13156 * Implementation of the StructArray layout:
13157 * [0]: Int16[4]
13158 *
13159 * @private
13160 */
13161class StructArrayLayout4i8 extends StructArray {
13162 _refreshViews() {
13163 this.uint8 = new Uint8Array(this.arrayBuffer);
13164 this.int16 = new Int16Array(this.arrayBuffer);
13165 }
13166 emplaceBack(v0, v1, v2, v3) {
13167 const i = this.length;
13168 this.resize(i + 1);
13169 return this.emplace(i, v0, v1, v2, v3);
13170 }
13171 emplace(i, v0, v1, v2, v3) {
13172 const o2 = i * 4;
13173 this.int16[o2 + 0] = v0;
13174 this.int16[o2 + 1] = v1;
13175 this.int16[o2 + 2] = v2;
13176 this.int16[o2 + 3] = v3;
13177 return i;
13178 }
13179}
13180StructArrayLayout4i8.prototype.bytesPerElement = 8;
13181register('StructArrayLayout4i8', StructArrayLayout4i8);
13182/**
13183 * Implementation of the StructArray layout:
13184 * [0]: Int16[2]
13185 * [4]: Int16[4]
13186 *
13187 * @private
13188 */
13189class StructArrayLayout2i4i12 extends StructArray {
13190 _refreshViews() {
13191 this.uint8 = new Uint8Array(this.arrayBuffer);
13192 this.int16 = new Int16Array(this.arrayBuffer);
13193 }
13194 emplaceBack(v0, v1, v2, v3, v4, v5) {
13195 const i = this.length;
13196 this.resize(i + 1);
13197 return this.emplace(i, v0, v1, v2, v3, v4, v5);
13198 }
13199 emplace(i, v0, v1, v2, v3, v4, v5) {
13200 const o2 = i * 6;
13201 this.int16[o2 + 0] = v0;
13202 this.int16[o2 + 1] = v1;
13203 this.int16[o2 + 2] = v2;
13204 this.int16[o2 + 3] = v3;
13205 this.int16[o2 + 4] = v4;
13206 this.int16[o2 + 5] = v5;
13207 return i;
13208 }
13209}
13210StructArrayLayout2i4i12.prototype.bytesPerElement = 12;
13211register('StructArrayLayout2i4i12', StructArrayLayout2i4i12);
13212/**
13213 * Implementation of the StructArray layout:
13214 * [0]: Int16[2]
13215 * [4]: Uint8[4]
13216 *
13217 * @private
13218 */
13219class StructArrayLayout2i4ub8 extends StructArray {
13220 _refreshViews() {
13221 this.uint8 = new Uint8Array(this.arrayBuffer);
13222 this.int16 = new Int16Array(this.arrayBuffer);
13223 }
13224 emplaceBack(v0, v1, v2, v3, v4, v5) {
13225 const i = this.length;
13226 this.resize(i + 1);
13227 return this.emplace(i, v0, v1, v2, v3, v4, v5);
13228 }
13229 emplace(i, v0, v1, v2, v3, v4, v5) {
13230 const o2 = i * 4;
13231 const o1 = i * 8;
13232 this.int16[o2 + 0] = v0;
13233 this.int16[o2 + 1] = v1;
13234 this.uint8[o1 + 4] = v2;
13235 this.uint8[o1 + 5] = v3;
13236 this.uint8[o1 + 6] = v4;
13237 this.uint8[o1 + 7] = v5;
13238 return i;
13239 }
13240}
13241StructArrayLayout2i4ub8.prototype.bytesPerElement = 8;
13242register('StructArrayLayout2i4ub8', StructArrayLayout2i4ub8);
13243/**
13244 * Implementation of the StructArray layout:
13245 * [0]: Float32[2]
13246 *
13247 * @private
13248 */
13249class StructArrayLayout2f8 extends StructArray {
13250 _refreshViews() {
13251 this.uint8 = new Uint8Array(this.arrayBuffer);
13252 this.float32 = new Float32Array(this.arrayBuffer);
13253 }
13254 emplaceBack(v0, v1) {
13255 const i = this.length;
13256 this.resize(i + 1);
13257 return this.emplace(i, v0, v1);
13258 }
13259 emplace(i, v0, v1) {
13260 const o4 = i * 2;
13261 this.float32[o4 + 0] = v0;
13262 this.float32[o4 + 1] = v1;
13263 return i;
13264 }
13265}
13266StructArrayLayout2f8.prototype.bytesPerElement = 8;
13267register('StructArrayLayout2f8', StructArrayLayout2f8);
13268/**
13269 * Implementation of the StructArray layout:
13270 * [0]: Uint16[10]
13271 *
13272 * @private
13273 */
13274class StructArrayLayout10ui20 extends StructArray {
13275 _refreshViews() {
13276 this.uint8 = new Uint8Array(this.arrayBuffer);
13277 this.uint16 = new Uint16Array(this.arrayBuffer);
13278 }
13279 emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
13280 const i = this.length;
13281 this.resize(i + 1);
13282 return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
13283 }
13284 emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
13285 const o2 = i * 10;
13286 this.uint16[o2 + 0] = v0;
13287 this.uint16[o2 + 1] = v1;
13288 this.uint16[o2 + 2] = v2;
13289 this.uint16[o2 + 3] = v3;
13290 this.uint16[o2 + 4] = v4;
13291 this.uint16[o2 + 5] = v5;
13292 this.uint16[o2 + 6] = v6;
13293 this.uint16[o2 + 7] = v7;
13294 this.uint16[o2 + 8] = v8;
13295 this.uint16[o2 + 9] = v9;
13296 return i;
13297 }
13298}
13299StructArrayLayout10ui20.prototype.bytesPerElement = 20;
13300register('StructArrayLayout10ui20', StructArrayLayout10ui20);
13301/**
13302 * Implementation of the StructArray layout:
13303 * [0]: Int16[4]
13304 * [8]: Uint16[4]
13305 * [16]: Int16[4]
13306 *
13307 * @private
13308 */
13309class StructArrayLayout4i4ui4i24 extends StructArray {
13310 _refreshViews() {
13311 this.uint8 = new Uint8Array(this.arrayBuffer);
13312 this.int16 = new Int16Array(this.arrayBuffer);
13313 this.uint16 = new Uint16Array(this.arrayBuffer);
13314 }
13315 emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) {
13316 const i = this.length;
13317 this.resize(i + 1);
13318 return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
13319 }
13320 emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) {
13321 const o2 = i * 12;
13322 this.int16[o2 + 0] = v0;
13323 this.int16[o2 + 1] = v1;
13324 this.int16[o2 + 2] = v2;
13325 this.int16[o2 + 3] = v3;
13326 this.uint16[o2 + 4] = v4;
13327 this.uint16[o2 + 5] = v5;
13328 this.uint16[o2 + 6] = v6;
13329 this.uint16[o2 + 7] = v7;
13330 this.int16[o2 + 8] = v8;
13331 this.int16[o2 + 9] = v9;
13332 this.int16[o2 + 10] = v10;
13333 this.int16[o2 + 11] = v11;
13334 return i;
13335 }
13336}
13337StructArrayLayout4i4ui4i24.prototype.bytesPerElement = 24;
13338register('StructArrayLayout4i4ui4i24', StructArrayLayout4i4ui4i24);
13339/**
13340 * Implementation of the StructArray layout:
13341 * [0]: Float32[3]
13342 *
13343 * @private
13344 */
13345class StructArrayLayout3f12 extends StructArray {
13346 _refreshViews() {
13347 this.uint8 = new Uint8Array(this.arrayBuffer);
13348 this.float32 = new Float32Array(this.arrayBuffer);
13349 }
13350 emplaceBack(v0, v1, v2) {
13351 const i = this.length;
13352 this.resize(i + 1);
13353 return this.emplace(i, v0, v1, v2);
13354 }
13355 emplace(i, v0, v1, v2) {
13356 const o4 = i * 3;
13357 this.float32[o4 + 0] = v0;
13358 this.float32[o4 + 1] = v1;
13359 this.float32[o4 + 2] = v2;
13360 return i;
13361 }
13362}
13363StructArrayLayout3f12.prototype.bytesPerElement = 12;
13364register('StructArrayLayout3f12', StructArrayLayout3f12);
13365/**
13366 * Implementation of the StructArray layout:
13367 * [0]: Uint32[1]
13368 *
13369 * @private
13370 */
13371class StructArrayLayout1ul4 extends StructArray {
13372 _refreshViews() {
13373 this.uint8 = new Uint8Array(this.arrayBuffer);
13374 this.uint32 = new Uint32Array(this.arrayBuffer);
13375 }
13376 emplaceBack(v0) {
13377 const i = this.length;
13378 this.resize(i + 1);
13379 return this.emplace(i, v0);
13380 }
13381 emplace(i, v0) {
13382 const o4 = i * 1;
13383 this.uint32[o4 + 0] = v0;
13384 return i;
13385 }
13386}
13387StructArrayLayout1ul4.prototype.bytesPerElement = 4;
13388register('StructArrayLayout1ul4', StructArrayLayout1ul4);
13389/**
13390 * Implementation of the StructArray layout:
13391 * [0]: Int16[6]
13392 * [12]: Uint32[1]
13393 * [16]: Uint16[2]
13394 *
13395 * @private
13396 */
13397class StructArrayLayout6i1ul2ui20 extends StructArray {
13398 _refreshViews() {
13399 this.uint8 = new Uint8Array(this.arrayBuffer);
13400 this.int16 = new Int16Array(this.arrayBuffer);
13401 this.uint32 = new Uint32Array(this.arrayBuffer);
13402 this.uint16 = new Uint16Array(this.arrayBuffer);
13403 }
13404 emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8) {
13405 const i = this.length;
13406 this.resize(i + 1);
13407 return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8);
13408 }
13409 emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8) {
13410 const o2 = i * 10;
13411 const o4 = i * 5;
13412 this.int16[o2 + 0] = v0;
13413 this.int16[o2 + 1] = v1;
13414 this.int16[o2 + 2] = v2;
13415 this.int16[o2 + 3] = v3;
13416 this.int16[o2 + 4] = v4;
13417 this.int16[o2 + 5] = v5;
13418 this.uint32[o4 + 3] = v6;
13419 this.uint16[o2 + 8] = v7;
13420 this.uint16[o2 + 9] = v8;
13421 return i;
13422 }
13423}
13424StructArrayLayout6i1ul2ui20.prototype.bytesPerElement = 20;
13425register('StructArrayLayout6i1ul2ui20', StructArrayLayout6i1ul2ui20);
13426/**
13427 * Implementation of the StructArray layout:
13428 * [0]: Int16[2]
13429 * [4]: Int16[2]
13430 * [8]: Int16[2]
13431 *
13432 * @private
13433 */
13434class StructArrayLayout2i2i2i12 extends StructArray {
13435 _refreshViews() {
13436 this.uint8 = new Uint8Array(this.arrayBuffer);
13437 this.int16 = new Int16Array(this.arrayBuffer);
13438 }
13439 emplaceBack(v0, v1, v2, v3, v4, v5) {
13440 const i = this.length;
13441 this.resize(i + 1);
13442 return this.emplace(i, v0, v1, v2, v3, v4, v5);
13443 }
13444 emplace(i, v0, v1, v2, v3, v4, v5) {
13445 const o2 = i * 6;
13446 this.int16[o2 + 0] = v0;
13447 this.int16[o2 + 1] = v1;
13448 this.int16[o2 + 2] = v2;
13449 this.int16[o2 + 3] = v3;
13450 this.int16[o2 + 4] = v4;
13451 this.int16[o2 + 5] = v5;
13452 return i;
13453 }
13454}
13455StructArrayLayout2i2i2i12.prototype.bytesPerElement = 12;
13456register('StructArrayLayout2i2i2i12', StructArrayLayout2i2i2i12);
13457/**
13458 * Implementation of the StructArray layout:
13459 * [0]: Float32[2]
13460 * [8]: Float32[1]
13461 * [12]: Int16[2]
13462 *
13463 * @private
13464 */
13465class StructArrayLayout2f1f2i16 extends StructArray {
13466 _refreshViews() {
13467 this.uint8 = new Uint8Array(this.arrayBuffer);
13468 this.float32 = new Float32Array(this.arrayBuffer);
13469 this.int16 = new Int16Array(this.arrayBuffer);
13470 }
13471 emplaceBack(v0, v1, v2, v3, v4) {
13472 const i = this.length;
13473 this.resize(i + 1);
13474 return this.emplace(i, v0, v1, v2, v3, v4);
13475 }
13476 emplace(i, v0, v1, v2, v3, v4) {
13477 const o4 = i * 4;
13478 const o2 = i * 8;
13479 this.float32[o4 + 0] = v0;
13480 this.float32[o4 + 1] = v1;
13481 this.float32[o4 + 2] = v2;
13482 this.int16[o2 + 6] = v3;
13483 this.int16[o2 + 7] = v4;
13484 return i;
13485 }
13486}
13487StructArrayLayout2f1f2i16.prototype.bytesPerElement = 16;
13488register('StructArrayLayout2f1f2i16', StructArrayLayout2f1f2i16);
13489/**
13490 * Implementation of the StructArray layout:
13491 * [0]: Uint8[2]
13492 * [4]: Float32[2]
13493 *
13494 * @private
13495 */
13496class StructArrayLayout2ub2f12 extends StructArray {
13497 _refreshViews() {
13498 this.uint8 = new Uint8Array(this.arrayBuffer);
13499 this.float32 = new Float32Array(this.arrayBuffer);
13500 }
13501 emplaceBack(v0, v1, v2, v3) {
13502 const i = this.length;
13503 this.resize(i + 1);
13504 return this.emplace(i, v0, v1, v2, v3);
13505 }
13506 emplace(i, v0, v1, v2, v3) {
13507 const o1 = i * 12;
13508 const o4 = i * 3;
13509 this.uint8[o1 + 0] = v0;
13510 this.uint8[o1 + 1] = v1;
13511 this.float32[o4 + 1] = v2;
13512 this.float32[o4 + 2] = v3;
13513 return i;
13514 }
13515}
13516StructArrayLayout2ub2f12.prototype.bytesPerElement = 12;
13517register('StructArrayLayout2ub2f12', StructArrayLayout2ub2f12);
13518/**
13519 * Implementation of the StructArray layout:
13520 * [0]: Uint16[3]
13521 *
13522 * @private
13523 */
13524class StructArrayLayout3ui6 extends StructArray {
13525 _refreshViews() {
13526 this.uint8 = new Uint8Array(this.arrayBuffer);
13527 this.uint16 = new Uint16Array(this.arrayBuffer);
13528 }
13529 emplaceBack(v0, v1, v2) {
13530 const i = this.length;
13531 this.resize(i + 1);
13532 return this.emplace(i, v0, v1, v2);
13533 }
13534 emplace(i, v0, v1, v2) {
13535 const o2 = i * 3;
13536 this.uint16[o2 + 0] = v0;
13537 this.uint16[o2 + 1] = v1;
13538 this.uint16[o2 + 2] = v2;
13539 return i;
13540 }
13541}
13542StructArrayLayout3ui6.prototype.bytesPerElement = 6;
13543register('StructArrayLayout3ui6', StructArrayLayout3ui6);
13544/**
13545 * Implementation of the StructArray layout:
13546 * [0]: Int16[2]
13547 * [4]: Uint16[2]
13548 * [8]: Uint32[3]
13549 * [20]: Uint16[3]
13550 * [28]: Float32[2]
13551 * [36]: Uint8[3]
13552 * [40]: Uint32[1]
13553 * [44]: Int16[1]
13554 *
13555 * @private
13556 */
13557class StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48 extends StructArray {
13558 _refreshViews() {
13559 this.uint8 = new Uint8Array(this.arrayBuffer);
13560 this.int16 = new Int16Array(this.arrayBuffer);
13561 this.uint16 = new Uint16Array(this.arrayBuffer);
13562 this.uint32 = new Uint32Array(this.arrayBuffer);
13563 this.float32 = new Float32Array(this.arrayBuffer);
13564 }
13565 emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) {
13566 const i = this.length;
13567 this.resize(i + 1);
13568 return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16);
13569 }
13570 emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) {
13571 const o2 = i * 24;
13572 const o4 = i * 12;
13573 const o1 = i * 48;
13574 this.int16[o2 + 0] = v0;
13575 this.int16[o2 + 1] = v1;
13576 this.uint16[o2 + 2] = v2;
13577 this.uint16[o2 + 3] = v3;
13578 this.uint32[o4 + 2] = v4;
13579 this.uint32[o4 + 3] = v5;
13580 this.uint32[o4 + 4] = v6;
13581 this.uint16[o2 + 10] = v7;
13582 this.uint16[o2 + 11] = v8;
13583 this.uint16[o2 + 12] = v9;
13584 this.float32[o4 + 7] = v10;
13585 this.float32[o4 + 8] = v11;
13586 this.uint8[o1 + 36] = v12;
13587 this.uint8[o1 + 37] = v13;
13588 this.uint8[o1 + 38] = v14;
13589 this.uint32[o4 + 10] = v15;
13590 this.int16[o2 + 22] = v16;
13591 return i;
13592 }
13593}
13594StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.prototype.bytesPerElement = 48;
13595register('StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48', StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48);
13596/**
13597 * Implementation of the StructArray layout:
13598 * [0]: Int16[8]
13599 * [16]: Uint16[15]
13600 * [48]: Uint32[1]
13601 * [52]: Float32[4]
13602 *
13603 * @private
13604 */
13605class StructArrayLayout8i15ui1ul4f68 extends StructArray {
13606 _refreshViews() {
13607 this.uint8 = new Uint8Array(this.arrayBuffer);
13608 this.int16 = new Int16Array(this.arrayBuffer);
13609 this.uint16 = new Uint16Array(this.arrayBuffer);
13610 this.uint32 = new Uint32Array(this.arrayBuffer);
13611 this.float32 = new Float32Array(this.arrayBuffer);
13612 }
13613 emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) {
13614 const i = this.length;
13615 this.resize(i + 1);
13616 return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
13617 }
13618 emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) {
13619 const o2 = i * 34;
13620 const o4 = i * 17;
13621 this.int16[o2 + 0] = v0;
13622 this.int16[o2 + 1] = v1;
13623 this.int16[o2 + 2] = v2;
13624 this.int16[o2 + 3] = v3;
13625 this.int16[o2 + 4] = v4;
13626 this.int16[o2 + 5] = v5;
13627 this.int16[o2 + 6] = v6;
13628 this.int16[o2 + 7] = v7;
13629 this.uint16[o2 + 8] = v8;
13630 this.uint16[o2 + 9] = v9;
13631 this.uint16[o2 + 10] = v10;
13632 this.uint16[o2 + 11] = v11;
13633 this.uint16[o2 + 12] = v12;
13634 this.uint16[o2 + 13] = v13;
13635 this.uint16[o2 + 14] = v14;
13636 this.uint16[o2 + 15] = v15;
13637 this.uint16[o2 + 16] = v16;
13638 this.uint16[o2 + 17] = v17;
13639 this.uint16[o2 + 18] = v18;
13640 this.uint16[o2 + 19] = v19;
13641 this.uint16[o2 + 20] = v20;
13642 this.uint16[o2 + 21] = v21;
13643 this.uint16[o2 + 22] = v22;
13644 this.uint32[o4 + 12] = v23;
13645 this.float32[o4 + 13] = v24;
13646 this.float32[o4 + 14] = v25;
13647 this.float32[o4 + 15] = v26;
13648 this.float32[o4 + 16] = v27;
13649 return i;
13650 }
13651}
13652StructArrayLayout8i15ui1ul4f68.prototype.bytesPerElement = 68;
13653register('StructArrayLayout8i15ui1ul4f68', StructArrayLayout8i15ui1ul4f68);
13654/**
13655 * Implementation of the StructArray layout:
13656 * [0]: Float32[1]
13657 *
13658 * @private
13659 */
13660class StructArrayLayout1f4 extends StructArray {
13661 _refreshViews() {
13662 this.uint8 = new Uint8Array(this.arrayBuffer);
13663 this.float32 = new Float32Array(this.arrayBuffer);
13664 }
13665 emplaceBack(v0) {
13666 const i = this.length;
13667 this.resize(i + 1);
13668 return this.emplace(i, v0);
13669 }
13670 emplace(i, v0) {
13671 const o4 = i * 1;
13672 this.float32[o4 + 0] = v0;
13673 return i;
13674 }
13675}
13676StructArrayLayout1f4.prototype.bytesPerElement = 4;
13677register('StructArrayLayout1f4', StructArrayLayout1f4);
13678/**
13679 * Implementation of the StructArray layout:
13680 * [0]: Int16[3]
13681 *
13682 * @private
13683 */
13684class StructArrayLayout3i6 extends StructArray {
13685 _refreshViews() {
13686 this.uint8 = new Uint8Array(this.arrayBuffer);
13687 this.int16 = new Int16Array(this.arrayBuffer);
13688 }
13689 emplaceBack(v0, v1, v2) {
13690 const i = this.length;
13691 this.resize(i + 1);
13692 return this.emplace(i, v0, v1, v2);
13693 }
13694 emplace(i, v0, v1, v2) {
13695 const o2 = i * 3;
13696 this.int16[o2 + 0] = v0;
13697 this.int16[o2 + 1] = v1;
13698 this.int16[o2 + 2] = v2;
13699 return i;
13700 }
13701}
13702StructArrayLayout3i6.prototype.bytesPerElement = 6;
13703register('StructArrayLayout3i6', StructArrayLayout3i6);
13704/**
13705 * Implementation of the StructArray layout:
13706 * [0]: Uint32[1]
13707 * [4]: Uint16[2]
13708 *
13709 * @private
13710 */
13711class StructArrayLayout1ul2ui8 extends StructArray {
13712 _refreshViews() {
13713 this.uint8 = new Uint8Array(this.arrayBuffer);
13714 this.uint32 = new Uint32Array(this.arrayBuffer);
13715 this.uint16 = new Uint16Array(this.arrayBuffer);
13716 }
13717 emplaceBack(v0, v1, v2) {
13718 const i = this.length;
13719 this.resize(i + 1);
13720 return this.emplace(i, v0, v1, v2);
13721 }
13722 emplace(i, v0, v1, v2) {
13723 const o4 = i * 2;
13724 const o2 = i * 4;
13725 this.uint32[o4 + 0] = v0;
13726 this.uint16[o2 + 2] = v1;
13727 this.uint16[o2 + 3] = v2;
13728 return i;
13729 }
13730}
13731StructArrayLayout1ul2ui8.prototype.bytesPerElement = 8;
13732register('StructArrayLayout1ul2ui8', StructArrayLayout1ul2ui8);
13733/**
13734 * Implementation of the StructArray layout:
13735 * [0]: Uint16[2]
13736 *
13737 * @private
13738 */
13739class StructArrayLayout2ui4 extends StructArray {
13740 _refreshViews() {
13741 this.uint8 = new Uint8Array(this.arrayBuffer);
13742 this.uint16 = new Uint16Array(this.arrayBuffer);
13743 }
13744 emplaceBack(v0, v1) {
13745 const i = this.length;
13746 this.resize(i + 1);
13747 return this.emplace(i, v0, v1);
13748 }
13749 emplace(i, v0, v1) {
13750 const o2 = i * 2;
13751 this.uint16[o2 + 0] = v0;
13752 this.uint16[o2 + 1] = v1;
13753 return i;
13754 }
13755}
13756StructArrayLayout2ui4.prototype.bytesPerElement = 4;
13757register('StructArrayLayout2ui4', StructArrayLayout2ui4);
13758/**
13759 * Implementation of the StructArray layout:
13760 * [0]: Uint16[1]
13761 *
13762 * @private
13763 */
13764class StructArrayLayout1ui2 extends StructArray {
13765 _refreshViews() {
13766 this.uint8 = new Uint8Array(this.arrayBuffer);
13767 this.uint16 = new Uint16Array(this.arrayBuffer);
13768 }
13769 emplaceBack(v0) {
13770 const i = this.length;
13771 this.resize(i + 1);
13772 return this.emplace(i, v0);
13773 }
13774 emplace(i, v0) {
13775 const o2 = i * 1;
13776 this.uint16[o2 + 0] = v0;
13777 return i;
13778 }
13779}
13780StructArrayLayout1ui2.prototype.bytesPerElement = 2;
13781register('StructArrayLayout1ui2', StructArrayLayout1ui2);
13782/**
13783 * Implementation of the StructArray layout:
13784 * [0]: Float32[4]
13785 *
13786 * @private
13787 */
13788class StructArrayLayout4f16 extends StructArray {
13789 _refreshViews() {
13790 this.uint8 = new Uint8Array(this.arrayBuffer);
13791 this.float32 = new Float32Array(this.arrayBuffer);
13792 }
13793 emplaceBack(v0, v1, v2, v3) {
13794 const i = this.length;
13795 this.resize(i + 1);
13796 return this.emplace(i, v0, v1, v2, v3);
13797 }
13798 emplace(i, v0, v1, v2, v3) {
13799 const o4 = i * 4;
13800 this.float32[o4 + 0] = v0;
13801 this.float32[o4 + 1] = v1;
13802 this.float32[o4 + 2] = v2;
13803 this.float32[o4 + 3] = v3;
13804 return i;
13805 }
13806}
13807StructArrayLayout4f16.prototype.bytesPerElement = 16;
13808register('StructArrayLayout4f16', StructArrayLayout4f16);
13809class CollisionBoxStruct extends Struct {
13810 get anchorPointX() { return this._structArray.int16[this._pos2 + 0]; }
13811 get anchorPointY() { return this._structArray.int16[this._pos2 + 1]; }
13812 get x1() { return this._structArray.int16[this._pos2 + 2]; }
13813 get y1() { return this._structArray.int16[this._pos2 + 3]; }
13814 get x2() { return this._structArray.int16[this._pos2 + 4]; }
13815 get y2() { return this._structArray.int16[this._pos2 + 5]; }
13816 get featureIndex() { return this._structArray.uint32[this._pos4 + 3]; }
13817 get sourceLayerIndex() { return this._structArray.uint16[this._pos2 + 8]; }
13818 get bucketIndex() { return this._structArray.uint16[this._pos2 + 9]; }
13819 get anchorPoint() { return new pointGeometry(this.anchorPointX, this.anchorPointY); }
13820}
13821CollisionBoxStruct.prototype.size = 20;
13822/**
13823 * @private
13824 */
13825class CollisionBoxArray extends StructArrayLayout6i1ul2ui20 {
13826 /**
13827 * Return the CollisionBoxStruct at the given location in the array.
13828 * @param {number} index The index of the element.
13829 * @private
13830 */
13831 get(index) {
13832 assert$1(!this.isTransferred);
13833 return new CollisionBoxStruct(this, index);
13834 }
13835}
13836register('CollisionBoxArray', CollisionBoxArray);
13837class PlacedSymbolStruct extends Struct {
13838 get anchorX() { return this._structArray.int16[this._pos2 + 0]; }
13839 get anchorY() { return this._structArray.int16[this._pos2 + 1]; }
13840 get glyphStartIndex() { return this._structArray.uint16[this._pos2 + 2]; }
13841 get numGlyphs() { return this._structArray.uint16[this._pos2 + 3]; }
13842 get vertexStartIndex() { return this._structArray.uint32[this._pos4 + 2]; }
13843 get lineStartIndex() { return this._structArray.uint32[this._pos4 + 3]; }
13844 get lineLength() { return this._structArray.uint32[this._pos4 + 4]; }
13845 get segment() { return this._structArray.uint16[this._pos2 + 10]; }
13846 get lowerSize() { return this._structArray.uint16[this._pos2 + 11]; }
13847 get upperSize() { return this._structArray.uint16[this._pos2 + 12]; }
13848 get lineOffsetX() { return this._structArray.float32[this._pos4 + 7]; }
13849 get lineOffsetY() { return this._structArray.float32[this._pos4 + 8]; }
13850 get writingMode() { return this._structArray.uint8[this._pos1 + 36]; }
13851 get placedOrientation() { return this._structArray.uint8[this._pos1 + 37]; }
13852 set placedOrientation(x) { this._structArray.uint8[this._pos1 + 37] = x; }
13853 get hidden() { return this._structArray.uint8[this._pos1 + 38]; }
13854 set hidden(x) { this._structArray.uint8[this._pos1 + 38] = x; }
13855 get crossTileID() { return this._structArray.uint32[this._pos4 + 10]; }
13856 set crossTileID(x) { this._structArray.uint32[this._pos4 + 10] = x; }
13857 get associatedIconIndex() { return this._structArray.int16[this._pos2 + 22]; }
13858}
13859PlacedSymbolStruct.prototype.size = 48;
13860/**
13861 * @private
13862 */
13863class PlacedSymbolArray extends StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48 {
13864 /**
13865 * Return the PlacedSymbolStruct at the given location in the array.
13866 * @param {number} index The index of the element.
13867 * @private
13868 */
13869 get(index) {
13870 assert$1(!this.isTransferred);
13871 return new PlacedSymbolStruct(this, index);
13872 }
13873}
13874register('PlacedSymbolArray', PlacedSymbolArray);
13875class SymbolInstanceStruct extends Struct {
13876 get anchorX() { return this._structArray.int16[this._pos2 + 0]; }
13877 get anchorY() { return this._structArray.int16[this._pos2 + 1]; }
13878 get rightJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 2]; }
13879 get centerJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 3]; }
13880 get leftJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 4]; }
13881 get verticalPlacedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 5]; }
13882 get placedIconSymbolIndex() { return this._structArray.int16[this._pos2 + 6]; }
13883 get verticalPlacedIconSymbolIndex() { return this._structArray.int16[this._pos2 + 7]; }
13884 get key() { return this._structArray.uint16[this._pos2 + 8]; }
13885 get textBoxStartIndex() { return this._structArray.uint16[this._pos2 + 9]; }
13886 get textBoxEndIndex() { return this._structArray.uint16[this._pos2 + 10]; }
13887 get verticalTextBoxStartIndex() { return this._structArray.uint16[this._pos2 + 11]; }
13888 get verticalTextBoxEndIndex() { return this._structArray.uint16[this._pos2 + 12]; }
13889 get iconBoxStartIndex() { return this._structArray.uint16[this._pos2 + 13]; }
13890 get iconBoxEndIndex() { return this._structArray.uint16[this._pos2 + 14]; }
13891 get verticalIconBoxStartIndex() { return this._structArray.uint16[this._pos2 + 15]; }
13892 get verticalIconBoxEndIndex() { return this._structArray.uint16[this._pos2 + 16]; }
13893 get featureIndex() { return this._structArray.uint16[this._pos2 + 17]; }
13894 get numHorizontalGlyphVertices() { return this._structArray.uint16[this._pos2 + 18]; }
13895 get numVerticalGlyphVertices() { return this._structArray.uint16[this._pos2 + 19]; }
13896 get numIconVertices() { return this._structArray.uint16[this._pos2 + 20]; }
13897 get numVerticalIconVertices() { return this._structArray.uint16[this._pos2 + 21]; }
13898 get useRuntimeCollisionCircles() { return this._structArray.uint16[this._pos2 + 22]; }
13899 get crossTileID() { return this._structArray.uint32[this._pos4 + 12]; }
13900 set crossTileID(x) { this._structArray.uint32[this._pos4 + 12] = x; }
13901 get textBoxScale() { return this._structArray.float32[this._pos4 + 13]; }
13902 get textOffset0() { return this._structArray.float32[this._pos4 + 14]; }
13903 get textOffset1() { return this._structArray.float32[this._pos4 + 15]; }
13904 get collisionCircleDiameter() { return this._structArray.float32[this._pos4 + 16]; }
13905}
13906SymbolInstanceStruct.prototype.size = 68;
13907/**
13908 * @private
13909 */
13910class SymbolInstanceArray extends StructArrayLayout8i15ui1ul4f68 {
13911 /**
13912 * Return the SymbolInstanceStruct at the given location in the array.
13913 * @param {number} index The index of the element.
13914 * @private
13915 */
13916 get(index) {
13917 assert$1(!this.isTransferred);
13918 return new SymbolInstanceStruct(this, index);
13919 }
13920}
13921register('SymbolInstanceArray', SymbolInstanceArray);
13922/**
13923 * @private
13924 */
13925class GlyphOffsetArray extends StructArrayLayout1f4 {
13926 getoffsetX(index) { return this.float32[index * 1 + 0]; }
13927}
13928register('GlyphOffsetArray', GlyphOffsetArray);
13929/**
13930 * @private
13931 */
13932class SymbolLineVertexArray extends StructArrayLayout3i6 {
13933 getx(index) { return this.int16[index * 3 + 0]; }
13934 gety(index) { return this.int16[index * 3 + 1]; }
13935 gettileUnitDistanceFromAnchor(index) { return this.int16[index * 3 + 2]; }
13936}
13937register('SymbolLineVertexArray', SymbolLineVertexArray);
13938class FeatureIndexStruct extends Struct {
13939 get featureIndex() { return this._structArray.uint32[this._pos4 + 0]; }
13940 get sourceLayerIndex() { return this._structArray.uint16[this._pos2 + 2]; }
13941 get bucketIndex() { return this._structArray.uint16[this._pos2 + 3]; }
13942}
13943FeatureIndexStruct.prototype.size = 8;
13944/**
13945 * @private
13946 */
13947class FeatureIndexArray extends StructArrayLayout1ul2ui8 {
13948 /**
13949 * Return the FeatureIndexStruct at the given location in the array.
13950 * @param {number} index The index of the element.
13951 * @private
13952 */
13953 get(index) {
13954 assert$1(!this.isTransferred);
13955 return new FeatureIndexStruct(this, index);
13956 }
13957}
13958register('FeatureIndexArray', FeatureIndexArray);
13959class PosArray extends StructArrayLayout2i4 {
13960}
13961class RasterBoundsArray extends StructArrayLayout4i8 {
13962}
13963class CircleLayoutArray extends StructArrayLayout2i4 {
13964}
13965class FillLayoutArray extends StructArrayLayout2i4 {
13966}
13967class FillExtrusionLayoutArray extends StructArrayLayout2i4i12 {
13968}
13969class HeatmapLayoutArray extends StructArrayLayout2i4 {
13970}
13971class LineLayoutArray extends StructArrayLayout2i4ub8 {
13972}
13973class LineExtLayoutArray extends StructArrayLayout2f8 {
13974}
13975class PatternLayoutArray extends StructArrayLayout10ui20 {
13976}
13977class SymbolLayoutArray extends StructArrayLayout4i4ui4i24 {
13978}
13979class SymbolDynamicLayoutArray extends StructArrayLayout3f12 {
13980}
13981class SymbolOpacityArray extends StructArrayLayout1ul4 {
13982}
13983class CollisionBoxLayoutArray extends StructArrayLayout2i2i2i12 {
13984}
13985class CollisionCircleLayoutArray extends StructArrayLayout2f1f2i16 {
13986}
13987class CollisionVertexArray extends StructArrayLayout2ub2f12 {
13988}
13989class QuadTriangleArray extends StructArrayLayout3ui6 {
13990}
13991class TriangleIndexArray extends StructArrayLayout3ui6 {
13992}
13993class LineIndexArray extends StructArrayLayout2ui4 {
13994}
13995class LineStripIndexArray extends StructArrayLayout1ui2 {
13996}
13997
13998const layout$6 = createLayout([
13999 { name: 'a_pos', components: 2, type: 'Int16' }
14000], 4);
14001const { members: members$4, size: size$4, alignment: alignment$4 } = layout$6;
14002
14003class SegmentVector {
14004 constructor(segments = []) {
14005 this.segments = segments;
14006 }
14007 prepareSegment(numVertices, layoutVertexArray, indexArray, sortKey) {
14008 let segment = this.segments[this.segments.length - 1];
14009 if (numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH)
14010 warnOnce(`Max vertices per segment is ${SegmentVector.MAX_VERTEX_ARRAY_LENGTH}: bucket requested ${numVertices}`);
14011 if (!segment || segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH || segment.sortKey !== sortKey) {
14012 segment = {
14013 vertexOffset: layoutVertexArray.length,
14014 primitiveOffset: indexArray.length,
14015 vertexLength: 0,
14016 primitiveLength: 0
14017 };
14018 if (sortKey !== undefined)
14019 segment.sortKey = sortKey;
14020 this.segments.push(segment);
14021 }
14022 return segment;
14023 }
14024 get() {
14025 return this.segments;
14026 }
14027 destroy() {
14028 for (const segment of this.segments) {
14029 for (const k in segment.vaos) {
14030 segment.vaos[k].destroy();
14031 }
14032 }
14033 }
14034 static simpleSegment(vertexOffset, primitiveOffset, vertexLength, primitiveLength) {
14035 return new SegmentVector([{
14036 vertexOffset,
14037 primitiveOffset,
14038 vertexLength,
14039 primitiveLength,
14040 vaos: {},
14041 sortKey: 0
14042 }]);
14043 }
14044}
14045/*
14046 * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit
14047 * addressing of vertex buffers.
14048 * @private
14049 * @readonly
14050 */
14051SegmentVector.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1;
14052register('SegmentVector', SegmentVector);
14053
14054/**
14055 * Packs two numbers, interpreted as 8-bit unsigned integers, into a single
14056 * float. Unpack them in the shader using the `unpack_float()` function,
14057 * defined in _prelude.vertex.glsl
14058 *
14059 * @private
14060 */
14061function packUint8ToFloat(a, b) {
14062 // coerce a and b to 8-bit ints
14063 a = clamp(Math.floor(a), 0, 255);
14064 b = clamp(Math.floor(b), 0, 255);
14065 return 256 * a + b;
14066}
14067
14068const patternAttributes = createLayout([
14069 // [tl.x, tl.y, br.x, br.y]
14070 { name: 'a_pattern_from', components: 4, type: 'Uint16' },
14071 { name: 'a_pattern_to', components: 4, type: 'Uint16' },
14072 { name: 'a_pixel_ratio_from', components: 1, type: 'Uint16' },
14073 { name: 'a_pixel_ratio_to', components: 1, type: 'Uint16' },
14074]);
14075
14076var murmurhashJs = {exports: {}};
14077
14078var murmurhash3_gc$1 = {exports: {}};
14079
14080/**
14081 * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)
14082 *
14083 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
14084 * @see http://github.com/garycourt/murmurhash-js
14085 * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
14086 * @see http://sites.google.com/site/murmurhash/
14087 *
14088 * @param {string} key ASCII only
14089 * @param {number} seed Positive integer only
14090 * @return {number} 32-bit positive integer hash
14091 */
14092
14093(function (module) {
14094function murmurhash3_32_gc(key, seed) {
14095 var remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;
14096
14097 remainder = key.length & 3; // key.length % 4
14098 bytes = key.length - remainder;
14099 h1 = seed;
14100 c1 = 0xcc9e2d51;
14101 c2 = 0x1b873593;
14102 i = 0;
14103
14104 while (i < bytes) {
14105 k1 =
14106 ((key.charCodeAt(i) & 0xff)) |
14107 ((key.charCodeAt(++i) & 0xff) << 8) |
14108 ((key.charCodeAt(++i) & 0xff) << 16) |
14109 ((key.charCodeAt(++i) & 0xff) << 24);
14110 ++i;
14111
14112 k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;
14113 k1 = (k1 << 15) | (k1 >>> 17);
14114 k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;
14115
14116 h1 ^= k1;
14117 h1 = (h1 << 13) | (h1 >>> 19);
14118 h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;
14119 h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));
14120 }
14121
14122 k1 = 0;
14123
14124 switch (remainder) {
14125 case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;
14126 case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;
14127 case 1: k1 ^= (key.charCodeAt(i) & 0xff);
14128
14129 k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;
14130 k1 = (k1 << 15) | (k1 >>> 17);
14131 k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;
14132 h1 ^= k1;
14133 }
14134
14135 h1 ^= key.length;
14136
14137 h1 ^= h1 >>> 16;
14138 h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;
14139 h1 ^= h1 >>> 13;
14140 h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;
14141 h1 ^= h1 >>> 16;
14142
14143 return h1 >>> 0;
14144}
14145
14146if('object' !== "undefined") {
14147 module.exports = murmurhash3_32_gc;
14148}
14149}(murmurhash3_gc$1));
14150
14151var murmurhash3_gc = murmurhash3_gc$1.exports;
14152
14153var murmurhash2_gc$1 = {exports: {}};
14154
14155/**
14156 * JS Implementation of MurmurHash2
14157 *
14158 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
14159 * @see http://github.com/garycourt/murmurhash-js
14160 * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
14161 * @see http://sites.google.com/site/murmurhash/
14162 *
14163 * @param {string} str ASCII only
14164 * @param {number} seed Positive integer only
14165 * @return {number} 32-bit positive integer hash
14166 */
14167
14168(function (module) {
14169function murmurhash2_32_gc(str, seed) {
14170 var
14171 l = str.length,
14172 h = seed ^ l,
14173 i = 0,
14174 k;
14175
14176 while (l >= 4) {
14177 k =
14178 ((str.charCodeAt(i) & 0xff)) |
14179 ((str.charCodeAt(++i) & 0xff) << 8) |
14180 ((str.charCodeAt(++i) & 0xff) << 16) |
14181 ((str.charCodeAt(++i) & 0xff) << 24);
14182
14183 k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
14184 k ^= k >>> 24;
14185 k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
14186
14187 h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;
14188
14189 l -= 4;
14190 ++i;
14191 }
14192
14193 switch (l) {
14194 case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16;
14195 case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8;
14196 case 1: h ^= (str.charCodeAt(i) & 0xff);
14197 h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
14198 }
14199
14200 h ^= h >>> 13;
14201 h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
14202 h ^= h >>> 15;
14203
14204 return h >>> 0;
14205}
14206
14207if('object' !== undefined) {
14208 module.exports = murmurhash2_32_gc;
14209}
14210}(murmurhash2_gc$1));
14211
14212var murmurhash2_gc = murmurhash2_gc$1.exports;
14213
14214var murmur3 = murmurhash3_gc$1.exports;
14215var murmur2 = murmurhash2_gc$1.exports;
14216
14217murmurhashJs.exports = murmur3;
14218var murmur3_1 = murmurhashJs.exports.murmur3 = murmur3;
14219var murmur2_1 = murmurhashJs.exports.murmur2 = murmur2;
14220
14221var murmur3$1 = murmurhashJs.exports;
14222
14223// A transferable data structure that maps feature ids to their indices and buffer offsets
14224class FeaturePositionMap {
14225 constructor() {
14226 this.ids = [];
14227 this.positions = [];
14228 this.indexed = false;
14229 }
14230 add(id, index, start, end) {
14231 this.ids.push(getNumericId(id));
14232 this.positions.push(index, start, end);
14233 }
14234 getPositions(id) {
14235 assert$1(this.indexed);
14236 const intId = getNumericId(id);
14237 // binary search for the first occurrence of id in this.ids;
14238 // relies on ids/positions being sorted by id, which happens in serialization
14239 let i = 0;
14240 let j = this.ids.length - 1;
14241 while (i < j) {
14242 const m = (i + j) >> 1;
14243 if (this.ids[m] >= intId) {
14244 j = m;
14245 }
14246 else {
14247 i = m + 1;
14248 }
14249 }
14250 const positions = [];
14251 while (this.ids[i] === intId) {
14252 const index = this.positions[3 * i];
14253 const start = this.positions[3 * i + 1];
14254 const end = this.positions[3 * i + 2];
14255 positions.push({ index, start, end });
14256 i++;
14257 }
14258 return positions;
14259 }
14260 static serialize(map, transferables) {
14261 const ids = new Float64Array(map.ids);
14262 const positions = new Uint32Array(map.positions);
14263 sort(ids, positions, 0, ids.length - 1);
14264 if (transferables) {
14265 transferables.push(ids.buffer, positions.buffer);
14266 }
14267 return { ids, positions };
14268 }
14269 static deserialize(obj) {
14270 const map = new FeaturePositionMap();
14271 // after transferring, we only use these arrays statically (no pushes),
14272 // so TypedArray vs Array distinction that flow points out doesn't matter
14273 map.ids = obj.ids;
14274 map.positions = obj.positions;
14275 map.indexed = true;
14276 return map;
14277 }
14278}
14279function getNumericId(value) {
14280 const numValue = +value;
14281 if (!isNaN(numValue) && numValue <= Number.MAX_SAFE_INTEGER) {
14282 return numValue;
14283 }
14284 return murmur3$1(String(value));
14285}
14286// custom quicksort that sorts ids, indices and offsets together (by ids)
14287// uses Hoare partitioning & manual tail call optimization to avoid worst case scenarios
14288function sort(ids, positions, left, right) {
14289 while (left < right) {
14290 const pivot = ids[(left + right) >> 1];
14291 let i = left - 1;
14292 let j = right + 1;
14293 while (true) {
14294 do
14295 i++;
14296 while (ids[i] < pivot);
14297 do
14298 j--;
14299 while (ids[j] > pivot);
14300 if (i >= j)
14301 break;
14302 swap$1(ids, i, j);
14303 swap$1(positions, 3 * i, 3 * j);
14304 swap$1(positions, 3 * i + 1, 3 * j + 1);
14305 swap$1(positions, 3 * i + 2, 3 * j + 2);
14306 }
14307 if (j - left < right - j) {
14308 sort(ids, positions, left, j);
14309 left = j + 1;
14310 }
14311 else {
14312 sort(ids, positions, j + 1, right);
14313 right = j;
14314 }
14315 }
14316}
14317function swap$1(arr, i, j) {
14318 const tmp = arr[i];
14319 arr[i] = arr[j];
14320 arr[j] = tmp;
14321}
14322register('FeaturePositionMap', FeaturePositionMap);
14323
14324class Uniform {
14325 constructor(context, location) {
14326 this.gl = context.gl;
14327 this.location = location;
14328 }
14329}
14330class Uniform1i extends Uniform {
14331 constructor(context, location) {
14332 super(context, location);
14333 this.current = 0;
14334 }
14335 set(v) {
14336 if (this.current !== v) {
14337 this.current = v;
14338 this.gl.uniform1i(this.location, v);
14339 }
14340 }
14341}
14342class Uniform1f extends Uniform {
14343 constructor(context, location) {
14344 super(context, location);
14345 this.current = 0;
14346 }
14347 set(v) {
14348 if (this.current !== v) {
14349 this.current = v;
14350 this.gl.uniform1f(this.location, v);
14351 }
14352 }
14353}
14354class Uniform2f extends Uniform {
14355 constructor(context, location) {
14356 super(context, location);
14357 this.current = [0, 0];
14358 }
14359 set(v) {
14360 if (v[0] !== this.current[0] || v[1] !== this.current[1]) {
14361 this.current = v;
14362 this.gl.uniform2f(this.location, v[0], v[1]);
14363 }
14364 }
14365}
14366class Uniform3f extends Uniform {
14367 constructor(context, location) {
14368 super(context, location);
14369 this.current = [0, 0, 0];
14370 }
14371 set(v) {
14372 if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2]) {
14373 this.current = v;
14374 this.gl.uniform3f(this.location, v[0], v[1], v[2]);
14375 }
14376 }
14377}
14378class Uniform4f extends Uniform {
14379 constructor(context, location) {
14380 super(context, location);
14381 this.current = [0, 0, 0, 0];
14382 }
14383 set(v) {
14384 if (v[0] !== this.current[0] || v[1] !== this.current[1] ||
14385 v[2] !== this.current[2] || v[3] !== this.current[3]) {
14386 this.current = v;
14387 this.gl.uniform4f(this.location, v[0], v[1], v[2], v[3]);
14388 }
14389 }
14390}
14391class UniformColor extends Uniform {
14392 constructor(context, location) {
14393 super(context, location);
14394 this.current = Color.transparent;
14395 }
14396 set(v) {
14397 if (v.r !== this.current.r || v.g !== this.current.g ||
14398 v.b !== this.current.b || v.a !== this.current.a) {
14399 this.current = v;
14400 this.gl.uniform4f(this.location, v.r, v.g, v.b, v.a);
14401 }
14402 }
14403}
14404const emptyMat4 = new Float32Array(16);
14405class UniformMatrix4f extends Uniform {
14406 constructor(context, location) {
14407 super(context, location);
14408 this.current = emptyMat4;
14409 }
14410 set(v) {
14411 // The vast majority of matrix comparisons that will trip this set
14412 // happen at i=12 or i=0, so we check those first to avoid lots of
14413 // unnecessary iteration:
14414 if (v[12] !== this.current[12] || v[0] !== this.current[0]) {
14415 this.current = v;
14416 this.gl.uniformMatrix4fv(this.location, false, v);
14417 return;
14418 }
14419 for (let i = 1; i < 16; i++) {
14420 if (v[i] !== this.current[i]) {
14421 this.current = v;
14422 this.gl.uniformMatrix4fv(this.location, false, v);
14423 break;
14424 }
14425 }
14426 }
14427}
14428
14429function packColor(color) {
14430 return [
14431 packUint8ToFloat(255 * color.r, 255 * color.g),
14432 packUint8ToFloat(255 * color.b, 255 * color.a)
14433 ];
14434}
14435class ConstantBinder {
14436 constructor(value, names, type) {
14437 this.value = value;
14438 this.uniformNames = names.map(name => `u_${name}`);
14439 this.type = type;
14440 }
14441 setUniform(uniform, globals, currentValue) {
14442 uniform.set(currentValue.constantOr(this.value));
14443 }
14444 getBinding(context, location, _) {
14445 return (this.type === 'color') ?
14446 new UniformColor(context, location) :
14447 new Uniform1f(context, location);
14448 }
14449}
14450class CrossFadedConstantBinder {
14451 constructor(value, names) {
14452 this.uniformNames = names.map(name => `u_${name}`);
14453 this.patternFrom = null;
14454 this.patternTo = null;
14455 this.pixelRatioFrom = 1.0;
14456 this.pixelRatioTo = 1.0;
14457 }
14458 setConstantPatternPositions(posTo, posFrom) {
14459 this.pixelRatioFrom = posFrom.pixelRatio;
14460 this.pixelRatioTo = posTo.pixelRatio;
14461 this.patternFrom = posFrom.tlbr;
14462 this.patternTo = posTo.tlbr;
14463 }
14464 setUniform(uniform, globals, currentValue, uniformName) {
14465 const pos = uniformName === 'u_pattern_to' ? this.patternTo :
14466 uniformName === 'u_pattern_from' ? this.patternFrom :
14467 uniformName === 'u_pixel_ratio_to' ? this.pixelRatioTo :
14468 uniformName === 'u_pixel_ratio_from' ? this.pixelRatioFrom : null;
14469 if (pos)
14470 uniform.set(pos);
14471 }
14472 getBinding(context, location, name) {
14473 return name.substr(0, 9) === 'u_pattern' ?
14474 new Uniform4f(context, location) :
14475 new Uniform1f(context, location);
14476 }
14477}
14478class SourceExpressionBinder {
14479 constructor(expression, names, type, PaintVertexArray) {
14480 this.expression = expression;
14481 this.type = type;
14482 this.maxValue = 0;
14483 this.paintVertexAttributes = names.map((name) => ({
14484 name: `a_${name}`,
14485 type: 'Float32',
14486 components: type === 'color' ? 2 : 1,
14487 offset: 0
14488 }));
14489 this.paintVertexArray = new PaintVertexArray();
14490 }
14491 populatePaintArray(newLength, feature, imagePositions, canonical, formattedSection) {
14492 const start = this.paintVertexArray.length;
14493 const value = this.expression.evaluate(new EvaluationParameters(0), feature, {}, canonical, [], formattedSection);
14494 this.paintVertexArray.resize(newLength);
14495 this._setPaintValue(start, newLength, value);
14496 }
14497 updatePaintArray(start, end, feature, featureState) {
14498 const value = this.expression.evaluate({ zoom: 0 }, feature, featureState);
14499 this._setPaintValue(start, end, value);
14500 }
14501 _setPaintValue(start, end, value) {
14502 if (this.type === 'color') {
14503 const color = packColor(value);
14504 for (let i = start; i < end; i++) {
14505 this.paintVertexArray.emplace(i, color[0], color[1]);
14506 }
14507 }
14508 else {
14509 for (let i = start; i < end; i++) {
14510 this.paintVertexArray.emplace(i, value);
14511 }
14512 this.maxValue = Math.max(this.maxValue, Math.abs(value));
14513 }
14514 }
14515 upload(context) {
14516 if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) {
14517 if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) {
14518 this.paintVertexBuffer.updateData(this.paintVertexArray);
14519 }
14520 else {
14521 this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent);
14522 }
14523 }
14524 }
14525 destroy() {
14526 if (this.paintVertexBuffer) {
14527 this.paintVertexBuffer.destroy();
14528 }
14529 }
14530}
14531class CompositeExpressionBinder {
14532 constructor(expression, names, type, useIntegerZoom, zoom, PaintVertexArray) {
14533 this.expression = expression;
14534 this.uniformNames = names.map(name => `u_${name}_t`);
14535 this.type = type;
14536 this.useIntegerZoom = useIntegerZoom;
14537 this.zoom = zoom;
14538 this.maxValue = 0;
14539 this.paintVertexAttributes = names.map((name) => ({
14540 name: `a_${name}`,
14541 type: 'Float32',
14542 components: type === 'color' ? 4 : 2,
14543 offset: 0
14544 }));
14545 this.paintVertexArray = new PaintVertexArray();
14546 }
14547 populatePaintArray(newLength, feature, imagePositions, canonical, formattedSection) {
14548 const min = this.expression.evaluate(new EvaluationParameters(this.zoom), feature, {}, canonical, [], formattedSection);
14549 const max = this.expression.evaluate(new EvaluationParameters(this.zoom + 1), feature, {}, canonical, [], formattedSection);
14550 const start = this.paintVertexArray.length;
14551 this.paintVertexArray.resize(newLength);
14552 this._setPaintValue(start, newLength, min, max);
14553 }
14554 updatePaintArray(start, end, feature, featureState) {
14555 const min = this.expression.evaluate({ zoom: this.zoom }, feature, featureState);
14556 const max = this.expression.evaluate({ zoom: this.zoom + 1 }, feature, featureState);
14557 this._setPaintValue(start, end, min, max);
14558 }
14559 _setPaintValue(start, end, min, max) {
14560 if (this.type === 'color') {
14561 const minColor = packColor(min);
14562 const maxColor = packColor(max);
14563 for (let i = start; i < end; i++) {
14564 this.paintVertexArray.emplace(i, minColor[0], minColor[1], maxColor[0], maxColor[1]);
14565 }
14566 }
14567 else {
14568 for (let i = start; i < end; i++) {
14569 this.paintVertexArray.emplace(i, min, max);
14570 }
14571 this.maxValue = Math.max(this.maxValue, Math.abs(min), Math.abs(max));
14572 }
14573 }
14574 upload(context) {
14575 if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) {
14576 if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) {
14577 this.paintVertexBuffer.updateData(this.paintVertexArray);
14578 }
14579 else {
14580 this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent);
14581 }
14582 }
14583 }
14584 destroy() {
14585 if (this.paintVertexBuffer) {
14586 this.paintVertexBuffer.destroy();
14587 }
14588 }
14589 setUniform(uniform, globals) {
14590 const currentZoom = this.useIntegerZoom ? Math.floor(globals.zoom) : globals.zoom;
14591 const factor = clamp(this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1), 0, 1);
14592 uniform.set(factor);
14593 }
14594 getBinding(context, location, _) {
14595 return new Uniform1f(context, location);
14596 }
14597}
14598class CrossFadedCompositeBinder {
14599 constructor(expression, type, useIntegerZoom, zoom, PaintVertexArray, layerId) {
14600 this.expression = expression;
14601 this.type = type;
14602 this.useIntegerZoom = useIntegerZoom;
14603 this.zoom = zoom;
14604 this.layerId = layerId;
14605 this.zoomInPaintVertexArray = new PaintVertexArray();
14606 this.zoomOutPaintVertexArray = new PaintVertexArray();
14607 }
14608 populatePaintArray(length, feature, imagePositions) {
14609 const start = this.zoomInPaintVertexArray.length;
14610 this.zoomInPaintVertexArray.resize(length);
14611 this.zoomOutPaintVertexArray.resize(length);
14612 this._setPaintValues(start, length, feature.patterns && feature.patterns[this.layerId], imagePositions);
14613 }
14614 updatePaintArray(start, end, feature, featureState, imagePositions) {
14615 this._setPaintValues(start, end, feature.patterns && feature.patterns[this.layerId], imagePositions);
14616 }
14617 _setPaintValues(start, end, patterns, positions) {
14618 if (!positions || !patterns)
14619 return;
14620 const { min, mid, max } = patterns;
14621 const imageMin = positions[min];
14622 const imageMid = positions[mid];
14623 const imageMax = positions[max];
14624 if (!imageMin || !imageMid || !imageMax)
14625 return;
14626 // We populate two paint arrays because, for cross-faded properties, we don't know which direction
14627 // we're cross-fading to at layout time. In order to keep vertex attributes to a minimum and not pass
14628 // unnecessary vertex data to the shaders, we determine which to upload at draw time.
14629 for (let i = start; i < end; i++) {
14630 this.zoomInPaintVertexArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMin.tl[0], imageMin.tl[1], imageMin.br[0], imageMin.br[1], imageMid.pixelRatio, imageMin.pixelRatio);
14631 this.zoomOutPaintVertexArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMax.tl[0], imageMax.tl[1], imageMax.br[0], imageMax.br[1], imageMid.pixelRatio, imageMax.pixelRatio);
14632 }
14633 }
14634 upload(context) {
14635 if (this.zoomInPaintVertexArray && this.zoomInPaintVertexArray.arrayBuffer && this.zoomOutPaintVertexArray && this.zoomOutPaintVertexArray.arrayBuffer) {
14636 this.zoomInPaintVertexBuffer = context.createVertexBuffer(this.zoomInPaintVertexArray, patternAttributes.members, this.expression.isStateDependent);
14637 this.zoomOutPaintVertexBuffer = context.createVertexBuffer(this.zoomOutPaintVertexArray, patternAttributes.members, this.expression.isStateDependent);
14638 }
14639 }
14640 destroy() {
14641 if (this.zoomOutPaintVertexBuffer)
14642 this.zoomOutPaintVertexBuffer.destroy();
14643 if (this.zoomInPaintVertexBuffer)
14644 this.zoomInPaintVertexBuffer.destroy();
14645 }
14646}
14647/**
14648 * ProgramConfiguration contains the logic for binding style layer properties and tile
14649 * layer feature data into GL program uniforms and vertex attributes.
14650 *
14651 * Non-data-driven property values are bound to shader uniforms. Data-driven property
14652 * values are bound to vertex attributes. In order to support a uniform GLSL syntax over
14653 * both, [Mapbox GL Shaders](https://github.com/mapbox/mapbox-gl-shaders) defines a `#pragma`
14654 * abstraction, which ProgramConfiguration is responsible for implementing. At runtime,
14655 * it examines the attributes of a particular layer, combines this with fixed knowledge
14656 * about how layers of the particular type are implemented, and determines which uniforms
14657 * and vertex attributes will be required. It can then substitute the appropriate text
14658 * into the shader source code, create and link a program, and bind the uniforms and
14659 * vertex attributes in preparation for drawing.
14660 *
14661 * When a vector tile is parsed, this same configuration information is used to
14662 * populate the attribute buffers needed for data-driven styling using the zoom
14663 * level and feature property data.
14664 *
14665 * @private
14666 */
14667class ProgramConfiguration {
14668 constructor(layer, zoom, filterProperties) {
14669 this.binders = {};
14670 this._buffers = [];
14671 const keys = [];
14672 for (const property in layer.paint._values) {
14673 if (!filterProperties(property))
14674 continue;
14675 const value = layer.paint.get(property);
14676 if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) {
14677 continue;
14678 }
14679 const names = paintAttributeNames(property, layer.type);
14680 const expression = value.value;
14681 const type = value.property.specification.type;
14682 const useIntegerZoom = value.property.useIntegerZoom;
14683 const propType = value.property.specification['property-type'];
14684 const isCrossFaded = propType === 'cross-faded' || propType === 'cross-faded-data-driven';
14685 if (expression.kind === 'constant') {
14686 this.binders[property] = isCrossFaded ?
14687 new CrossFadedConstantBinder(expression.value, names) :
14688 new ConstantBinder(expression.value, names, type);
14689 keys.push(`/u_${property}`);
14690 }
14691 else if (expression.kind === 'source' || isCrossFaded) {
14692 const StructArrayLayout = layoutType(property, type, 'source');
14693 this.binders[property] = isCrossFaded ?
14694 new CrossFadedCompositeBinder(expression, type, useIntegerZoom, zoom, StructArrayLayout, layer.id) :
14695 new SourceExpressionBinder(expression, names, type, StructArrayLayout);
14696 keys.push(`/a_${property}`);
14697 }
14698 else {
14699 const StructArrayLayout = layoutType(property, type, 'composite');
14700 this.binders[property] = new CompositeExpressionBinder(expression, names, type, useIntegerZoom, zoom, StructArrayLayout);
14701 keys.push(`/z_${property}`);
14702 }
14703 }
14704 this.cacheKey = keys.sort().join('');
14705 }
14706 getMaxValue(property) {
14707 const binder = this.binders[property];
14708 return binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder ? binder.maxValue : 0;
14709 }
14710 populatePaintArrays(newLength, feature, imagePositions, canonical, formattedSection) {
14711 for (const property in this.binders) {
14712 const binder = this.binders[property];
14713 if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder)
14714 binder.populatePaintArray(newLength, feature, imagePositions, canonical, formattedSection);
14715 }
14716 }
14717 setConstantPatternPositions(posTo, posFrom) {
14718 for (const property in this.binders) {
14719 const binder = this.binders[property];
14720 if (binder instanceof CrossFadedConstantBinder)
14721 binder.setConstantPatternPositions(posTo, posFrom);
14722 }
14723 }
14724 updatePaintArrays(featureStates, featureMap, vtLayer, layer, imagePositions) {
14725 let dirty = false;
14726 for (const id in featureStates) {
14727 const positions = featureMap.getPositions(id);
14728 for (const pos of positions) {
14729 const feature = vtLayer.feature(pos.index);
14730 for (const property in this.binders) {
14731 const binder = this.binders[property];
14732 if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder ||
14733 binder instanceof CrossFadedCompositeBinder) && binder.expression.isStateDependent === true) {
14734 //AHM: Remove after https://github.com/mapbox/mapbox-gl-js/issues/6255
14735 const value = layer.paint.get(property);
14736 binder.expression = value.value;
14737 binder.updatePaintArray(pos.start, pos.end, feature, featureStates[id], imagePositions);
14738 dirty = true;
14739 }
14740 }
14741 }
14742 }
14743 return dirty;
14744 }
14745 defines() {
14746 const result = [];
14747 for (const property in this.binders) {
14748 const binder = this.binders[property];
14749 if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder) {
14750 result.push(...binder.uniformNames.map(name => `#define HAS_UNIFORM_${name}`));
14751 }
14752 }
14753 return result;
14754 }
14755 getBinderAttributes() {
14756 const result = [];
14757 for (const property in this.binders) {
14758 const binder = this.binders[property];
14759 if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) {
14760 for (let i = 0; i < binder.paintVertexAttributes.length; i++) {
14761 result.push(binder.paintVertexAttributes[i].name);
14762 }
14763 }
14764 else if (binder instanceof CrossFadedCompositeBinder) {
14765 for (let i = 0; i < patternAttributes.members.length; i++) {
14766 result.push(patternAttributes.members[i].name);
14767 }
14768 }
14769 }
14770 return result;
14771 }
14772 getBinderUniforms() {
14773 const uniforms = [];
14774 for (const property in this.binders) {
14775 const binder = this.binders[property];
14776 if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) {
14777 for (const uniformName of binder.uniformNames) {
14778 uniforms.push(uniformName);
14779 }
14780 }
14781 }
14782 return uniforms;
14783 }
14784 getPaintVertexBuffers() {
14785 return this._buffers;
14786 }
14787 getUniforms(context, locations) {
14788 const uniforms = [];
14789 for (const property in this.binders) {
14790 const binder = this.binders[property];
14791 if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) {
14792 for (const name of binder.uniformNames) {
14793 if (locations[name]) {
14794 const binding = binder.getBinding(context, locations[name], name);
14795 uniforms.push({ name, property, binding });
14796 }
14797 }
14798 }
14799 }
14800 return uniforms;
14801 }
14802 setUniforms(context, binderUniforms, properties, globals) {
14803 // Uniform state bindings are owned by the Program, but we set them
14804 // from within the ProgramConfiguraton's binder members.
14805 for (const { name, property, binding } of binderUniforms) {
14806 this.binders[property].setUniform(binding, globals, properties.get(property), name);
14807 }
14808 }
14809 updatePaintBuffers(crossfade) {
14810 this._buffers = [];
14811 for (const property in this.binders) {
14812 const binder = this.binders[property];
14813 if (crossfade && binder instanceof CrossFadedCompositeBinder) {
14814 const patternVertexBuffer = crossfade.fromScale === 2 ? binder.zoomInPaintVertexBuffer : binder.zoomOutPaintVertexBuffer;
14815 if (patternVertexBuffer)
14816 this._buffers.push(patternVertexBuffer);
14817 }
14818 else if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer) {
14819 this._buffers.push(binder.paintVertexBuffer);
14820 }
14821 }
14822 }
14823 upload(context) {
14824 for (const property in this.binders) {
14825 const binder = this.binders[property];
14826 if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder)
14827 binder.upload(context);
14828 }
14829 this.updatePaintBuffers();
14830 }
14831 destroy() {
14832 for (const property in this.binders) {
14833 const binder = this.binders[property];
14834 if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder)
14835 binder.destroy();
14836 }
14837 }
14838}
14839class ProgramConfigurationSet {
14840 constructor(layers, zoom, filterProperties = () => true) {
14841 this.programConfigurations = {};
14842 for (const layer of layers) {
14843 this.programConfigurations[layer.id] = new ProgramConfiguration(layer, zoom, filterProperties);
14844 }
14845 this.needsUpload = false;
14846 this._featureMap = new FeaturePositionMap();
14847 this._bufferOffset = 0;
14848 }
14849 populatePaintArrays(length, feature, index, imagePositions, canonical, formattedSection) {
14850 for (const key in this.programConfigurations) {
14851 this.programConfigurations[key].populatePaintArrays(length, feature, imagePositions, canonical, formattedSection);
14852 }
14853 if (feature.id !== undefined) {
14854 this._featureMap.add(feature.id, index, this._bufferOffset, length);
14855 }
14856 this._bufferOffset = length;
14857 this.needsUpload = true;
14858 }
14859 updatePaintArrays(featureStates, vtLayer, layers, imagePositions) {
14860 for (const layer of layers) {
14861 this.needsUpload = this.programConfigurations[layer.id].updatePaintArrays(featureStates, this._featureMap, vtLayer, layer, imagePositions) || this.needsUpload;
14862 }
14863 }
14864 get(layerId) {
14865 return this.programConfigurations[layerId];
14866 }
14867 upload(context) {
14868 if (!this.needsUpload)
14869 return;
14870 for (const layerId in this.programConfigurations) {
14871 this.programConfigurations[layerId].upload(context);
14872 }
14873 this.needsUpload = false;
14874 }
14875 destroy() {
14876 for (const layerId in this.programConfigurations) {
14877 this.programConfigurations[layerId].destroy();
14878 }
14879 }
14880}
14881function paintAttributeNames(property, type) {
14882 const attributeNameExceptions = {
14883 'text-opacity': ['opacity'],
14884 'icon-opacity': ['opacity'],
14885 'text-color': ['fill_color'],
14886 'icon-color': ['fill_color'],
14887 'text-halo-color': ['halo_color'],
14888 'icon-halo-color': ['halo_color'],
14889 'text-halo-blur': ['halo_blur'],
14890 'icon-halo-blur': ['halo_blur'],
14891 'text-halo-width': ['halo_width'],
14892 'icon-halo-width': ['halo_width'],
14893 'line-gap-width': ['gapwidth'],
14894 'line-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'],
14895 'fill-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'],
14896 'fill-extrusion-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'],
14897 };
14898 return attributeNameExceptions[property] || [property.replace(`${type}-`, '').replace(/-/g, '_')];
14899}
14900function getLayoutException(property) {
14901 const propertyExceptions = {
14902 'line-pattern': {
14903 'source': PatternLayoutArray,
14904 'composite': PatternLayoutArray
14905 },
14906 'fill-pattern': {
14907 'source': PatternLayoutArray,
14908 'composite': PatternLayoutArray
14909 },
14910 'fill-extrusion-pattern': {
14911 'source': PatternLayoutArray,
14912 'composite': PatternLayoutArray
14913 }
14914 };
14915 return propertyExceptions[property];
14916}
14917function layoutType(property, type, binderType) {
14918 const defaultLayouts = {
14919 'color': {
14920 'source': StructArrayLayout2f8,
14921 'composite': StructArrayLayout4f16
14922 },
14923 'number': {
14924 'source': StructArrayLayout1f4,
14925 'composite': StructArrayLayout2f8
14926 }
14927 };
14928 const layoutException = getLayoutException(property);
14929 return layoutException && layoutException[binderType] || defaultLayouts[type][binderType];
14930}
14931register('ConstantBinder', ConstantBinder);
14932register('CrossFadedConstantBinder', CrossFadedConstantBinder);
14933register('SourceExpressionBinder', SourceExpressionBinder);
14934register('CrossFadedCompositeBinder', CrossFadedCompositeBinder);
14935register('CompositeExpressionBinder', CompositeExpressionBinder);
14936register('ProgramConfiguration', ProgramConfiguration, { omit: ['_buffers'] });
14937register('ProgramConfigurationSet', ProgramConfigurationSet);
14938
14939/**
14940 * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of
14941 * all source features normalized to this extent upon load.
14942 *
14943 * The value is a consequence of the following:
14944 *
14945 * * Vertex buffer store positions as signed 16 bit integers.
14946 * * One bit is lost for signedness to support tile buffers.
14947 * * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int.
14948 * * One bit is lost to support features extending past the extent on the right edge of the tile.
14949 * * This leaves us with 2^13 = 8192
14950 *
14951 * @private
14952 * @readonly
14953 */
14954var EXTENT = 8192;
14955
14956// These bounds define the minimum and maximum supported coordinate values.
14957// While visible coordinates are within [0, EXTENT], tiles may theoretically
14958// contain cordinates within [-Infinity, Infinity]. Our range is limited by the
14959// number of bits used to represent the coordinate.
14960const BITS = 15;
14961const MAX = Math.pow(2, BITS - 1) - 1;
14962const MIN = -MAX - 1;
14963/**
14964 * Loads a geometry from a VectorTileFeature and scales it to the common extent
14965 * used internally.
14966 * @param {VectorTileFeature} feature
14967 * @private
14968 */
14969function loadGeometry(feature) {
14970 const scale = EXTENT / feature.extent;
14971 const geometry = feature.loadGeometry();
14972 for (let r = 0; r < geometry.length; r++) {
14973 const ring = geometry[r];
14974 for (let p = 0; p < ring.length; p++) {
14975 const point = ring[p];
14976 // round here because mapbox-gl-native uses integers to represent
14977 // points and we need to do the same to avoid renering differences.
14978 const x = Math.round(point.x * scale);
14979 const y = Math.round(point.y * scale);
14980 point.x = clamp(x, MIN, MAX);
14981 point.y = clamp(y, MIN, MAX);
14982 if (x < point.x || x > point.x + 1 || y < point.y || y > point.y + 1) {
14983 // warn when exceeding allowed extent except for the 1-px-off case
14984 // https://github.com/mapbox/mapbox-gl-js/issues/8992
14985 warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size');
14986 }
14987 }
14988 }
14989 return geometry;
14990}
14991
14992/**
14993 * Construct a new feature based on a VectorTileFeature for expression evaluation, the geometry of which
14994 * will be loaded based on necessity.
14995 * @param {VectorTileFeature} feature
14996 * @param {boolean} needGeometry
14997 * @private
14998 */
14999function toEvaluationFeature(feature, needGeometry) {
15000 return { type: feature.type,
15001 id: feature.id,
15002 properties: feature.properties,
15003 geometry: needGeometry ? loadGeometry(feature) : [] };
15004}
15005
15006function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) {
15007 layoutVertexArray.emplaceBack((x * 2) + ((extrudeX + 1) / 2), (y * 2) + ((extrudeY + 1) / 2));
15008}
15009/**
15010 * Circles are represented by two triangles.
15011 *
15012 * Each corner has a pos that is the center of the circle and an extrusion
15013 * vector that is where it points.
15014 * @private
15015 */
15016class CircleBucket {
15017 constructor(options) {
15018 this.zoom = options.zoom;
15019 this.overscaling = options.overscaling;
15020 this.layers = options.layers;
15021 this.layerIds = this.layers.map(layer => layer.id);
15022 this.index = options.index;
15023 this.hasPattern = false;
15024 this.layoutVertexArray = new CircleLayoutArray();
15025 this.indexArray = new TriangleIndexArray();
15026 this.segments = new SegmentVector();
15027 this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);
15028 this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
15029 }
15030 populate(features, options, canonical) {
15031 const styleLayer = this.layers[0];
15032 const bucketFeatures = [];
15033 let circleSortKey = null;
15034 let sortFeaturesByKey = false;
15035 // Heatmap layers are handled in this bucket and have no evaluated properties, so we check our access
15036 if (styleLayer.type === 'circle') {
15037 circleSortKey = styleLayer.layout.get('circle-sort-key');
15038 sortFeaturesByKey = !circleSortKey.isConstant();
15039 }
15040 for (const { feature, id, index, sourceLayerIndex } of features) {
15041 const needGeometry = this.layers[0]._featureFilter.needGeometry;
15042 const evaluationFeature = toEvaluationFeature(feature, needGeometry);
15043 if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical))
15044 continue;
15045 const sortKey = sortFeaturesByKey ?
15046 circleSortKey.evaluate(evaluationFeature, {}, canonical) :
15047 undefined;
15048 const bucketFeature = {
15049 id,
15050 properties: feature.properties,
15051 type: feature.type,
15052 sourceLayerIndex,
15053 index,
15054 geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature),
15055 patterns: {},
15056 sortKey
15057 };
15058 bucketFeatures.push(bucketFeature);
15059 }
15060 if (sortFeaturesByKey) {
15061 bucketFeatures.sort((a, b) => a.sortKey - b.sortKey);
15062 }
15063 for (const bucketFeature of bucketFeatures) {
15064 const { geometry, index, sourceLayerIndex } = bucketFeature;
15065 const feature = features[index].feature;
15066 this.addFeature(bucketFeature, geometry, index, canonical);
15067 options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);
15068 }
15069 }
15070 update(states, vtLayer, imagePositions) {
15071 if (!this.stateDependentLayers.length)
15072 return;
15073 this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
15074 }
15075 isEmpty() {
15076 return this.layoutVertexArray.length === 0;
15077 }
15078 uploadPending() {
15079 return !this.uploaded || this.programConfigurations.needsUpload;
15080 }
15081 upload(context) {
15082 if (!this.uploaded) {
15083 this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$4);
15084 this.indexBuffer = context.createIndexBuffer(this.indexArray);
15085 }
15086 this.programConfigurations.upload(context);
15087 this.uploaded = true;
15088 }
15089 destroy() {
15090 if (!this.layoutVertexBuffer)
15091 return;
15092 this.layoutVertexBuffer.destroy();
15093 this.indexBuffer.destroy();
15094 this.programConfigurations.destroy();
15095 this.segments.destroy();
15096 }
15097 addFeature(feature, geometry, index, canonical) {
15098 for (const ring of geometry) {
15099 for (const point of ring) {
15100 const x = point.x;
15101 const y = point.y;
15102 // Do not include points that are outside the tile boundaries.
15103 if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT)
15104 continue;
15105 // this geometry will be of the Point type, and we'll derive
15106 // two triangles from it.
15107 //
15108 // ┌─────────┐
15109 // │ 3 2 │
15110 // │ │
15111 // │ 0 1 │
15112 // └─────────┘
15113 const segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, feature.sortKey);
15114 const index = segment.vertexLength;
15115 addCircleVertex(this.layoutVertexArray, x, y, -1, -1);
15116 addCircleVertex(this.layoutVertexArray, x, y, 1, -1);
15117 addCircleVertex(this.layoutVertexArray, x, y, 1, 1);
15118 addCircleVertex(this.layoutVertexArray, x, y, -1, 1);
15119 this.indexArray.emplaceBack(index, index + 1, index + 2);
15120 this.indexArray.emplaceBack(index, index + 3, index + 2);
15121 segment.vertexLength += 4;
15122 segment.primitiveLength += 2;
15123 }
15124 }
15125 this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, {}, canonical);
15126 }
15127}
15128register('CircleBucket', CircleBucket, { omit: ['layers'] });
15129
15130function polygonIntersectsPolygon(polygonA, polygonB) {
15131 for (let i = 0; i < polygonA.length; i++) {
15132 if (polygonContainsPoint(polygonB, polygonA[i]))
15133 return true;
15134 }
15135 for (let i = 0; i < polygonB.length; i++) {
15136 if (polygonContainsPoint(polygonA, polygonB[i]))
15137 return true;
15138 }
15139 if (lineIntersectsLine(polygonA, polygonB))
15140 return true;
15141 return false;
15142}
15143function polygonIntersectsBufferedPoint(polygon, point, radius) {
15144 if (polygonContainsPoint(polygon, point))
15145 return true;
15146 if (pointIntersectsBufferedLine(point, polygon, radius))
15147 return true;
15148 return false;
15149}
15150function polygonIntersectsMultiPolygon(polygon, multiPolygon) {
15151 if (polygon.length === 1) {
15152 return multiPolygonContainsPoint(multiPolygon, polygon[0]);
15153 }
15154 for (let m = 0; m < multiPolygon.length; m++) {
15155 const ring = multiPolygon[m];
15156 for (let n = 0; n < ring.length; n++) {
15157 if (polygonContainsPoint(polygon, ring[n]))
15158 return true;
15159 }
15160 }
15161 for (let i = 0; i < polygon.length; i++) {
15162 if (multiPolygonContainsPoint(multiPolygon, polygon[i]))
15163 return true;
15164 }
15165 for (let k = 0; k < multiPolygon.length; k++) {
15166 if (lineIntersectsLine(polygon, multiPolygon[k]))
15167 return true;
15168 }
15169 return false;
15170}
15171function polygonIntersectsBufferedMultiLine(polygon, multiLine, radius) {
15172 for (let i = 0; i < multiLine.length; i++) {
15173 const line = multiLine[i];
15174 if (polygon.length >= 3) {
15175 for (let k = 0; k < line.length; k++) {
15176 if (polygonContainsPoint(polygon, line[k]))
15177 return true;
15178 }
15179 }
15180 if (lineIntersectsBufferedLine(polygon, line, radius))
15181 return true;
15182 }
15183 return false;
15184}
15185function lineIntersectsBufferedLine(lineA, lineB, radius) {
15186 if (lineA.length > 1) {
15187 if (lineIntersectsLine(lineA, lineB))
15188 return true;
15189 // Check whether any point in either line is within radius of the other line
15190 for (let j = 0; j < lineB.length; j++) {
15191 if (pointIntersectsBufferedLine(lineB[j], lineA, radius))
15192 return true;
15193 }
15194 }
15195 for (let k = 0; k < lineA.length; k++) {
15196 if (pointIntersectsBufferedLine(lineA[k], lineB, radius))
15197 return true;
15198 }
15199 return false;
15200}
15201function lineIntersectsLine(lineA, lineB) {
15202 if (lineA.length === 0 || lineB.length === 0)
15203 return false;
15204 for (let i = 0; i < lineA.length - 1; i++) {
15205 const a0 = lineA[i];
15206 const a1 = lineA[i + 1];
15207 for (let j = 0; j < lineB.length - 1; j++) {
15208 const b0 = lineB[j];
15209 const b1 = lineB[j + 1];
15210 if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1))
15211 return true;
15212 }
15213 }
15214 return false;
15215}
15216function lineSegmentIntersectsLineSegment(a0, a1, b0, b1) {
15217 return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) &&
15218 isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1);
15219}
15220function pointIntersectsBufferedLine(p, line, radius) {
15221 const radiusSquared = radius * radius;
15222 if (line.length === 1)
15223 return p.distSqr(line[0]) < radiusSquared;
15224 for (let i = 1; i < line.length; i++) {
15225 // Find line segments that have a distance <= radius^2 to p
15226 // In that case, we treat the line as "containing point p".
15227 const v = line[i - 1], w = line[i];
15228 if (distToSegmentSquared(p, v, w) < radiusSquared)
15229 return true;
15230 }
15231 return false;
15232}
15233// Code from http://stackoverflow.com/a/1501725/331379.
15234function distToSegmentSquared(p, v, w) {
15235 const l2 = v.distSqr(w);
15236 if (l2 === 0)
15237 return p.distSqr(v);
15238 const t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;
15239 if (t < 0)
15240 return p.distSqr(v);
15241 if (t > 1)
15242 return p.distSqr(w);
15243 return p.distSqr(w.sub(v)._mult(t)._add(v));
15244}
15245// point in polygon ray casting algorithm
15246function multiPolygonContainsPoint(rings, p) {
15247 let c = false, ring, p1, p2;
15248 for (let k = 0; k < rings.length; k++) {
15249 ring = rings[k];
15250 for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
15251 p1 = ring[i];
15252 p2 = ring[j];
15253 if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
15254 c = !c;
15255 }
15256 }
15257 }
15258 return c;
15259}
15260function polygonContainsPoint(ring, p) {
15261 let c = false;
15262 for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
15263 const p1 = ring[i];
15264 const p2 = ring[j];
15265 if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
15266 c = !c;
15267 }
15268 }
15269 return c;
15270}
15271function polygonIntersectsBox(ring, boxX1, boxY1, boxX2, boxY2) {
15272 for (const p of ring) {
15273 if (boxX1 <= p.x &&
15274 boxY1 <= p.y &&
15275 boxX2 >= p.x &&
15276 boxY2 >= p.y)
15277 return true;
15278 }
15279 const corners = [
15280 new pointGeometry(boxX1, boxY1),
15281 new pointGeometry(boxX1, boxY2),
15282 new pointGeometry(boxX2, boxY2),
15283 new pointGeometry(boxX2, boxY1)
15284 ];
15285 if (ring.length > 2) {
15286 for (const corner of corners) {
15287 if (polygonContainsPoint(ring, corner))
15288 return true;
15289 }
15290 }
15291 for (let i = 0; i < ring.length - 1; i++) {
15292 const p1 = ring[i];
15293 const p2 = ring[i + 1];
15294 if (edgeIntersectsBox(p1, p2, corners))
15295 return true;
15296 }
15297 return false;
15298}
15299function edgeIntersectsBox(e1, e2, corners) {
15300 const tl = corners[0];
15301 const br = corners[2];
15302 // the edge and box do not intersect in either the x or y dimensions
15303 if (((e1.x < tl.x) && (e2.x < tl.x)) ||
15304 ((e1.x > br.x) && (e2.x > br.x)) ||
15305 ((e1.y < tl.y) && (e2.y < tl.y)) ||
15306 ((e1.y > br.y) && (e2.y > br.y)))
15307 return false;
15308 // check if all corners of the box are on the same side of the edge
15309 const dir = isCounterClockwise(e1, e2, corners[0]);
15310 return dir !== isCounterClockwise(e1, e2, corners[1]) ||
15311 dir !== isCounterClockwise(e1, e2, corners[2]) ||
15312 dir !== isCounterClockwise(e1, e2, corners[3]);
15313}
15314
15315function getMaximumPaintValue(property, layer, bucket) {
15316 const value = layer.paint.get(property).value;
15317 if (value.kind === 'constant') {
15318 return value.value;
15319 }
15320 else {
15321 return bucket.programConfigurations.get(layer.id).getMaxValue(property);
15322 }
15323}
15324function translateDistance(translate) {
15325 return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);
15326}
15327function translate$4(queryGeometry, translate, translateAnchor, bearing, pixelsToTileUnits) {
15328 if (!translate[0] && !translate[1]) {
15329 return queryGeometry;
15330 }
15331 const pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits);
15332 if (translateAnchor === 'viewport') {
15333 pt._rotate(-bearing);
15334 }
15335 const translated = [];
15336 for (let i = 0; i < queryGeometry.length; i++) {
15337 const point = queryGeometry[i];
15338 translated.push(point.sub(pt));
15339 }
15340 return translated;
15341}
15342function offsetLine(rings, offset) {
15343 const newRings = [];
15344 for (let ringIndex = 0; ringIndex < rings.length; ringIndex++) {
15345 const ring = rings[ringIndex];
15346 const newRing = [];
15347 for (let index = 0; index < ring.length; index++) {
15348 const a = ring[index - 1];
15349 const b = ring[index];
15350 const c = ring[index + 1];
15351 const aToB = index === 0 ? new pointGeometry(0, 0) : b.sub(a)._unit()._perp();
15352 const bToC = index === ring.length - 1 ? new pointGeometry(0, 0) : c.sub(b)._unit()._perp();
15353 const extrude = aToB._add(bToC)._unit();
15354 const cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;
15355 if (cosHalfAngle !== 0) {
15356 extrude._mult(1 / cosHalfAngle);
15357 }
15358 newRing.push(extrude._mult(offset)._add(b));
15359 }
15360 newRings.push(newRing);
15361 }
15362 return newRings;
15363}
15364
15365// This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
15366const layout$5 = new Properties({
15367 "circle-sort-key": new DataDrivenProperty(spec["layout_circle"]["circle-sort-key"]),
15368});
15369const paint$8 = new Properties({
15370 "circle-radius": new DataDrivenProperty(spec["paint_circle"]["circle-radius"]),
15371 "circle-color": new DataDrivenProperty(spec["paint_circle"]["circle-color"]),
15372 "circle-blur": new DataDrivenProperty(spec["paint_circle"]["circle-blur"]),
15373 "circle-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-opacity"]),
15374 "circle-translate": new DataConstantProperty(spec["paint_circle"]["circle-translate"]),
15375 "circle-translate-anchor": new DataConstantProperty(spec["paint_circle"]["circle-translate-anchor"]),
15376 "circle-pitch-scale": new DataConstantProperty(spec["paint_circle"]["circle-pitch-scale"]),
15377 "circle-pitch-alignment": new DataConstantProperty(spec["paint_circle"]["circle-pitch-alignment"]),
15378 "circle-stroke-width": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-width"]),
15379 "circle-stroke-color": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-color"]),
15380 "circle-stroke-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-opacity"]),
15381});
15382var properties$8 = { paint: paint$8, layout: layout$5 };
15383
15384/**
15385 * Common utilities
15386 * @module glMatrix
15387 */
15388// Configuration Constants
15389var EPSILON = 0.000001;
15390var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;
15391var RANDOM = Math.random;
15392/**
15393 * Sets the type of array used when creating new vectors and matrices
15394 *
15395 * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array
15396 */
15397
15398function setMatrixArrayType(type) {
15399 ARRAY_TYPE = type;
15400}
15401var degree = Math.PI / 180;
15402/**
15403 * Convert Degree To Radian
15404 *
15405 * @param {Number} a Angle in Degrees
15406 */
15407
15408function toRadian(a) {
15409 return a * degree;
15410}
15411/**
15412 * Tests whether or not the arguments have approximately the same value, within an absolute
15413 * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less
15414 * than or equal to 1.0, and a relative tolerance is used for larger values)
15415 *
15416 * @param {Number} a The first number to test.
15417 * @param {Number} b The second number to test.
15418 * @returns {Boolean} True if the numbers are approximately equal, false otherwise.
15419 */
15420
15421function equals$a(a, b) {
15422 return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));
15423}
15424if (!Math.hypot) Math.hypot = function () {
15425 var y = 0,
15426 i = arguments.length;
15427
15428 while (i--) {
15429 y += arguments[i] * arguments[i];
15430 }
15431
15432 return Math.sqrt(y);
15433};
15434
15435var common = /*#__PURE__*/Object.freeze({
15436__proto__: null,
15437EPSILON: EPSILON,
15438get ARRAY_TYPE () { return ARRAY_TYPE; },
15439RANDOM: RANDOM,
15440setMatrixArrayType: setMatrixArrayType,
15441toRadian: toRadian,
15442equals: equals$a
15443});
15444
15445/**
15446 * 2x2 Matrix
15447 * @module mat2
15448 */
15449
15450/**
15451 * Creates a new identity mat2
15452 *
15453 * @returns {mat2} a new 2x2 matrix
15454 */
15455
15456function create$8() {
15457 var out = new ARRAY_TYPE(4);
15458
15459 if (ARRAY_TYPE != Float32Array) {
15460 out[1] = 0;
15461 out[2] = 0;
15462 }
15463
15464 out[0] = 1;
15465 out[3] = 1;
15466 return out;
15467}
15468/**
15469 * Creates a new mat2 initialized with values from an existing matrix
15470 *
15471 * @param {ReadonlyMat2} a matrix to clone
15472 * @returns {mat2} a new 2x2 matrix
15473 */
15474
15475function clone$8(a) {
15476 var out = new ARRAY_TYPE(4);
15477 out[0] = a[0];
15478 out[1] = a[1];
15479 out[2] = a[2];
15480 out[3] = a[3];
15481 return out;
15482}
15483/**
15484 * Copy the values from one mat2 to another
15485 *
15486 * @param {mat2} out the receiving matrix
15487 * @param {ReadonlyMat2} a the source matrix
15488 * @returns {mat2} out
15489 */
15490
15491function copy$8(out, a) {
15492 out[0] = a[0];
15493 out[1] = a[1];
15494 out[2] = a[2];
15495 out[3] = a[3];
15496 return out;
15497}
15498/**
15499 * Set a mat2 to the identity matrix
15500 *
15501 * @param {mat2} out the receiving matrix
15502 * @returns {mat2} out
15503 */
15504
15505function identity$5(out) {
15506 out[0] = 1;
15507 out[1] = 0;
15508 out[2] = 0;
15509 out[3] = 1;
15510 return out;
15511}
15512/**
15513 * Create a new mat2 with the given values
15514 *
15515 * @param {Number} m00 Component in column 0, row 0 position (index 0)
15516 * @param {Number} m01 Component in column 0, row 1 position (index 1)
15517 * @param {Number} m10 Component in column 1, row 0 position (index 2)
15518 * @param {Number} m11 Component in column 1, row 1 position (index 3)
15519 * @returns {mat2} out A new 2x2 matrix
15520 */
15521
15522function fromValues$8(m00, m01, m10, m11) {
15523 var out = new ARRAY_TYPE(4);
15524 out[0] = m00;
15525 out[1] = m01;
15526 out[2] = m10;
15527 out[3] = m11;
15528 return out;
15529}
15530/**
15531 * Set the components of a mat2 to the given values
15532 *
15533 * @param {mat2} out the receiving matrix
15534 * @param {Number} m00 Component in column 0, row 0 position (index 0)
15535 * @param {Number} m01 Component in column 0, row 1 position (index 1)
15536 * @param {Number} m10 Component in column 1, row 0 position (index 2)
15537 * @param {Number} m11 Component in column 1, row 1 position (index 3)
15538 * @returns {mat2} out
15539 */
15540
15541function set$8(out, m00, m01, m10, m11) {
15542 out[0] = m00;
15543 out[1] = m01;
15544 out[2] = m10;
15545 out[3] = m11;
15546 return out;
15547}
15548/**
15549 * Transpose the values of a mat2
15550 *
15551 * @param {mat2} out the receiving matrix
15552 * @param {ReadonlyMat2} a the source matrix
15553 * @returns {mat2} out
15554 */
15555
15556function transpose$2(out, a) {
15557 // If we are transposing ourselves we can skip a few steps but have to cache
15558 // some values
15559 if (out === a) {
15560 var a1 = a[1];
15561 out[1] = a[2];
15562 out[2] = a1;
15563 } else {
15564 out[0] = a[0];
15565 out[1] = a[2];
15566 out[2] = a[1];
15567 out[3] = a[3];
15568 }
15569
15570 return out;
15571}
15572/**
15573 * Inverts a mat2
15574 *
15575 * @param {mat2} out the receiving matrix
15576 * @param {ReadonlyMat2} a the source matrix
15577 * @returns {mat2} out
15578 */
15579
15580function invert$5(out, a) {
15581 var a0 = a[0],
15582 a1 = a[1],
15583 a2 = a[2],
15584 a3 = a[3]; // Calculate the determinant
15585
15586 var det = a0 * a3 - a2 * a1;
15587
15588 if (!det) {
15589 return null;
15590 }
15591
15592 det = 1.0 / det;
15593 out[0] = a3 * det;
15594 out[1] = -a1 * det;
15595 out[2] = -a2 * det;
15596 out[3] = a0 * det;
15597 return out;
15598}
15599/**
15600 * Calculates the adjugate of a mat2
15601 *
15602 * @param {mat2} out the receiving matrix
15603 * @param {ReadonlyMat2} a the source matrix
15604 * @returns {mat2} out
15605 */
15606
15607function adjoint$2(out, a) {
15608 // Caching this value is nessecary if out == a
15609 var a0 = a[0];
15610 out[0] = a[3];
15611 out[1] = -a[1];
15612 out[2] = -a[2];
15613 out[3] = a0;
15614 return out;
15615}
15616/**
15617 * Calculates the determinant of a mat2
15618 *
15619 * @param {ReadonlyMat2} a the source matrix
15620 * @returns {Number} determinant of a
15621 */
15622
15623function determinant$3(a) {
15624 return a[0] * a[3] - a[2] * a[1];
15625}
15626/**
15627 * Multiplies two mat2's
15628 *
15629 * @param {mat2} out the receiving matrix
15630 * @param {ReadonlyMat2} a the first operand
15631 * @param {ReadonlyMat2} b the second operand
15632 * @returns {mat2} out
15633 */
15634
15635function multiply$8(out, a, b) {
15636 var a0 = a[0],
15637 a1 = a[1],
15638 a2 = a[2],
15639 a3 = a[3];
15640 var b0 = b[0],
15641 b1 = b[1],
15642 b2 = b[2],
15643 b3 = b[3];
15644 out[0] = a0 * b0 + a2 * b1;
15645 out[1] = a1 * b0 + a3 * b1;
15646 out[2] = a0 * b2 + a2 * b3;
15647 out[3] = a1 * b2 + a3 * b3;
15648 return out;
15649}
15650/**
15651 * Rotates a mat2 by the given angle
15652 *
15653 * @param {mat2} out the receiving matrix
15654 * @param {ReadonlyMat2} a the matrix to rotate
15655 * @param {Number} rad the angle to rotate the matrix by
15656 * @returns {mat2} out
15657 */
15658
15659function rotate$4(out, a, rad) {
15660 var a0 = a[0],
15661 a1 = a[1],
15662 a2 = a[2],
15663 a3 = a[3];
15664 var s = Math.sin(rad);
15665 var c = Math.cos(rad);
15666 out[0] = a0 * c + a2 * s;
15667 out[1] = a1 * c + a3 * s;
15668 out[2] = a0 * -s + a2 * c;
15669 out[3] = a1 * -s + a3 * c;
15670 return out;
15671}
15672/**
15673 * Scales the mat2 by the dimensions in the given vec2
15674 *
15675 * @param {mat2} out the receiving matrix
15676 * @param {ReadonlyMat2} a the matrix to rotate
15677 * @param {ReadonlyVec2} v the vec2 to scale the matrix by
15678 * @returns {mat2} out
15679 **/
15680
15681function scale$8(out, a, v) {
15682 var a0 = a[0],
15683 a1 = a[1],
15684 a2 = a[2],
15685 a3 = a[3];
15686 var v0 = v[0],
15687 v1 = v[1];
15688 out[0] = a0 * v0;
15689 out[1] = a1 * v0;
15690 out[2] = a2 * v1;
15691 out[3] = a3 * v1;
15692 return out;
15693}
15694/**
15695 * Creates a matrix from a given angle
15696 * This is equivalent to (but much faster than):
15697 *
15698 * mat2.identity(dest);
15699 * mat2.rotate(dest, dest, rad);
15700 *
15701 * @param {mat2} out mat2 receiving operation result
15702 * @param {Number} rad the angle to rotate the matrix by
15703 * @returns {mat2} out
15704 */
15705
15706function fromRotation$4(out, rad) {
15707 var s = Math.sin(rad);
15708 var c = Math.cos(rad);
15709 out[0] = c;
15710 out[1] = s;
15711 out[2] = -s;
15712 out[3] = c;
15713 return out;
15714}
15715/**
15716 * Creates a matrix from a vector scaling
15717 * This is equivalent to (but much faster than):
15718 *
15719 * mat2.identity(dest);
15720 * mat2.scale(dest, dest, vec);
15721 *
15722 * @param {mat2} out mat2 receiving operation result
15723 * @param {ReadonlyVec2} v Scaling vector
15724 * @returns {mat2} out
15725 */
15726
15727function fromScaling$3(out, v) {
15728 out[0] = v[0];
15729 out[1] = 0;
15730 out[2] = 0;
15731 out[3] = v[1];
15732 return out;
15733}
15734/**
15735 * Returns a string representation of a mat2
15736 *
15737 * @param {ReadonlyMat2} a matrix to represent as a string
15738 * @returns {String} string representation of the matrix
15739 */
15740
15741function str$8(a) {
15742 return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")";
15743}
15744/**
15745 * Returns Frobenius norm of a mat2
15746 *
15747 * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of
15748 * @returns {Number} Frobenius norm
15749 */
15750
15751function frob$3(a) {
15752 return Math.hypot(a[0], a[1], a[2], a[3]);
15753}
15754/**
15755 * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix
15756 * @param {ReadonlyMat2} L the lower triangular matrix
15757 * @param {ReadonlyMat2} D the diagonal matrix
15758 * @param {ReadonlyMat2} U the upper triangular matrix
15759 * @param {ReadonlyMat2} a the input matrix to factorize
15760 */
15761
15762function LDU(L, D, U, a) {
15763 L[2] = a[2] / a[0];
15764 U[0] = a[0];
15765 U[1] = a[1];
15766 U[3] = a[3] - L[2] * U[1];
15767 return [L, D, U];
15768}
15769/**
15770 * Adds two mat2's
15771 *
15772 * @param {mat2} out the receiving matrix
15773 * @param {ReadonlyMat2} a the first operand
15774 * @param {ReadonlyMat2} b the second operand
15775 * @returns {mat2} out
15776 */
15777
15778function add$8(out, a, b) {
15779 out[0] = a[0] + b[0];
15780 out[1] = a[1] + b[1];
15781 out[2] = a[2] + b[2];
15782 out[3] = a[3] + b[3];
15783 return out;
15784}
15785/**
15786 * Subtracts matrix b from matrix a
15787 *
15788 * @param {mat2} out the receiving matrix
15789 * @param {ReadonlyMat2} a the first operand
15790 * @param {ReadonlyMat2} b the second operand
15791 * @returns {mat2} out
15792 */
15793
15794function subtract$6(out, a, b) {
15795 out[0] = a[0] - b[0];
15796 out[1] = a[1] - b[1];
15797 out[2] = a[2] - b[2];
15798 out[3] = a[3] - b[3];
15799 return out;
15800}
15801/**
15802 * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
15803 *
15804 * @param {ReadonlyMat2} a The first matrix.
15805 * @param {ReadonlyMat2} b The second matrix.
15806 * @returns {Boolean} True if the matrices are equal, false otherwise.
15807 */
15808
15809function exactEquals$8(a, b) {
15810 return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
15811}
15812/**
15813 * Returns whether or not the matrices have approximately the same elements in the same position.
15814 *
15815 * @param {ReadonlyMat2} a The first matrix.
15816 * @param {ReadonlyMat2} b The second matrix.
15817 * @returns {Boolean} True if the matrices are equal, false otherwise.
15818 */
15819
15820function equals$9(a, b) {
15821 var a0 = a[0],
15822 a1 = a[1],
15823 a2 = a[2],
15824 a3 = a[3];
15825 var b0 = b[0],
15826 b1 = b[1],
15827 b2 = b[2],
15828 b3 = b[3];
15829 return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));
15830}
15831/**
15832 * Multiply each element of the matrix by a scalar.
15833 *
15834 * @param {mat2} out the receiving matrix
15835 * @param {ReadonlyMat2} a the matrix to scale
15836 * @param {Number} b amount to scale the matrix's elements by
15837 * @returns {mat2} out
15838 */
15839
15840function multiplyScalar$3(out, a, b) {
15841 out[0] = a[0] * b;
15842 out[1] = a[1] * b;
15843 out[2] = a[2] * b;
15844 out[3] = a[3] * b;
15845 return out;
15846}
15847/**
15848 * Adds two mat2's after multiplying each element of the second operand by a scalar value.
15849 *
15850 * @param {mat2} out the receiving vector
15851 * @param {ReadonlyMat2} a the first operand
15852 * @param {ReadonlyMat2} b the second operand
15853 * @param {Number} scale the amount to scale b's elements by before adding
15854 * @returns {mat2} out
15855 */
15856
15857function multiplyScalarAndAdd$3(out, a, b, scale) {
15858 out[0] = a[0] + b[0] * scale;
15859 out[1] = a[1] + b[1] * scale;
15860 out[2] = a[2] + b[2] * scale;
15861 out[3] = a[3] + b[3] * scale;
15862 return out;
15863}
15864/**
15865 * Alias for {@link mat2.multiply}
15866 * @function
15867 */
15868
15869var mul$8 = multiply$8;
15870/**
15871 * Alias for {@link mat2.subtract}
15872 * @function
15873 */
15874
15875var sub$6 = subtract$6;
15876
15877var mat2 = /*#__PURE__*/Object.freeze({
15878__proto__: null,
15879create: create$8,
15880clone: clone$8,
15881copy: copy$8,
15882identity: identity$5,
15883fromValues: fromValues$8,
15884set: set$8,
15885transpose: transpose$2,
15886invert: invert$5,
15887adjoint: adjoint$2,
15888determinant: determinant$3,
15889multiply: multiply$8,
15890rotate: rotate$4,
15891scale: scale$8,
15892fromRotation: fromRotation$4,
15893fromScaling: fromScaling$3,
15894str: str$8,
15895frob: frob$3,
15896LDU: LDU,
15897add: add$8,
15898subtract: subtract$6,
15899exactEquals: exactEquals$8,
15900equals: equals$9,
15901multiplyScalar: multiplyScalar$3,
15902multiplyScalarAndAdd: multiplyScalarAndAdd$3,
15903mul: mul$8,
15904sub: sub$6
15905});
15906
15907/**
15908 * 2x3 Matrix
15909 * @module mat2d
15910 * @description
15911 * A mat2d contains six elements defined as:
15912 * <pre>
15913 * [a, b,
15914 * c, d,
15915 * tx, ty]
15916 * </pre>
15917 * This is a short form for the 3x3 matrix:
15918 * <pre>
15919 * [a, b, 0,
15920 * c, d, 0,
15921 * tx, ty, 1]
15922 * </pre>
15923 * The last column is ignored so the array is shorter and operations are faster.
15924 */
15925
15926/**
15927 * Creates a new identity mat2d
15928 *
15929 * @returns {mat2d} a new 2x3 matrix
15930 */
15931
15932function create$7() {
15933 var out = new ARRAY_TYPE(6);
15934
15935 if (ARRAY_TYPE != Float32Array) {
15936 out[1] = 0;
15937 out[2] = 0;
15938 out[4] = 0;
15939 out[5] = 0;
15940 }
15941
15942 out[0] = 1;
15943 out[3] = 1;
15944 return out;
15945}
15946/**
15947 * Creates a new mat2d initialized with values from an existing matrix
15948 *
15949 * @param {ReadonlyMat2d} a matrix to clone
15950 * @returns {mat2d} a new 2x3 matrix
15951 */
15952
15953function clone$7(a) {
15954 var out = new ARRAY_TYPE(6);
15955 out[0] = a[0];
15956 out[1] = a[1];
15957 out[2] = a[2];
15958 out[3] = a[3];
15959 out[4] = a[4];
15960 out[5] = a[5];
15961 return out;
15962}
15963/**
15964 * Copy the values from one mat2d to another
15965 *
15966 * @param {mat2d} out the receiving matrix
15967 * @param {ReadonlyMat2d} a the source matrix
15968 * @returns {mat2d} out
15969 */
15970
15971function copy$7(out, a) {
15972 out[0] = a[0];
15973 out[1] = a[1];
15974 out[2] = a[2];
15975 out[3] = a[3];
15976 out[4] = a[4];
15977 out[5] = a[5];
15978 return out;
15979}
15980/**
15981 * Set a mat2d to the identity matrix
15982 *
15983 * @param {mat2d} out the receiving matrix
15984 * @returns {mat2d} out
15985 */
15986
15987function identity$4(out) {
15988 out[0] = 1;
15989 out[1] = 0;
15990 out[2] = 0;
15991 out[3] = 1;
15992 out[4] = 0;
15993 out[5] = 0;
15994 return out;
15995}
15996/**
15997 * Create a new mat2d with the given values
15998 *
15999 * @param {Number} a Component A (index 0)
16000 * @param {Number} b Component B (index 1)
16001 * @param {Number} c Component C (index 2)
16002 * @param {Number} d Component D (index 3)
16003 * @param {Number} tx Component TX (index 4)
16004 * @param {Number} ty Component TY (index 5)
16005 * @returns {mat2d} A new mat2d
16006 */
16007
16008function fromValues$7(a, b, c, d, tx, ty) {
16009 var out = new ARRAY_TYPE(6);
16010 out[0] = a;
16011 out[1] = b;
16012 out[2] = c;
16013 out[3] = d;
16014 out[4] = tx;
16015 out[5] = ty;
16016 return out;
16017}
16018/**
16019 * Set the components of a mat2d to the given values
16020 *
16021 * @param {mat2d} out the receiving matrix
16022 * @param {Number} a Component A (index 0)
16023 * @param {Number} b Component B (index 1)
16024 * @param {Number} c Component C (index 2)
16025 * @param {Number} d Component D (index 3)
16026 * @param {Number} tx Component TX (index 4)
16027 * @param {Number} ty Component TY (index 5)
16028 * @returns {mat2d} out
16029 */
16030
16031function set$7(out, a, b, c, d, tx, ty) {
16032 out[0] = a;
16033 out[1] = b;
16034 out[2] = c;
16035 out[3] = d;
16036 out[4] = tx;
16037 out[5] = ty;
16038 return out;
16039}
16040/**
16041 * Inverts a mat2d
16042 *
16043 * @param {mat2d} out the receiving matrix
16044 * @param {ReadonlyMat2d} a the source matrix
16045 * @returns {mat2d} out
16046 */
16047
16048function invert$4(out, a) {
16049 var aa = a[0],
16050 ab = a[1],
16051 ac = a[2],
16052 ad = a[3];
16053 var atx = a[4],
16054 aty = a[5];
16055 var det = aa * ad - ab * ac;
16056
16057 if (!det) {
16058 return null;
16059 }
16060
16061 det = 1.0 / det;
16062 out[0] = ad * det;
16063 out[1] = -ab * det;
16064 out[2] = -ac * det;
16065 out[3] = aa * det;
16066 out[4] = (ac * aty - ad * atx) * det;
16067 out[5] = (ab * atx - aa * aty) * det;
16068 return out;
16069}
16070/**
16071 * Calculates the determinant of a mat2d
16072 *
16073 * @param {ReadonlyMat2d} a the source matrix
16074 * @returns {Number} determinant of a
16075 */
16076
16077function determinant$2(a) {
16078 return a[0] * a[3] - a[1] * a[2];
16079}
16080/**
16081 * Multiplies two mat2d's
16082 *
16083 * @param {mat2d} out the receiving matrix
16084 * @param {ReadonlyMat2d} a the first operand
16085 * @param {ReadonlyMat2d} b the second operand
16086 * @returns {mat2d} out
16087 */
16088
16089function multiply$7(out, a, b) {
16090 var a0 = a[0],
16091 a1 = a[1],
16092 a2 = a[2],
16093 a3 = a[3],
16094 a4 = a[4],
16095 a5 = a[5];
16096 var b0 = b[0],
16097 b1 = b[1],
16098 b2 = b[2],
16099 b3 = b[3],
16100 b4 = b[4],
16101 b5 = b[5];
16102 out[0] = a0 * b0 + a2 * b1;
16103 out[1] = a1 * b0 + a3 * b1;
16104 out[2] = a0 * b2 + a2 * b3;
16105 out[3] = a1 * b2 + a3 * b3;
16106 out[4] = a0 * b4 + a2 * b5 + a4;
16107 out[5] = a1 * b4 + a3 * b5 + a5;
16108 return out;
16109}
16110/**
16111 * Rotates a mat2d by the given angle
16112 *
16113 * @param {mat2d} out the receiving matrix
16114 * @param {ReadonlyMat2d} a the matrix to rotate
16115 * @param {Number} rad the angle to rotate the matrix by
16116 * @returns {mat2d} out
16117 */
16118
16119function rotate$3(out, a, rad) {
16120 var a0 = a[0],
16121 a1 = a[1],
16122 a2 = a[2],
16123 a3 = a[3],
16124 a4 = a[4],
16125 a5 = a[5];
16126 var s = Math.sin(rad);
16127 var c = Math.cos(rad);
16128 out[0] = a0 * c + a2 * s;
16129 out[1] = a1 * c + a3 * s;
16130 out[2] = a0 * -s + a2 * c;
16131 out[3] = a1 * -s + a3 * c;
16132 out[4] = a4;
16133 out[5] = a5;
16134 return out;
16135}
16136/**
16137 * Scales the mat2d by the dimensions in the given vec2
16138 *
16139 * @param {mat2d} out the receiving matrix
16140 * @param {ReadonlyMat2d} a the matrix to translate
16141 * @param {ReadonlyVec2} v the vec2 to scale the matrix by
16142 * @returns {mat2d} out
16143 **/
16144
16145function scale$7(out, a, v) {
16146 var a0 = a[0],
16147 a1 = a[1],
16148 a2 = a[2],
16149 a3 = a[3],
16150 a4 = a[4],
16151 a5 = a[5];
16152 var v0 = v[0],
16153 v1 = v[1];
16154 out[0] = a0 * v0;
16155 out[1] = a1 * v0;
16156 out[2] = a2 * v1;
16157 out[3] = a3 * v1;
16158 out[4] = a4;
16159 out[5] = a5;
16160 return out;
16161}
16162/**
16163 * Translates the mat2d by the dimensions in the given vec2
16164 *
16165 * @param {mat2d} out the receiving matrix
16166 * @param {ReadonlyMat2d} a the matrix to translate
16167 * @param {ReadonlyVec2} v the vec2 to translate the matrix by
16168 * @returns {mat2d} out
16169 **/
16170
16171function translate$3(out, a, v) {
16172 var a0 = a[0],
16173 a1 = a[1],
16174 a2 = a[2],
16175 a3 = a[3],
16176 a4 = a[4],
16177 a5 = a[5];
16178 var v0 = v[0],
16179 v1 = v[1];
16180 out[0] = a0;
16181 out[1] = a1;
16182 out[2] = a2;
16183 out[3] = a3;
16184 out[4] = a0 * v0 + a2 * v1 + a4;
16185 out[5] = a1 * v0 + a3 * v1 + a5;
16186 return out;
16187}
16188/**
16189 * Creates a matrix from a given angle
16190 * This is equivalent to (but much faster than):
16191 *
16192 * mat2d.identity(dest);
16193 * mat2d.rotate(dest, dest, rad);
16194 *
16195 * @param {mat2d} out mat2d receiving operation result
16196 * @param {Number} rad the angle to rotate the matrix by
16197 * @returns {mat2d} out
16198 */
16199
16200function fromRotation$3(out, rad) {
16201 var s = Math.sin(rad),
16202 c = Math.cos(rad);
16203 out[0] = c;
16204 out[1] = s;
16205 out[2] = -s;
16206 out[3] = c;
16207 out[4] = 0;
16208 out[5] = 0;
16209 return out;
16210}
16211/**
16212 * Creates a matrix from a vector scaling
16213 * This is equivalent to (but much faster than):
16214 *
16215 * mat2d.identity(dest);
16216 * mat2d.scale(dest, dest, vec);
16217 *
16218 * @param {mat2d} out mat2d receiving operation result
16219 * @param {ReadonlyVec2} v Scaling vector
16220 * @returns {mat2d} out
16221 */
16222
16223function fromScaling$2(out, v) {
16224 out[0] = v[0];
16225 out[1] = 0;
16226 out[2] = 0;
16227 out[3] = v[1];
16228 out[4] = 0;
16229 out[5] = 0;
16230 return out;
16231}
16232/**
16233 * Creates a matrix from a vector translation
16234 * This is equivalent to (but much faster than):
16235 *
16236 * mat2d.identity(dest);
16237 * mat2d.translate(dest, dest, vec);
16238 *
16239 * @param {mat2d} out mat2d receiving operation result
16240 * @param {ReadonlyVec2} v Translation vector
16241 * @returns {mat2d} out
16242 */
16243
16244function fromTranslation$3(out, v) {
16245 out[0] = 1;
16246 out[1] = 0;
16247 out[2] = 0;
16248 out[3] = 1;
16249 out[4] = v[0];
16250 out[5] = v[1];
16251 return out;
16252}
16253/**
16254 * Returns a string representation of a mat2d
16255 *
16256 * @param {ReadonlyMat2d} a matrix to represent as a string
16257 * @returns {String} string representation of the matrix
16258 */
16259
16260function str$7(a) {
16261 return "mat2d(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ")";
16262}
16263/**
16264 * Returns Frobenius norm of a mat2d
16265 *
16266 * @param {ReadonlyMat2d} a the matrix to calculate Frobenius norm of
16267 * @returns {Number} Frobenius norm
16268 */
16269
16270function frob$2(a) {
16271 return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1);
16272}
16273/**
16274 * Adds two mat2d's
16275 *
16276 * @param {mat2d} out the receiving matrix
16277 * @param {ReadonlyMat2d} a the first operand
16278 * @param {ReadonlyMat2d} b the second operand
16279 * @returns {mat2d} out
16280 */
16281
16282function add$7(out, a, b) {
16283 out[0] = a[0] + b[0];
16284 out[1] = a[1] + b[1];
16285 out[2] = a[2] + b[2];
16286 out[3] = a[3] + b[3];
16287 out[4] = a[4] + b[4];
16288 out[5] = a[5] + b[5];
16289 return out;
16290}
16291/**
16292 * Subtracts matrix b from matrix a
16293 *
16294 * @param {mat2d} out the receiving matrix
16295 * @param {ReadonlyMat2d} a the first operand
16296 * @param {ReadonlyMat2d} b the second operand
16297 * @returns {mat2d} out
16298 */
16299
16300function subtract$5(out, a, b) {
16301 out[0] = a[0] - b[0];
16302 out[1] = a[1] - b[1];
16303 out[2] = a[2] - b[2];
16304 out[3] = a[3] - b[3];
16305 out[4] = a[4] - b[4];
16306 out[5] = a[5] - b[5];
16307 return out;
16308}
16309/**
16310 * Multiply each element of the matrix by a scalar.
16311 *
16312 * @param {mat2d} out the receiving matrix
16313 * @param {ReadonlyMat2d} a the matrix to scale
16314 * @param {Number} b amount to scale the matrix's elements by
16315 * @returns {mat2d} out
16316 */
16317
16318function multiplyScalar$2(out, a, b) {
16319 out[0] = a[0] * b;
16320 out[1] = a[1] * b;
16321 out[2] = a[2] * b;
16322 out[3] = a[3] * b;
16323 out[4] = a[4] * b;
16324 out[5] = a[5] * b;
16325 return out;
16326}
16327/**
16328 * Adds two mat2d's after multiplying each element of the second operand by a scalar value.
16329 *
16330 * @param {mat2d} out the receiving vector
16331 * @param {ReadonlyMat2d} a the first operand
16332 * @param {ReadonlyMat2d} b the second operand
16333 * @param {Number} scale the amount to scale b's elements by before adding
16334 * @returns {mat2d} out
16335 */
16336
16337function multiplyScalarAndAdd$2(out, a, b, scale) {
16338 out[0] = a[0] + b[0] * scale;
16339 out[1] = a[1] + b[1] * scale;
16340 out[2] = a[2] + b[2] * scale;
16341 out[3] = a[3] + b[3] * scale;
16342 out[4] = a[4] + b[4] * scale;
16343 out[5] = a[5] + b[5] * scale;
16344 return out;
16345}
16346/**
16347 * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
16348 *
16349 * @param {ReadonlyMat2d} a The first matrix.
16350 * @param {ReadonlyMat2d} b The second matrix.
16351 * @returns {Boolean} True if the matrices are equal, false otherwise.
16352 */
16353
16354function exactEquals$7(a, b) {
16355 return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];
16356}
16357/**
16358 * Returns whether or not the matrices have approximately the same elements in the same position.
16359 *
16360 * @param {ReadonlyMat2d} a The first matrix.
16361 * @param {ReadonlyMat2d} b The second matrix.
16362 * @returns {Boolean} True if the matrices are equal, false otherwise.
16363 */
16364
16365function equals$8(a, b) {
16366 var a0 = a[0],
16367 a1 = a[1],
16368 a2 = a[2],
16369 a3 = a[3],
16370 a4 = a[4],
16371 a5 = a[5];
16372 var b0 = b[0],
16373 b1 = b[1],
16374 b2 = b[2],
16375 b3 = b[3],
16376 b4 = b[4],
16377 b5 = b[5];
16378 return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5));
16379}
16380/**
16381 * Alias for {@link mat2d.multiply}
16382 * @function
16383 */
16384
16385var mul$7 = multiply$7;
16386/**
16387 * Alias for {@link mat2d.subtract}
16388 * @function
16389 */
16390
16391var sub$5 = subtract$5;
16392
16393var mat2d = /*#__PURE__*/Object.freeze({
16394__proto__: null,
16395create: create$7,
16396clone: clone$7,
16397copy: copy$7,
16398identity: identity$4,
16399fromValues: fromValues$7,
16400set: set$7,
16401invert: invert$4,
16402determinant: determinant$2,
16403multiply: multiply$7,
16404rotate: rotate$3,
16405scale: scale$7,
16406translate: translate$3,
16407fromRotation: fromRotation$3,
16408fromScaling: fromScaling$2,
16409fromTranslation: fromTranslation$3,
16410str: str$7,
16411frob: frob$2,
16412add: add$7,
16413subtract: subtract$5,
16414multiplyScalar: multiplyScalar$2,
16415multiplyScalarAndAdd: multiplyScalarAndAdd$2,
16416exactEquals: exactEquals$7,
16417equals: equals$8,
16418mul: mul$7,
16419sub: sub$5
16420});
16421
16422/**
16423 * 3x3 Matrix
16424 * @module mat3
16425 */
16426
16427/**
16428 * Creates a new identity mat3
16429 *
16430 * @returns {mat3} a new 3x3 matrix
16431 */
16432
16433function create$6() {
16434 var out = new ARRAY_TYPE(9);
16435
16436 if (ARRAY_TYPE != Float32Array) {
16437 out[1] = 0;
16438 out[2] = 0;
16439 out[3] = 0;
16440 out[5] = 0;
16441 out[6] = 0;
16442 out[7] = 0;
16443 }
16444
16445 out[0] = 1;
16446 out[4] = 1;
16447 out[8] = 1;
16448 return out;
16449}
16450/**
16451 * Copies the upper-left 3x3 values into the given mat3.
16452 *
16453 * @param {mat3} out the receiving 3x3 matrix
16454 * @param {ReadonlyMat4} a the source 4x4 matrix
16455 * @returns {mat3} out
16456 */
16457
16458function fromMat4$1(out, a) {
16459 out[0] = a[0];
16460 out[1] = a[1];
16461 out[2] = a[2];
16462 out[3] = a[4];
16463 out[4] = a[5];
16464 out[5] = a[6];
16465 out[6] = a[8];
16466 out[7] = a[9];
16467 out[8] = a[10];
16468 return out;
16469}
16470/**
16471 * Creates a new mat3 initialized with values from an existing matrix
16472 *
16473 * @param {ReadonlyMat3} a matrix to clone
16474 * @returns {mat3} a new 3x3 matrix
16475 */
16476
16477function clone$6(a) {
16478 var out = new ARRAY_TYPE(9);
16479 out[0] = a[0];
16480 out[1] = a[1];
16481 out[2] = a[2];
16482 out[3] = a[3];
16483 out[4] = a[4];
16484 out[5] = a[5];
16485 out[6] = a[6];
16486 out[7] = a[7];
16487 out[8] = a[8];
16488 return out;
16489}
16490/**
16491 * Copy the values from one mat3 to another
16492 *
16493 * @param {mat3} out the receiving matrix
16494 * @param {ReadonlyMat3} a the source matrix
16495 * @returns {mat3} out
16496 */
16497
16498function copy$6(out, a) {
16499 out[0] = a[0];
16500 out[1] = a[1];
16501 out[2] = a[2];
16502 out[3] = a[3];
16503 out[4] = a[4];
16504 out[5] = a[5];
16505 out[6] = a[6];
16506 out[7] = a[7];
16507 out[8] = a[8];
16508 return out;
16509}
16510/**
16511 * Create a new mat3 with the given values
16512 *
16513 * @param {Number} m00 Component in column 0, row 0 position (index 0)
16514 * @param {Number} m01 Component in column 0, row 1 position (index 1)
16515 * @param {Number} m02 Component in column 0, row 2 position (index 2)
16516 * @param {Number} m10 Component in column 1, row 0 position (index 3)
16517 * @param {Number} m11 Component in column 1, row 1 position (index 4)
16518 * @param {Number} m12 Component in column 1, row 2 position (index 5)
16519 * @param {Number} m20 Component in column 2, row 0 position (index 6)
16520 * @param {Number} m21 Component in column 2, row 1 position (index 7)
16521 * @param {Number} m22 Component in column 2, row 2 position (index 8)
16522 * @returns {mat3} A new mat3
16523 */
16524
16525function fromValues$6(m00, m01, m02, m10, m11, m12, m20, m21, m22) {
16526 var out = new ARRAY_TYPE(9);
16527 out[0] = m00;
16528 out[1] = m01;
16529 out[2] = m02;
16530 out[3] = m10;
16531 out[4] = m11;
16532 out[5] = m12;
16533 out[6] = m20;
16534 out[7] = m21;
16535 out[8] = m22;
16536 return out;
16537}
16538/**
16539 * Set the components of a mat3 to the given values
16540 *
16541 * @param {mat3} out the receiving matrix
16542 * @param {Number} m00 Component in column 0, row 0 position (index 0)
16543 * @param {Number} m01 Component in column 0, row 1 position (index 1)
16544 * @param {Number} m02 Component in column 0, row 2 position (index 2)
16545 * @param {Number} m10 Component in column 1, row 0 position (index 3)
16546 * @param {Number} m11 Component in column 1, row 1 position (index 4)
16547 * @param {Number} m12 Component in column 1, row 2 position (index 5)
16548 * @param {Number} m20 Component in column 2, row 0 position (index 6)
16549 * @param {Number} m21 Component in column 2, row 1 position (index 7)
16550 * @param {Number} m22 Component in column 2, row 2 position (index 8)
16551 * @returns {mat3} out
16552 */
16553
16554function set$6(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {
16555 out[0] = m00;
16556 out[1] = m01;
16557 out[2] = m02;
16558 out[3] = m10;
16559 out[4] = m11;
16560 out[5] = m12;
16561 out[6] = m20;
16562 out[7] = m21;
16563 out[8] = m22;
16564 return out;
16565}
16566/**
16567 * Set a mat3 to the identity matrix
16568 *
16569 * @param {mat3} out the receiving matrix
16570 * @returns {mat3} out
16571 */
16572
16573function identity$3(out) {
16574 out[0] = 1;
16575 out[1] = 0;
16576 out[2] = 0;
16577 out[3] = 0;
16578 out[4] = 1;
16579 out[5] = 0;
16580 out[6] = 0;
16581 out[7] = 0;
16582 out[8] = 1;
16583 return out;
16584}
16585/**
16586 * Transpose the values of a mat3
16587 *
16588 * @param {mat3} out the receiving matrix
16589 * @param {ReadonlyMat3} a the source matrix
16590 * @returns {mat3} out
16591 */
16592
16593function transpose$1(out, a) {
16594 // If we are transposing ourselves we can skip a few steps but have to cache some values
16595 if (out === a) {
16596 var a01 = a[1],
16597 a02 = a[2],
16598 a12 = a[5];
16599 out[1] = a[3];
16600 out[2] = a[6];
16601 out[3] = a01;
16602 out[5] = a[7];
16603 out[6] = a02;
16604 out[7] = a12;
16605 } else {
16606 out[0] = a[0];
16607 out[1] = a[3];
16608 out[2] = a[6];
16609 out[3] = a[1];
16610 out[4] = a[4];
16611 out[5] = a[7];
16612 out[6] = a[2];
16613 out[7] = a[5];
16614 out[8] = a[8];
16615 }
16616
16617 return out;
16618}
16619/**
16620 * Inverts a mat3
16621 *
16622 * @param {mat3} out the receiving matrix
16623 * @param {ReadonlyMat3} a the source matrix
16624 * @returns {mat3} out
16625 */
16626
16627function invert$3(out, a) {
16628 var a00 = a[0],
16629 a01 = a[1],
16630 a02 = a[2];
16631 var a10 = a[3],
16632 a11 = a[4],
16633 a12 = a[5];
16634 var a20 = a[6],
16635 a21 = a[7],
16636 a22 = a[8];
16637 var b01 = a22 * a11 - a12 * a21;
16638 var b11 = -a22 * a10 + a12 * a20;
16639 var b21 = a21 * a10 - a11 * a20; // Calculate the determinant
16640
16641 var det = a00 * b01 + a01 * b11 + a02 * b21;
16642
16643 if (!det) {
16644 return null;
16645 }
16646
16647 det = 1.0 / det;
16648 out[0] = b01 * det;
16649 out[1] = (-a22 * a01 + a02 * a21) * det;
16650 out[2] = (a12 * a01 - a02 * a11) * det;
16651 out[3] = b11 * det;
16652 out[4] = (a22 * a00 - a02 * a20) * det;
16653 out[5] = (-a12 * a00 + a02 * a10) * det;
16654 out[6] = b21 * det;
16655 out[7] = (-a21 * a00 + a01 * a20) * det;
16656 out[8] = (a11 * a00 - a01 * a10) * det;
16657 return out;
16658}
16659/**
16660 * Calculates the adjugate of a mat3
16661 *
16662 * @param {mat3} out the receiving matrix
16663 * @param {ReadonlyMat3} a the source matrix
16664 * @returns {mat3} out
16665 */
16666
16667function adjoint$1(out, a) {
16668 var a00 = a[0],
16669 a01 = a[1],
16670 a02 = a[2];
16671 var a10 = a[3],
16672 a11 = a[4],
16673 a12 = a[5];
16674 var a20 = a[6],
16675 a21 = a[7],
16676 a22 = a[8];
16677 out[0] = a11 * a22 - a12 * a21;
16678 out[1] = a02 * a21 - a01 * a22;
16679 out[2] = a01 * a12 - a02 * a11;
16680 out[3] = a12 * a20 - a10 * a22;
16681 out[4] = a00 * a22 - a02 * a20;
16682 out[5] = a02 * a10 - a00 * a12;
16683 out[6] = a10 * a21 - a11 * a20;
16684 out[7] = a01 * a20 - a00 * a21;
16685 out[8] = a00 * a11 - a01 * a10;
16686 return out;
16687}
16688/**
16689 * Calculates the determinant of a mat3
16690 *
16691 * @param {ReadonlyMat3} a the source matrix
16692 * @returns {Number} determinant of a
16693 */
16694
16695function determinant$1(a) {
16696 var a00 = a[0],
16697 a01 = a[1],
16698 a02 = a[2];
16699 var a10 = a[3],
16700 a11 = a[4],
16701 a12 = a[5];
16702 var a20 = a[6],
16703 a21 = a[7],
16704 a22 = a[8];
16705 return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);
16706}
16707/**
16708 * Multiplies two mat3's
16709 *
16710 * @param {mat3} out the receiving matrix
16711 * @param {ReadonlyMat3} a the first operand
16712 * @param {ReadonlyMat3} b the second operand
16713 * @returns {mat3} out
16714 */
16715
16716function multiply$6(out, a, b) {
16717 var a00 = a[0],
16718 a01 = a[1],
16719 a02 = a[2];
16720 var a10 = a[3],
16721 a11 = a[4],
16722 a12 = a[5];
16723 var a20 = a[6],
16724 a21 = a[7],
16725 a22 = a[8];
16726 var b00 = b[0],
16727 b01 = b[1],
16728 b02 = b[2];
16729 var b10 = b[3],
16730 b11 = b[4],
16731 b12 = b[5];
16732 var b20 = b[6],
16733 b21 = b[7],
16734 b22 = b[8];
16735 out[0] = b00 * a00 + b01 * a10 + b02 * a20;
16736 out[1] = b00 * a01 + b01 * a11 + b02 * a21;
16737 out[2] = b00 * a02 + b01 * a12 + b02 * a22;
16738 out[3] = b10 * a00 + b11 * a10 + b12 * a20;
16739 out[4] = b10 * a01 + b11 * a11 + b12 * a21;
16740 out[5] = b10 * a02 + b11 * a12 + b12 * a22;
16741 out[6] = b20 * a00 + b21 * a10 + b22 * a20;
16742 out[7] = b20 * a01 + b21 * a11 + b22 * a21;
16743 out[8] = b20 * a02 + b21 * a12 + b22 * a22;
16744 return out;
16745}
16746/**
16747 * Translate a mat3 by the given vector
16748 *
16749 * @param {mat3} out the receiving matrix
16750 * @param {ReadonlyMat3} a the matrix to translate
16751 * @param {ReadonlyVec2} v vector to translate by
16752 * @returns {mat3} out
16753 */
16754
16755function translate$2(out, a, v) {
16756 var a00 = a[0],
16757 a01 = a[1],
16758 a02 = a[2],
16759 a10 = a[3],
16760 a11 = a[4],
16761 a12 = a[5],
16762 a20 = a[6],
16763 a21 = a[7],
16764 a22 = a[8],
16765 x = v[0],
16766 y = v[1];
16767 out[0] = a00;
16768 out[1] = a01;
16769 out[2] = a02;
16770 out[3] = a10;
16771 out[4] = a11;
16772 out[5] = a12;
16773 out[6] = x * a00 + y * a10 + a20;
16774 out[7] = x * a01 + y * a11 + a21;
16775 out[8] = x * a02 + y * a12 + a22;
16776 return out;
16777}
16778/**
16779 * Rotates a mat3 by the given angle
16780 *
16781 * @param {mat3} out the receiving matrix
16782 * @param {ReadonlyMat3} a the matrix to rotate
16783 * @param {Number} rad the angle to rotate the matrix by
16784 * @returns {mat3} out
16785 */
16786
16787function rotate$2(out, a, rad) {
16788 var a00 = a[0],
16789 a01 = a[1],
16790 a02 = a[2],
16791 a10 = a[3],
16792 a11 = a[4],
16793 a12 = a[5],
16794 a20 = a[6],
16795 a21 = a[7],
16796 a22 = a[8],
16797 s = Math.sin(rad),
16798 c = Math.cos(rad);
16799 out[0] = c * a00 + s * a10;
16800 out[1] = c * a01 + s * a11;
16801 out[2] = c * a02 + s * a12;
16802 out[3] = c * a10 - s * a00;
16803 out[4] = c * a11 - s * a01;
16804 out[5] = c * a12 - s * a02;
16805 out[6] = a20;
16806 out[7] = a21;
16807 out[8] = a22;
16808 return out;
16809}
16810/**
16811 * Scales the mat3 by the dimensions in the given vec2
16812 *
16813 * @param {mat3} out the receiving matrix
16814 * @param {ReadonlyMat3} a the matrix to rotate
16815 * @param {ReadonlyVec2} v the vec2 to scale the matrix by
16816 * @returns {mat3} out
16817 **/
16818
16819function scale$6(out, a, v) {
16820 var x = v[0],
16821 y = v[1];
16822 out[0] = x * a[0];
16823 out[1] = x * a[1];
16824 out[2] = x * a[2];
16825 out[3] = y * a[3];
16826 out[4] = y * a[4];
16827 out[5] = y * a[5];
16828 out[6] = a[6];
16829 out[7] = a[7];
16830 out[8] = a[8];
16831 return out;
16832}
16833/**
16834 * Creates a matrix from a vector translation
16835 * This is equivalent to (but much faster than):
16836 *
16837 * mat3.identity(dest);
16838 * mat3.translate(dest, dest, vec);
16839 *
16840 * @param {mat3} out mat3 receiving operation result
16841 * @param {ReadonlyVec2} v Translation vector
16842 * @returns {mat3} out
16843 */
16844
16845function fromTranslation$2(out, v) {
16846 out[0] = 1;
16847 out[1] = 0;
16848 out[2] = 0;
16849 out[3] = 0;
16850 out[4] = 1;
16851 out[5] = 0;
16852 out[6] = v[0];
16853 out[7] = v[1];
16854 out[8] = 1;
16855 return out;
16856}
16857/**
16858 * Creates a matrix from a given angle
16859 * This is equivalent to (but much faster than):
16860 *
16861 * mat3.identity(dest);
16862 * mat3.rotate(dest, dest, rad);
16863 *
16864 * @param {mat3} out mat3 receiving operation result
16865 * @param {Number} rad the angle to rotate the matrix by
16866 * @returns {mat3} out
16867 */
16868
16869function fromRotation$2(out, rad) {
16870 var s = Math.sin(rad),
16871 c = Math.cos(rad);
16872 out[0] = c;
16873 out[1] = s;
16874 out[2] = 0;
16875 out[3] = -s;
16876 out[4] = c;
16877 out[5] = 0;
16878 out[6] = 0;
16879 out[7] = 0;
16880 out[8] = 1;
16881 return out;
16882}
16883/**
16884 * Creates a matrix from a vector scaling
16885 * This is equivalent to (but much faster than):
16886 *
16887 * mat3.identity(dest);
16888 * mat3.scale(dest, dest, vec);
16889 *
16890 * @param {mat3} out mat3 receiving operation result
16891 * @param {ReadonlyVec2} v Scaling vector
16892 * @returns {mat3} out
16893 */
16894
16895function fromScaling$1(out, v) {
16896 out[0] = v[0];
16897 out[1] = 0;
16898 out[2] = 0;
16899 out[3] = 0;
16900 out[4] = v[1];
16901 out[5] = 0;
16902 out[6] = 0;
16903 out[7] = 0;
16904 out[8] = 1;
16905 return out;
16906}
16907/**
16908 * Copies the values from a mat2d into a mat3
16909 *
16910 * @param {mat3} out the receiving matrix
16911 * @param {ReadonlyMat2d} a the matrix to copy
16912 * @returns {mat3} out
16913 **/
16914
16915function fromMat2d(out, a) {
16916 out[0] = a[0];
16917 out[1] = a[1];
16918 out[2] = 0;
16919 out[3] = a[2];
16920 out[4] = a[3];
16921 out[5] = 0;
16922 out[6] = a[4];
16923 out[7] = a[5];
16924 out[8] = 1;
16925 return out;
16926}
16927/**
16928 * Calculates a 3x3 matrix from the given quaternion
16929 *
16930 * @param {mat3} out mat3 receiving operation result
16931 * @param {ReadonlyQuat} q Quaternion to create matrix from
16932 *
16933 * @returns {mat3} out
16934 */
16935
16936function fromQuat$1(out, q) {
16937 var x = q[0],
16938 y = q[1],
16939 z = q[2],
16940 w = q[3];
16941 var x2 = x + x;
16942 var y2 = y + y;
16943 var z2 = z + z;
16944 var xx = x * x2;
16945 var yx = y * x2;
16946 var yy = y * y2;
16947 var zx = z * x2;
16948 var zy = z * y2;
16949 var zz = z * z2;
16950 var wx = w * x2;
16951 var wy = w * y2;
16952 var wz = w * z2;
16953 out[0] = 1 - yy - zz;
16954 out[3] = yx - wz;
16955 out[6] = zx + wy;
16956 out[1] = yx + wz;
16957 out[4] = 1 - xx - zz;
16958 out[7] = zy - wx;
16959 out[2] = zx - wy;
16960 out[5] = zy + wx;
16961 out[8] = 1 - xx - yy;
16962 return out;
16963}
16964/**
16965 * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix
16966 *
16967 * @param {mat3} out mat3 receiving operation result
16968 * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from
16969 *
16970 * @returns {mat3} out
16971 */
16972
16973function normalFromMat4(out, a) {
16974 var a00 = a[0],
16975 a01 = a[1],
16976 a02 = a[2],
16977 a03 = a[3];
16978 var a10 = a[4],
16979 a11 = a[5],
16980 a12 = a[6],
16981 a13 = a[7];
16982 var a20 = a[8],
16983 a21 = a[9],
16984 a22 = a[10],
16985 a23 = a[11];
16986 var a30 = a[12],
16987 a31 = a[13],
16988 a32 = a[14],
16989 a33 = a[15];
16990 var b00 = a00 * a11 - a01 * a10;
16991 var b01 = a00 * a12 - a02 * a10;
16992 var b02 = a00 * a13 - a03 * a10;
16993 var b03 = a01 * a12 - a02 * a11;
16994 var b04 = a01 * a13 - a03 * a11;
16995 var b05 = a02 * a13 - a03 * a12;
16996 var b06 = a20 * a31 - a21 * a30;
16997 var b07 = a20 * a32 - a22 * a30;
16998 var b08 = a20 * a33 - a23 * a30;
16999 var b09 = a21 * a32 - a22 * a31;
17000 var b10 = a21 * a33 - a23 * a31;
17001 var b11 = a22 * a33 - a23 * a32; // Calculate the determinant
17002
17003 var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
17004
17005 if (!det) {
17006 return null;
17007 }
17008
17009 det = 1.0 / det;
17010 out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
17011 out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
17012 out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
17013 out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
17014 out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
17015 out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
17016 out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
17017 out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
17018 out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
17019 return out;
17020}
17021/**
17022 * Generates a 2D projection matrix with the given bounds
17023 *
17024 * @param {mat3} out mat3 frustum matrix will be written into
17025 * @param {number} width Width of your gl context
17026 * @param {number} height Height of gl context
17027 * @returns {mat3} out
17028 */
17029
17030function projection(out, width, height) {
17031 out[0] = 2 / width;
17032 out[1] = 0;
17033 out[2] = 0;
17034 out[3] = 0;
17035 out[4] = -2 / height;
17036 out[5] = 0;
17037 out[6] = -1;
17038 out[7] = 1;
17039 out[8] = 1;
17040 return out;
17041}
17042/**
17043 * Returns a string representation of a mat3
17044 *
17045 * @param {ReadonlyMat3} a matrix to represent as a string
17046 * @returns {String} string representation of the matrix
17047 */
17048
17049function str$6(a) {
17050 return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")";
17051}
17052/**
17053 * Returns Frobenius norm of a mat3
17054 *
17055 * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of
17056 * @returns {Number} Frobenius norm
17057 */
17058
17059function frob$1(a) {
17060 return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);
17061}
17062/**
17063 * Adds two mat3's
17064 *
17065 * @param {mat3} out the receiving matrix
17066 * @param {ReadonlyMat3} a the first operand
17067 * @param {ReadonlyMat3} b the second operand
17068 * @returns {mat3} out
17069 */
17070
17071function add$6(out, a, b) {
17072 out[0] = a[0] + b[0];
17073 out[1] = a[1] + b[1];
17074 out[2] = a[2] + b[2];
17075 out[3] = a[3] + b[3];
17076 out[4] = a[4] + b[4];
17077 out[5] = a[5] + b[5];
17078 out[6] = a[6] + b[6];
17079 out[7] = a[7] + b[7];
17080 out[8] = a[8] + b[8];
17081 return out;
17082}
17083/**
17084 * Subtracts matrix b from matrix a
17085 *
17086 * @param {mat3} out the receiving matrix
17087 * @param {ReadonlyMat3} a the first operand
17088 * @param {ReadonlyMat3} b the second operand
17089 * @returns {mat3} out
17090 */
17091
17092function subtract$4(out, a, b) {
17093 out[0] = a[0] - b[0];
17094 out[1] = a[1] - b[1];
17095 out[2] = a[2] - b[2];
17096 out[3] = a[3] - b[3];
17097 out[4] = a[4] - b[4];
17098 out[5] = a[5] - b[5];
17099 out[6] = a[6] - b[6];
17100 out[7] = a[7] - b[7];
17101 out[8] = a[8] - b[8];
17102 return out;
17103}
17104/**
17105 * Multiply each element of the matrix by a scalar.
17106 *
17107 * @param {mat3} out the receiving matrix
17108 * @param {ReadonlyMat3} a the matrix to scale
17109 * @param {Number} b amount to scale the matrix's elements by
17110 * @returns {mat3} out
17111 */
17112
17113function multiplyScalar$1(out, a, b) {
17114 out[0] = a[0] * b;
17115 out[1] = a[1] * b;
17116 out[2] = a[2] * b;
17117 out[3] = a[3] * b;
17118 out[4] = a[4] * b;
17119 out[5] = a[5] * b;
17120 out[6] = a[6] * b;
17121 out[7] = a[7] * b;
17122 out[8] = a[8] * b;
17123 return out;
17124}
17125/**
17126 * Adds two mat3's after multiplying each element of the second operand by a scalar value.
17127 *
17128 * @param {mat3} out the receiving vector
17129 * @param {ReadonlyMat3} a the first operand
17130 * @param {ReadonlyMat3} b the second operand
17131 * @param {Number} scale the amount to scale b's elements by before adding
17132 * @returns {mat3} out
17133 */
17134
17135function multiplyScalarAndAdd$1(out, a, b, scale) {
17136 out[0] = a[0] + b[0] * scale;
17137 out[1] = a[1] + b[1] * scale;
17138 out[2] = a[2] + b[2] * scale;
17139 out[3] = a[3] + b[3] * scale;
17140 out[4] = a[4] + b[4] * scale;
17141 out[5] = a[5] + b[5] * scale;
17142 out[6] = a[6] + b[6] * scale;
17143 out[7] = a[7] + b[7] * scale;
17144 out[8] = a[8] + b[8] * scale;
17145 return out;
17146}
17147/**
17148 * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
17149 *
17150 * @param {ReadonlyMat3} a The first matrix.
17151 * @param {ReadonlyMat3} b The second matrix.
17152 * @returns {Boolean} True if the matrices are equal, false otherwise.
17153 */
17154
17155function exactEquals$6(a, b) {
17156 return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];
17157}
17158/**
17159 * Returns whether or not the matrices have approximately the same elements in the same position.
17160 *
17161 * @param {ReadonlyMat3} a The first matrix.
17162 * @param {ReadonlyMat3} b The second matrix.
17163 * @returns {Boolean} True if the matrices are equal, false otherwise.
17164 */
17165
17166function equals$7(a, b) {
17167 var a0 = a[0],
17168 a1 = a[1],
17169 a2 = a[2],
17170 a3 = a[3],
17171 a4 = a[4],
17172 a5 = a[5],
17173 a6 = a[6],
17174 a7 = a[7],
17175 a8 = a[8];
17176 var b0 = b[0],
17177 b1 = b[1],
17178 b2 = b[2],
17179 b3 = b[3],
17180 b4 = b[4],
17181 b5 = b[5],
17182 b6 = b[6],
17183 b7 = b[7],
17184 b8 = b[8];
17185 return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));
17186}
17187/**
17188 * Alias for {@link mat3.multiply}
17189 * @function
17190 */
17191
17192var mul$6 = multiply$6;
17193/**
17194 * Alias for {@link mat3.subtract}
17195 * @function
17196 */
17197
17198var sub$4 = subtract$4;
17199
17200var mat3 = /*#__PURE__*/Object.freeze({
17201__proto__: null,
17202create: create$6,
17203fromMat4: fromMat4$1,
17204clone: clone$6,
17205copy: copy$6,
17206fromValues: fromValues$6,
17207set: set$6,
17208identity: identity$3,
17209transpose: transpose$1,
17210invert: invert$3,
17211adjoint: adjoint$1,
17212determinant: determinant$1,
17213multiply: multiply$6,
17214translate: translate$2,
17215rotate: rotate$2,
17216scale: scale$6,
17217fromTranslation: fromTranslation$2,
17218fromRotation: fromRotation$2,
17219fromScaling: fromScaling$1,
17220fromMat2d: fromMat2d,
17221fromQuat: fromQuat$1,
17222normalFromMat4: normalFromMat4,
17223projection: projection,
17224str: str$6,
17225frob: frob$1,
17226add: add$6,
17227subtract: subtract$4,
17228multiplyScalar: multiplyScalar$1,
17229multiplyScalarAndAdd: multiplyScalarAndAdd$1,
17230exactEquals: exactEquals$6,
17231equals: equals$7,
17232mul: mul$6,
17233sub: sub$4
17234});
17235
17236/**
17237 * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.
17238 * @module mat4
17239 */
17240
17241/**
17242 * Creates a new identity mat4
17243 *
17244 * @returns {mat4} a new 4x4 matrix
17245 */
17246
17247function create$5() {
17248 var out = new ARRAY_TYPE(16);
17249
17250 if (ARRAY_TYPE != Float32Array) {
17251 out[1] = 0;
17252 out[2] = 0;
17253 out[3] = 0;
17254 out[4] = 0;
17255 out[6] = 0;
17256 out[7] = 0;
17257 out[8] = 0;
17258 out[9] = 0;
17259 out[11] = 0;
17260 out[12] = 0;
17261 out[13] = 0;
17262 out[14] = 0;
17263 }
17264
17265 out[0] = 1;
17266 out[5] = 1;
17267 out[10] = 1;
17268 out[15] = 1;
17269 return out;
17270}
17271/**
17272 * Creates a new mat4 initialized with values from an existing matrix
17273 *
17274 * @param {ReadonlyMat4} a matrix to clone
17275 * @returns {mat4} a new 4x4 matrix
17276 */
17277
17278function clone$5(a) {
17279 var out = new ARRAY_TYPE(16);
17280 out[0] = a[0];
17281 out[1] = a[1];
17282 out[2] = a[2];
17283 out[3] = a[3];
17284 out[4] = a[4];
17285 out[5] = a[5];
17286 out[6] = a[6];
17287 out[7] = a[7];
17288 out[8] = a[8];
17289 out[9] = a[9];
17290 out[10] = a[10];
17291 out[11] = a[11];
17292 out[12] = a[12];
17293 out[13] = a[13];
17294 out[14] = a[14];
17295 out[15] = a[15];
17296 return out;
17297}
17298/**
17299 * Copy the values from one mat4 to another
17300 *
17301 * @param {mat4} out the receiving matrix
17302 * @param {ReadonlyMat4} a the source matrix
17303 * @returns {mat4} out
17304 */
17305
17306function copy$5(out, a) {
17307 out[0] = a[0];
17308 out[1] = a[1];
17309 out[2] = a[2];
17310 out[3] = a[3];
17311 out[4] = a[4];
17312 out[5] = a[5];
17313 out[6] = a[6];
17314 out[7] = a[7];
17315 out[8] = a[8];
17316 out[9] = a[9];
17317 out[10] = a[10];
17318 out[11] = a[11];
17319 out[12] = a[12];
17320 out[13] = a[13];
17321 out[14] = a[14];
17322 out[15] = a[15];
17323 return out;
17324}
17325/**
17326 * Create a new mat4 with the given values
17327 *
17328 * @param {Number} m00 Component in column 0, row 0 position (index 0)
17329 * @param {Number} m01 Component in column 0, row 1 position (index 1)
17330 * @param {Number} m02 Component in column 0, row 2 position (index 2)
17331 * @param {Number} m03 Component in column 0, row 3 position (index 3)
17332 * @param {Number} m10 Component in column 1, row 0 position (index 4)
17333 * @param {Number} m11 Component in column 1, row 1 position (index 5)
17334 * @param {Number} m12 Component in column 1, row 2 position (index 6)
17335 * @param {Number} m13 Component in column 1, row 3 position (index 7)
17336 * @param {Number} m20 Component in column 2, row 0 position (index 8)
17337 * @param {Number} m21 Component in column 2, row 1 position (index 9)
17338 * @param {Number} m22 Component in column 2, row 2 position (index 10)
17339 * @param {Number} m23 Component in column 2, row 3 position (index 11)
17340 * @param {Number} m30 Component in column 3, row 0 position (index 12)
17341 * @param {Number} m31 Component in column 3, row 1 position (index 13)
17342 * @param {Number} m32 Component in column 3, row 2 position (index 14)
17343 * @param {Number} m33 Component in column 3, row 3 position (index 15)
17344 * @returns {mat4} A new mat4
17345 */
17346
17347function fromValues$5(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
17348 var out = new ARRAY_TYPE(16);
17349 out[0] = m00;
17350 out[1] = m01;
17351 out[2] = m02;
17352 out[3] = m03;
17353 out[4] = m10;
17354 out[5] = m11;
17355 out[6] = m12;
17356 out[7] = m13;
17357 out[8] = m20;
17358 out[9] = m21;
17359 out[10] = m22;
17360 out[11] = m23;
17361 out[12] = m30;
17362 out[13] = m31;
17363 out[14] = m32;
17364 out[15] = m33;
17365 return out;
17366}
17367/**
17368 * Set the components of a mat4 to the given values
17369 *
17370 * @param {mat4} out the receiving matrix
17371 * @param {Number} m00 Component in column 0, row 0 position (index 0)
17372 * @param {Number} m01 Component in column 0, row 1 position (index 1)
17373 * @param {Number} m02 Component in column 0, row 2 position (index 2)
17374 * @param {Number} m03 Component in column 0, row 3 position (index 3)
17375 * @param {Number} m10 Component in column 1, row 0 position (index 4)
17376 * @param {Number} m11 Component in column 1, row 1 position (index 5)
17377 * @param {Number} m12 Component in column 1, row 2 position (index 6)
17378 * @param {Number} m13 Component in column 1, row 3 position (index 7)
17379 * @param {Number} m20 Component in column 2, row 0 position (index 8)
17380 * @param {Number} m21 Component in column 2, row 1 position (index 9)
17381 * @param {Number} m22 Component in column 2, row 2 position (index 10)
17382 * @param {Number} m23 Component in column 2, row 3 position (index 11)
17383 * @param {Number} m30 Component in column 3, row 0 position (index 12)
17384 * @param {Number} m31 Component in column 3, row 1 position (index 13)
17385 * @param {Number} m32 Component in column 3, row 2 position (index 14)
17386 * @param {Number} m33 Component in column 3, row 3 position (index 15)
17387 * @returns {mat4} out
17388 */
17389
17390function set$5(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
17391 out[0] = m00;
17392 out[1] = m01;
17393 out[2] = m02;
17394 out[3] = m03;
17395 out[4] = m10;
17396 out[5] = m11;
17397 out[6] = m12;
17398 out[7] = m13;
17399 out[8] = m20;
17400 out[9] = m21;
17401 out[10] = m22;
17402 out[11] = m23;
17403 out[12] = m30;
17404 out[13] = m31;
17405 out[14] = m32;
17406 out[15] = m33;
17407 return out;
17408}
17409/**
17410 * Set a mat4 to the identity matrix
17411 *
17412 * @param {mat4} out the receiving matrix
17413 * @returns {mat4} out
17414 */
17415
17416function identity$2(out) {
17417 out[0] = 1;
17418 out[1] = 0;
17419 out[2] = 0;
17420 out[3] = 0;
17421 out[4] = 0;
17422 out[5] = 1;
17423 out[6] = 0;
17424 out[7] = 0;
17425 out[8] = 0;
17426 out[9] = 0;
17427 out[10] = 1;
17428 out[11] = 0;
17429 out[12] = 0;
17430 out[13] = 0;
17431 out[14] = 0;
17432 out[15] = 1;
17433 return out;
17434}
17435/**
17436 * Transpose the values of a mat4
17437 *
17438 * @param {mat4} out the receiving matrix
17439 * @param {ReadonlyMat4} a the source matrix
17440 * @returns {mat4} out
17441 */
17442
17443function transpose(out, a) {
17444 // If we are transposing ourselves we can skip a few steps but have to cache some values
17445 if (out === a) {
17446 var a01 = a[1],
17447 a02 = a[2],
17448 a03 = a[3];
17449 var a12 = a[6],
17450 a13 = a[7];
17451 var a23 = a[11];
17452 out[1] = a[4];
17453 out[2] = a[8];
17454 out[3] = a[12];
17455 out[4] = a01;
17456 out[6] = a[9];
17457 out[7] = a[13];
17458 out[8] = a02;
17459 out[9] = a12;
17460 out[11] = a[14];
17461 out[12] = a03;
17462 out[13] = a13;
17463 out[14] = a23;
17464 } else {
17465 out[0] = a[0];
17466 out[1] = a[4];
17467 out[2] = a[8];
17468 out[3] = a[12];
17469 out[4] = a[1];
17470 out[5] = a[5];
17471 out[6] = a[9];
17472 out[7] = a[13];
17473 out[8] = a[2];
17474 out[9] = a[6];
17475 out[10] = a[10];
17476 out[11] = a[14];
17477 out[12] = a[3];
17478 out[13] = a[7];
17479 out[14] = a[11];
17480 out[15] = a[15];
17481 }
17482
17483 return out;
17484}
17485/**
17486 * Inverts a mat4
17487 *
17488 * @param {mat4} out the receiving matrix
17489 * @param {ReadonlyMat4} a the source matrix
17490 * @returns {mat4} out
17491 */
17492
17493function invert$2(out, a) {
17494 var a00 = a[0],
17495 a01 = a[1],
17496 a02 = a[2],
17497 a03 = a[3];
17498 var a10 = a[4],
17499 a11 = a[5],
17500 a12 = a[6],
17501 a13 = a[7];
17502 var a20 = a[8],
17503 a21 = a[9],
17504 a22 = a[10],
17505 a23 = a[11];
17506 var a30 = a[12],
17507 a31 = a[13],
17508 a32 = a[14],
17509 a33 = a[15];
17510 var b00 = a00 * a11 - a01 * a10;
17511 var b01 = a00 * a12 - a02 * a10;
17512 var b02 = a00 * a13 - a03 * a10;
17513 var b03 = a01 * a12 - a02 * a11;
17514 var b04 = a01 * a13 - a03 * a11;
17515 var b05 = a02 * a13 - a03 * a12;
17516 var b06 = a20 * a31 - a21 * a30;
17517 var b07 = a20 * a32 - a22 * a30;
17518 var b08 = a20 * a33 - a23 * a30;
17519 var b09 = a21 * a32 - a22 * a31;
17520 var b10 = a21 * a33 - a23 * a31;
17521 var b11 = a22 * a33 - a23 * a32; // Calculate the determinant
17522
17523 var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
17524
17525 if (!det) {
17526 return null;
17527 }
17528
17529 det = 1.0 / det;
17530 out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
17531 out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
17532 out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
17533 out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
17534 out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
17535 out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
17536 out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
17537 out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
17538 out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
17539 out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
17540 out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
17541 out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
17542 out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
17543 out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
17544 out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
17545 out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
17546 return out;
17547}
17548/**
17549 * Calculates the adjugate of a mat4
17550 *
17551 * @param {mat4} out the receiving matrix
17552 * @param {ReadonlyMat4} a the source matrix
17553 * @returns {mat4} out
17554 */
17555
17556function adjoint(out, a) {
17557 var a00 = a[0],
17558 a01 = a[1],
17559 a02 = a[2],
17560 a03 = a[3];
17561 var a10 = a[4],
17562 a11 = a[5],
17563 a12 = a[6],
17564 a13 = a[7];
17565 var a20 = a[8],
17566 a21 = a[9],
17567 a22 = a[10],
17568 a23 = a[11];
17569 var a30 = a[12],
17570 a31 = a[13],
17571 a32 = a[14],
17572 a33 = a[15];
17573 out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);
17574 out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));
17575 out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);
17576 out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));
17577 out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));
17578 out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);
17579 out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));
17580 out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);
17581 out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);
17582 out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));
17583 out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);
17584 out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));
17585 out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));
17586 out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);
17587 out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));
17588 out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);
17589 return out;
17590}
17591/**
17592 * Calculates the determinant of a mat4
17593 *
17594 * @param {ReadonlyMat4} a the source matrix
17595 * @returns {Number} determinant of a
17596 */
17597
17598function determinant(a) {
17599 var a00 = a[0],
17600 a01 = a[1],
17601 a02 = a[2],
17602 a03 = a[3];
17603 var a10 = a[4],
17604 a11 = a[5],
17605 a12 = a[6],
17606 a13 = a[7];
17607 var a20 = a[8],
17608 a21 = a[9],
17609 a22 = a[10],
17610 a23 = a[11];
17611 var a30 = a[12],
17612 a31 = a[13],
17613 a32 = a[14],
17614 a33 = a[15];
17615 var b00 = a00 * a11 - a01 * a10;
17616 var b01 = a00 * a12 - a02 * a10;
17617 var b02 = a00 * a13 - a03 * a10;
17618 var b03 = a01 * a12 - a02 * a11;
17619 var b04 = a01 * a13 - a03 * a11;
17620 var b05 = a02 * a13 - a03 * a12;
17621 var b06 = a20 * a31 - a21 * a30;
17622 var b07 = a20 * a32 - a22 * a30;
17623 var b08 = a20 * a33 - a23 * a30;
17624 var b09 = a21 * a32 - a22 * a31;
17625 var b10 = a21 * a33 - a23 * a31;
17626 var b11 = a22 * a33 - a23 * a32; // Calculate the determinant
17627
17628 return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
17629}
17630/**
17631 * Multiplies two mat4s
17632 *
17633 * @param {mat4} out the receiving matrix
17634 * @param {ReadonlyMat4} a the first operand
17635 * @param {ReadonlyMat4} b the second operand
17636 * @returns {mat4} out
17637 */
17638
17639function multiply$5(out, a, b) {
17640 var a00 = a[0],
17641 a01 = a[1],
17642 a02 = a[2],
17643 a03 = a[3];
17644 var a10 = a[4],
17645 a11 = a[5],
17646 a12 = a[6],
17647 a13 = a[7];
17648 var a20 = a[8],
17649 a21 = a[9],
17650 a22 = a[10],
17651 a23 = a[11];
17652 var a30 = a[12],
17653 a31 = a[13],
17654 a32 = a[14],
17655 a33 = a[15]; // Cache only the current line of the second matrix
17656
17657 var b0 = b[0],
17658 b1 = b[1],
17659 b2 = b[2],
17660 b3 = b[3];
17661 out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
17662 out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
17663 out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
17664 out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
17665 b0 = b[4];
17666 b1 = b[5];
17667 b2 = b[6];
17668 b3 = b[7];
17669 out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
17670 out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
17671 out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
17672 out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
17673 b0 = b[8];
17674 b1 = b[9];
17675 b2 = b[10];
17676 b3 = b[11];
17677 out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
17678 out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
17679 out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
17680 out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
17681 b0 = b[12];
17682 b1 = b[13];
17683 b2 = b[14];
17684 b3 = b[15];
17685 out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
17686 out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
17687 out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
17688 out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
17689 return out;
17690}
17691/**
17692 * Translate a mat4 by the given vector
17693 *
17694 * @param {mat4} out the receiving matrix
17695 * @param {ReadonlyMat4} a the matrix to translate
17696 * @param {ReadonlyVec3} v vector to translate by
17697 * @returns {mat4} out
17698 */
17699
17700function translate$1(out, a, v) {
17701 var x = v[0],
17702 y = v[1],
17703 z = v[2];
17704 var a00, a01, a02, a03;
17705 var a10, a11, a12, a13;
17706 var a20, a21, a22, a23;
17707
17708 if (a === out) {
17709 out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
17710 out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
17711 out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
17712 out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];
17713 } else {
17714 a00 = a[0];
17715 a01 = a[1];
17716 a02 = a[2];
17717 a03 = a[3];
17718 a10 = a[4];
17719 a11 = a[5];
17720 a12 = a[6];
17721 a13 = a[7];
17722 a20 = a[8];
17723 a21 = a[9];
17724 a22 = a[10];
17725 a23 = a[11];
17726 out[0] = a00;
17727 out[1] = a01;
17728 out[2] = a02;
17729 out[3] = a03;
17730 out[4] = a10;
17731 out[5] = a11;
17732 out[6] = a12;
17733 out[7] = a13;
17734 out[8] = a20;
17735 out[9] = a21;
17736 out[10] = a22;
17737 out[11] = a23;
17738 out[12] = a00 * x + a10 * y + a20 * z + a[12];
17739 out[13] = a01 * x + a11 * y + a21 * z + a[13];
17740 out[14] = a02 * x + a12 * y + a22 * z + a[14];
17741 out[15] = a03 * x + a13 * y + a23 * z + a[15];
17742 }
17743
17744 return out;
17745}
17746/**
17747 * Scales the mat4 by the dimensions in the given vec3 not using vectorization
17748 *
17749 * @param {mat4} out the receiving matrix
17750 * @param {ReadonlyMat4} a the matrix to scale
17751 * @param {ReadonlyVec3} v the vec3 to scale the matrix by
17752 * @returns {mat4} out
17753 **/
17754
17755function scale$5(out, a, v) {
17756 var x = v[0],
17757 y = v[1],
17758 z = v[2];
17759 out[0] = a[0] * x;
17760 out[1] = a[1] * x;
17761 out[2] = a[2] * x;
17762 out[3] = a[3] * x;
17763 out[4] = a[4] * y;
17764 out[5] = a[5] * y;
17765 out[6] = a[6] * y;
17766 out[7] = a[7] * y;
17767 out[8] = a[8] * z;
17768 out[9] = a[9] * z;
17769 out[10] = a[10] * z;
17770 out[11] = a[11] * z;
17771 out[12] = a[12];
17772 out[13] = a[13];
17773 out[14] = a[14];
17774 out[15] = a[15];
17775 return out;
17776}
17777/**
17778 * Rotates a mat4 by the given angle around the given axis
17779 *
17780 * @param {mat4} out the receiving matrix
17781 * @param {ReadonlyMat4} a the matrix to rotate
17782 * @param {Number} rad the angle to rotate the matrix by
17783 * @param {ReadonlyVec3} axis the axis to rotate around
17784 * @returns {mat4} out
17785 */
17786
17787function rotate$1(out, a, rad, axis) {
17788 var x = axis[0],
17789 y = axis[1],
17790 z = axis[2];
17791 var len = Math.hypot(x, y, z);
17792 var s, c, t;
17793 var a00, a01, a02, a03;
17794 var a10, a11, a12, a13;
17795 var a20, a21, a22, a23;
17796 var b00, b01, b02;
17797 var b10, b11, b12;
17798 var b20, b21, b22;
17799
17800 if (len < EPSILON) {
17801 return null;
17802 }
17803
17804 len = 1 / len;
17805 x *= len;
17806 y *= len;
17807 z *= len;
17808 s = Math.sin(rad);
17809 c = Math.cos(rad);
17810 t = 1 - c;
17811 a00 = a[0];
17812 a01 = a[1];
17813 a02 = a[2];
17814 a03 = a[3];
17815 a10 = a[4];
17816 a11 = a[5];
17817 a12 = a[6];
17818 a13 = a[7];
17819 a20 = a[8];
17820 a21 = a[9];
17821 a22 = a[10];
17822 a23 = a[11]; // Construct the elements of the rotation matrix
17823
17824 b00 = x * x * t + c;
17825 b01 = y * x * t + z * s;
17826 b02 = z * x * t - y * s;
17827 b10 = x * y * t - z * s;
17828 b11 = y * y * t + c;
17829 b12 = z * y * t + x * s;
17830 b20 = x * z * t + y * s;
17831 b21 = y * z * t - x * s;
17832 b22 = z * z * t + c; // Perform rotation-specific matrix multiplication
17833
17834 out[0] = a00 * b00 + a10 * b01 + a20 * b02;
17835 out[1] = a01 * b00 + a11 * b01 + a21 * b02;
17836 out[2] = a02 * b00 + a12 * b01 + a22 * b02;
17837 out[3] = a03 * b00 + a13 * b01 + a23 * b02;
17838 out[4] = a00 * b10 + a10 * b11 + a20 * b12;
17839 out[5] = a01 * b10 + a11 * b11 + a21 * b12;
17840 out[6] = a02 * b10 + a12 * b11 + a22 * b12;
17841 out[7] = a03 * b10 + a13 * b11 + a23 * b12;
17842 out[8] = a00 * b20 + a10 * b21 + a20 * b22;
17843 out[9] = a01 * b20 + a11 * b21 + a21 * b22;
17844 out[10] = a02 * b20 + a12 * b21 + a22 * b22;
17845 out[11] = a03 * b20 + a13 * b21 + a23 * b22;
17846
17847 if (a !== out) {
17848 // If the source and destination differ, copy the unchanged last row
17849 out[12] = a[12];
17850 out[13] = a[13];
17851 out[14] = a[14];
17852 out[15] = a[15];
17853 }
17854
17855 return out;
17856}
17857/**
17858 * Rotates a matrix by the given angle around the X axis
17859 *
17860 * @param {mat4} out the receiving matrix
17861 * @param {ReadonlyMat4} a the matrix to rotate
17862 * @param {Number} rad the angle to rotate the matrix by
17863 * @returns {mat4} out
17864 */
17865
17866function rotateX$3(out, a, rad) {
17867 var s = Math.sin(rad);
17868 var c = Math.cos(rad);
17869 var a10 = a[4];
17870 var a11 = a[5];
17871 var a12 = a[6];
17872 var a13 = a[7];
17873 var a20 = a[8];
17874 var a21 = a[9];
17875 var a22 = a[10];
17876 var a23 = a[11];
17877
17878 if (a !== out) {
17879 // If the source and destination differ, copy the unchanged rows
17880 out[0] = a[0];
17881 out[1] = a[1];
17882 out[2] = a[2];
17883 out[3] = a[3];
17884 out[12] = a[12];
17885 out[13] = a[13];
17886 out[14] = a[14];
17887 out[15] = a[15];
17888 } // Perform axis-specific matrix multiplication
17889
17890
17891 out[4] = a10 * c + a20 * s;
17892 out[5] = a11 * c + a21 * s;
17893 out[6] = a12 * c + a22 * s;
17894 out[7] = a13 * c + a23 * s;
17895 out[8] = a20 * c - a10 * s;
17896 out[9] = a21 * c - a11 * s;
17897 out[10] = a22 * c - a12 * s;
17898 out[11] = a23 * c - a13 * s;
17899 return out;
17900}
17901/**
17902 * Rotates a matrix by the given angle around the Y axis
17903 *
17904 * @param {mat4} out the receiving matrix
17905 * @param {ReadonlyMat4} a the matrix to rotate
17906 * @param {Number} rad the angle to rotate the matrix by
17907 * @returns {mat4} out
17908 */
17909
17910function rotateY$3(out, a, rad) {
17911 var s = Math.sin(rad);
17912 var c = Math.cos(rad);
17913 var a00 = a[0];
17914 var a01 = a[1];
17915 var a02 = a[2];
17916 var a03 = a[3];
17917 var a20 = a[8];
17918 var a21 = a[9];
17919 var a22 = a[10];
17920 var a23 = a[11];
17921
17922 if (a !== out) {
17923 // If the source and destination differ, copy the unchanged rows
17924 out[4] = a[4];
17925 out[5] = a[5];
17926 out[6] = a[6];
17927 out[7] = a[7];
17928 out[12] = a[12];
17929 out[13] = a[13];
17930 out[14] = a[14];
17931 out[15] = a[15];
17932 } // Perform axis-specific matrix multiplication
17933
17934
17935 out[0] = a00 * c - a20 * s;
17936 out[1] = a01 * c - a21 * s;
17937 out[2] = a02 * c - a22 * s;
17938 out[3] = a03 * c - a23 * s;
17939 out[8] = a00 * s + a20 * c;
17940 out[9] = a01 * s + a21 * c;
17941 out[10] = a02 * s + a22 * c;
17942 out[11] = a03 * s + a23 * c;
17943 return out;
17944}
17945/**
17946 * Rotates a matrix by the given angle around the Z axis
17947 *
17948 * @param {mat4} out the receiving matrix
17949 * @param {ReadonlyMat4} a the matrix to rotate
17950 * @param {Number} rad the angle to rotate the matrix by
17951 * @returns {mat4} out
17952 */
17953
17954function rotateZ$3(out, a, rad) {
17955 var s = Math.sin(rad);
17956 var c = Math.cos(rad);
17957 var a00 = a[0];
17958 var a01 = a[1];
17959 var a02 = a[2];
17960 var a03 = a[3];
17961 var a10 = a[4];
17962 var a11 = a[5];
17963 var a12 = a[6];
17964 var a13 = a[7];
17965
17966 if (a !== out) {
17967 // If the source and destination differ, copy the unchanged last row
17968 out[8] = a[8];
17969 out[9] = a[9];
17970 out[10] = a[10];
17971 out[11] = a[11];
17972 out[12] = a[12];
17973 out[13] = a[13];
17974 out[14] = a[14];
17975 out[15] = a[15];
17976 } // Perform axis-specific matrix multiplication
17977
17978
17979 out[0] = a00 * c + a10 * s;
17980 out[1] = a01 * c + a11 * s;
17981 out[2] = a02 * c + a12 * s;
17982 out[3] = a03 * c + a13 * s;
17983 out[4] = a10 * c - a00 * s;
17984 out[5] = a11 * c - a01 * s;
17985 out[6] = a12 * c - a02 * s;
17986 out[7] = a13 * c - a03 * s;
17987 return out;
17988}
17989/**
17990 * Creates a matrix from a vector translation
17991 * This is equivalent to (but much faster than):
17992 *
17993 * mat4.identity(dest);
17994 * mat4.translate(dest, dest, vec);
17995 *
17996 * @param {mat4} out mat4 receiving operation result
17997 * @param {ReadonlyVec3} v Translation vector
17998 * @returns {mat4} out
17999 */
18000
18001function fromTranslation$1(out, v) {
18002 out[0] = 1;
18003 out[1] = 0;
18004 out[2] = 0;
18005 out[3] = 0;
18006 out[4] = 0;
18007 out[5] = 1;
18008 out[6] = 0;
18009 out[7] = 0;
18010 out[8] = 0;
18011 out[9] = 0;
18012 out[10] = 1;
18013 out[11] = 0;
18014 out[12] = v[0];
18015 out[13] = v[1];
18016 out[14] = v[2];
18017 out[15] = 1;
18018 return out;
18019}
18020/**
18021 * Creates a matrix from a vector scaling
18022 * This is equivalent to (but much faster than):
18023 *
18024 * mat4.identity(dest);
18025 * mat4.scale(dest, dest, vec);
18026 *
18027 * @param {mat4} out mat4 receiving operation result
18028 * @param {ReadonlyVec3} v Scaling vector
18029 * @returns {mat4} out
18030 */
18031
18032function fromScaling(out, v) {
18033 out[0] = v[0];
18034 out[1] = 0;
18035 out[2] = 0;
18036 out[3] = 0;
18037 out[4] = 0;
18038 out[5] = v[1];
18039 out[6] = 0;
18040 out[7] = 0;
18041 out[8] = 0;
18042 out[9] = 0;
18043 out[10] = v[2];
18044 out[11] = 0;
18045 out[12] = 0;
18046 out[13] = 0;
18047 out[14] = 0;
18048 out[15] = 1;
18049 return out;
18050}
18051/**
18052 * Creates a matrix from a given angle around a given axis
18053 * This is equivalent to (but much faster than):
18054 *
18055 * mat4.identity(dest);
18056 * mat4.rotate(dest, dest, rad, axis);
18057 *
18058 * @param {mat4} out mat4 receiving operation result
18059 * @param {Number} rad the angle to rotate the matrix by
18060 * @param {ReadonlyVec3} axis the axis to rotate around
18061 * @returns {mat4} out
18062 */
18063
18064function fromRotation$1(out, rad, axis) {
18065 var x = axis[0],
18066 y = axis[1],
18067 z = axis[2];
18068 var len = Math.hypot(x, y, z);
18069 var s, c, t;
18070
18071 if (len < EPSILON) {
18072 return null;
18073 }
18074
18075 len = 1 / len;
18076 x *= len;
18077 y *= len;
18078 z *= len;
18079 s = Math.sin(rad);
18080 c = Math.cos(rad);
18081 t = 1 - c; // Perform rotation-specific matrix multiplication
18082
18083 out[0] = x * x * t + c;
18084 out[1] = y * x * t + z * s;
18085 out[2] = z * x * t - y * s;
18086 out[3] = 0;
18087 out[4] = x * y * t - z * s;
18088 out[5] = y * y * t + c;
18089 out[6] = z * y * t + x * s;
18090 out[7] = 0;
18091 out[8] = x * z * t + y * s;
18092 out[9] = y * z * t - x * s;
18093 out[10] = z * z * t + c;
18094 out[11] = 0;
18095 out[12] = 0;
18096 out[13] = 0;
18097 out[14] = 0;
18098 out[15] = 1;
18099 return out;
18100}
18101/**
18102 * Creates a matrix from the given angle around the X axis
18103 * This is equivalent to (but much faster than):
18104 *
18105 * mat4.identity(dest);
18106 * mat4.rotateX(dest, dest, rad);
18107 *
18108 * @param {mat4} out mat4 receiving operation result
18109 * @param {Number} rad the angle to rotate the matrix by
18110 * @returns {mat4} out
18111 */
18112
18113function fromXRotation(out, rad) {
18114 var s = Math.sin(rad);
18115 var c = Math.cos(rad); // Perform axis-specific matrix multiplication
18116
18117 out[0] = 1;
18118 out[1] = 0;
18119 out[2] = 0;
18120 out[3] = 0;
18121 out[4] = 0;
18122 out[5] = c;
18123 out[6] = s;
18124 out[7] = 0;
18125 out[8] = 0;
18126 out[9] = -s;
18127 out[10] = c;
18128 out[11] = 0;
18129 out[12] = 0;
18130 out[13] = 0;
18131 out[14] = 0;
18132 out[15] = 1;
18133 return out;
18134}
18135/**
18136 * Creates a matrix from the given angle around the Y axis
18137 * This is equivalent to (but much faster than):
18138 *
18139 * mat4.identity(dest);
18140 * mat4.rotateY(dest, dest, rad);
18141 *
18142 * @param {mat4} out mat4 receiving operation result
18143 * @param {Number} rad the angle to rotate the matrix by
18144 * @returns {mat4} out
18145 */
18146
18147function fromYRotation(out, rad) {
18148 var s = Math.sin(rad);
18149 var c = Math.cos(rad); // Perform axis-specific matrix multiplication
18150
18151 out[0] = c;
18152 out[1] = 0;
18153 out[2] = -s;
18154 out[3] = 0;
18155 out[4] = 0;
18156 out[5] = 1;
18157 out[6] = 0;
18158 out[7] = 0;
18159 out[8] = s;
18160 out[9] = 0;
18161 out[10] = c;
18162 out[11] = 0;
18163 out[12] = 0;
18164 out[13] = 0;
18165 out[14] = 0;
18166 out[15] = 1;
18167 return out;
18168}
18169/**
18170 * Creates a matrix from the given angle around the Z axis
18171 * This is equivalent to (but much faster than):
18172 *
18173 * mat4.identity(dest);
18174 * mat4.rotateZ(dest, dest, rad);
18175 *
18176 * @param {mat4} out mat4 receiving operation result
18177 * @param {Number} rad the angle to rotate the matrix by
18178 * @returns {mat4} out
18179 */
18180
18181function fromZRotation(out, rad) {
18182 var s = Math.sin(rad);
18183 var c = Math.cos(rad); // Perform axis-specific matrix multiplication
18184
18185 out[0] = c;
18186 out[1] = s;
18187 out[2] = 0;
18188 out[3] = 0;
18189 out[4] = -s;
18190 out[5] = c;
18191 out[6] = 0;
18192 out[7] = 0;
18193 out[8] = 0;
18194 out[9] = 0;
18195 out[10] = 1;
18196 out[11] = 0;
18197 out[12] = 0;
18198 out[13] = 0;
18199 out[14] = 0;
18200 out[15] = 1;
18201 return out;
18202}
18203/**
18204 * Creates a matrix from a quaternion rotation and vector translation
18205 * This is equivalent to (but much faster than):
18206 *
18207 * mat4.identity(dest);
18208 * mat4.translate(dest, vec);
18209 * let quatMat = mat4.create();
18210 * quat4.toMat4(quat, quatMat);
18211 * mat4.multiply(dest, quatMat);
18212 *
18213 * @param {mat4} out mat4 receiving operation result
18214 * @param {quat4} q Rotation quaternion
18215 * @param {ReadonlyVec3} v Translation vector
18216 * @returns {mat4} out
18217 */
18218
18219function fromRotationTranslation$1(out, q, v) {
18220 // Quaternion math
18221 var x = q[0],
18222 y = q[1],
18223 z = q[2],
18224 w = q[3];
18225 var x2 = x + x;
18226 var y2 = y + y;
18227 var z2 = z + z;
18228 var xx = x * x2;
18229 var xy = x * y2;
18230 var xz = x * z2;
18231 var yy = y * y2;
18232 var yz = y * z2;
18233 var zz = z * z2;
18234 var wx = w * x2;
18235 var wy = w * y2;
18236 var wz = w * z2;
18237 out[0] = 1 - (yy + zz);
18238 out[1] = xy + wz;
18239 out[2] = xz - wy;
18240 out[3] = 0;
18241 out[4] = xy - wz;
18242 out[5] = 1 - (xx + zz);
18243 out[6] = yz + wx;
18244 out[7] = 0;
18245 out[8] = xz + wy;
18246 out[9] = yz - wx;
18247 out[10] = 1 - (xx + yy);
18248 out[11] = 0;
18249 out[12] = v[0];
18250 out[13] = v[1];
18251 out[14] = v[2];
18252 out[15] = 1;
18253 return out;
18254}
18255/**
18256 * Creates a new mat4 from a dual quat.
18257 *
18258 * @param {mat4} out Matrix
18259 * @param {ReadonlyQuat2} a Dual Quaternion
18260 * @returns {mat4} mat4 receiving operation result
18261 */
18262
18263function fromQuat2(out, a) {
18264 var translation = new ARRAY_TYPE(3);
18265 var bx = -a[0],
18266 by = -a[1],
18267 bz = -a[2],
18268 bw = a[3],
18269 ax = a[4],
18270 ay = a[5],
18271 az = a[6],
18272 aw = a[7];
18273 var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense
18274
18275 if (magnitude > 0) {
18276 translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;
18277 translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;
18278 translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;
18279 } else {
18280 translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;
18281 translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;
18282 translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;
18283 }
18284
18285 fromRotationTranslation$1(out, a, translation);
18286 return out;
18287}
18288/**
18289 * Returns the translation vector component of a transformation
18290 * matrix. If a matrix is built with fromRotationTranslation,
18291 * the returned vector will be the same as the translation vector
18292 * originally supplied.
18293 * @param {vec3} out Vector to receive translation component
18294 * @param {ReadonlyMat4} mat Matrix to be decomposed (input)
18295 * @return {vec3} out
18296 */
18297
18298function getTranslation$1(out, mat) {
18299 out[0] = mat[12];
18300 out[1] = mat[13];
18301 out[2] = mat[14];
18302 return out;
18303}
18304/**
18305 * Returns the scaling factor component of a transformation
18306 * matrix. If a matrix is built with fromRotationTranslationScale
18307 * with a normalized Quaternion paramter, the returned vector will be
18308 * the same as the scaling vector
18309 * originally supplied.
18310 * @param {vec3} out Vector to receive scaling factor component
18311 * @param {ReadonlyMat4} mat Matrix to be decomposed (input)
18312 * @return {vec3} out
18313 */
18314
18315function getScaling(out, mat) {
18316 var m11 = mat[0];
18317 var m12 = mat[1];
18318 var m13 = mat[2];
18319 var m21 = mat[4];
18320 var m22 = mat[5];
18321 var m23 = mat[6];
18322 var m31 = mat[8];
18323 var m32 = mat[9];
18324 var m33 = mat[10];
18325 out[0] = Math.hypot(m11, m12, m13);
18326 out[1] = Math.hypot(m21, m22, m23);
18327 out[2] = Math.hypot(m31, m32, m33);
18328 return out;
18329}
18330/**
18331 * Returns a quaternion representing the rotational component
18332 * of a transformation matrix. If a matrix is built with
18333 * fromRotationTranslation, the returned quaternion will be the
18334 * same as the quaternion originally supplied.
18335 * @param {quat} out Quaternion to receive the rotation component
18336 * @param {ReadonlyMat4} mat Matrix to be decomposed (input)
18337 * @return {quat} out
18338 */
18339
18340function getRotation(out, mat) {
18341 var scaling = new ARRAY_TYPE(3);
18342 getScaling(scaling, mat);
18343 var is1 = 1 / scaling[0];
18344 var is2 = 1 / scaling[1];
18345 var is3 = 1 / scaling[2];
18346 var sm11 = mat[0] * is1;
18347 var sm12 = mat[1] * is2;
18348 var sm13 = mat[2] * is3;
18349 var sm21 = mat[4] * is1;
18350 var sm22 = mat[5] * is2;
18351 var sm23 = mat[6] * is3;
18352 var sm31 = mat[8] * is1;
18353 var sm32 = mat[9] * is2;
18354 var sm33 = mat[10] * is3;
18355 var trace = sm11 + sm22 + sm33;
18356 var S = 0;
18357
18358 if (trace > 0) {
18359 S = Math.sqrt(trace + 1.0) * 2;
18360 out[3] = 0.25 * S;
18361 out[0] = (sm23 - sm32) / S;
18362 out[1] = (sm31 - sm13) / S;
18363 out[2] = (sm12 - sm21) / S;
18364 } else if (sm11 > sm22 && sm11 > sm33) {
18365 S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;
18366 out[3] = (sm23 - sm32) / S;
18367 out[0] = 0.25 * S;
18368 out[1] = (sm12 + sm21) / S;
18369 out[2] = (sm31 + sm13) / S;
18370 } else if (sm22 > sm33) {
18371 S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;
18372 out[3] = (sm31 - sm13) / S;
18373 out[0] = (sm12 + sm21) / S;
18374 out[1] = 0.25 * S;
18375 out[2] = (sm23 + sm32) / S;
18376 } else {
18377 S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;
18378 out[3] = (sm12 - sm21) / S;
18379 out[0] = (sm31 + sm13) / S;
18380 out[1] = (sm23 + sm32) / S;
18381 out[2] = 0.25 * S;
18382 }
18383
18384 return out;
18385}
18386/**
18387 * Creates a matrix from a quaternion rotation, vector translation and vector scale
18388 * This is equivalent to (but much faster than):
18389 *
18390 * mat4.identity(dest);
18391 * mat4.translate(dest, vec);
18392 * let quatMat = mat4.create();
18393 * quat4.toMat4(quat, quatMat);
18394 * mat4.multiply(dest, quatMat);
18395 * mat4.scale(dest, scale)
18396 *
18397 * @param {mat4} out mat4 receiving operation result
18398 * @param {quat4} q Rotation quaternion
18399 * @param {ReadonlyVec3} v Translation vector
18400 * @param {ReadonlyVec3} s Scaling vector
18401 * @returns {mat4} out
18402 */
18403
18404function fromRotationTranslationScale(out, q, v, s) {
18405 // Quaternion math
18406 var x = q[0],
18407 y = q[1],
18408 z = q[2],
18409 w = q[3];
18410 var x2 = x + x;
18411 var y2 = y + y;
18412 var z2 = z + z;
18413 var xx = x * x2;
18414 var xy = x * y2;
18415 var xz = x * z2;
18416 var yy = y * y2;
18417 var yz = y * z2;
18418 var zz = z * z2;
18419 var wx = w * x2;
18420 var wy = w * y2;
18421 var wz = w * z2;
18422 var sx = s[0];
18423 var sy = s[1];
18424 var sz = s[2];
18425 out[0] = (1 - (yy + zz)) * sx;
18426 out[1] = (xy + wz) * sx;
18427 out[2] = (xz - wy) * sx;
18428 out[3] = 0;
18429 out[4] = (xy - wz) * sy;
18430 out[5] = (1 - (xx + zz)) * sy;
18431 out[6] = (yz + wx) * sy;
18432 out[7] = 0;
18433 out[8] = (xz + wy) * sz;
18434 out[9] = (yz - wx) * sz;
18435 out[10] = (1 - (xx + yy)) * sz;
18436 out[11] = 0;
18437 out[12] = v[0];
18438 out[13] = v[1];
18439 out[14] = v[2];
18440 out[15] = 1;
18441 return out;
18442}
18443/**
18444 * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin
18445 * This is equivalent to (but much faster than):
18446 *
18447 * mat4.identity(dest);
18448 * mat4.translate(dest, vec);
18449 * mat4.translate(dest, origin);
18450 * let quatMat = mat4.create();
18451 * quat4.toMat4(quat, quatMat);
18452 * mat4.multiply(dest, quatMat);
18453 * mat4.scale(dest, scale)
18454 * mat4.translate(dest, negativeOrigin);
18455 *
18456 * @param {mat4} out mat4 receiving operation result
18457 * @param {quat4} q Rotation quaternion
18458 * @param {ReadonlyVec3} v Translation vector
18459 * @param {ReadonlyVec3} s Scaling vector
18460 * @param {ReadonlyVec3} o The origin vector around which to scale and rotate
18461 * @returns {mat4} out
18462 */
18463
18464function fromRotationTranslationScaleOrigin(out, q, v, s, o) {
18465 // Quaternion math
18466 var x = q[0],
18467 y = q[1],
18468 z = q[2],
18469 w = q[3];
18470 var x2 = x + x;
18471 var y2 = y + y;
18472 var z2 = z + z;
18473 var xx = x * x2;
18474 var xy = x * y2;
18475 var xz = x * z2;
18476 var yy = y * y2;
18477 var yz = y * z2;
18478 var zz = z * z2;
18479 var wx = w * x2;
18480 var wy = w * y2;
18481 var wz = w * z2;
18482 var sx = s[0];
18483 var sy = s[1];
18484 var sz = s[2];
18485 var ox = o[0];
18486 var oy = o[1];
18487 var oz = o[2];
18488 var out0 = (1 - (yy + zz)) * sx;
18489 var out1 = (xy + wz) * sx;
18490 var out2 = (xz - wy) * sx;
18491 var out4 = (xy - wz) * sy;
18492 var out5 = (1 - (xx + zz)) * sy;
18493 var out6 = (yz + wx) * sy;
18494 var out8 = (xz + wy) * sz;
18495 var out9 = (yz - wx) * sz;
18496 var out10 = (1 - (xx + yy)) * sz;
18497 out[0] = out0;
18498 out[1] = out1;
18499 out[2] = out2;
18500 out[3] = 0;
18501 out[4] = out4;
18502 out[5] = out5;
18503 out[6] = out6;
18504 out[7] = 0;
18505 out[8] = out8;
18506 out[9] = out9;
18507 out[10] = out10;
18508 out[11] = 0;
18509 out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);
18510 out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);
18511 out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);
18512 out[15] = 1;
18513 return out;
18514}
18515/**
18516 * Calculates a 4x4 matrix from the given quaternion
18517 *
18518 * @param {mat4} out mat4 receiving operation result
18519 * @param {ReadonlyQuat} q Quaternion to create matrix from
18520 *
18521 * @returns {mat4} out
18522 */
18523
18524function fromQuat(out, q) {
18525 var x = q[0],
18526 y = q[1],
18527 z = q[2],
18528 w = q[3];
18529 var x2 = x + x;
18530 var y2 = y + y;
18531 var z2 = z + z;
18532 var xx = x * x2;
18533 var yx = y * x2;
18534 var yy = y * y2;
18535 var zx = z * x2;
18536 var zy = z * y2;
18537 var zz = z * z2;
18538 var wx = w * x2;
18539 var wy = w * y2;
18540 var wz = w * z2;
18541 out[0] = 1 - yy - zz;
18542 out[1] = yx + wz;
18543 out[2] = zx - wy;
18544 out[3] = 0;
18545 out[4] = yx - wz;
18546 out[5] = 1 - xx - zz;
18547 out[6] = zy + wx;
18548 out[7] = 0;
18549 out[8] = zx + wy;
18550 out[9] = zy - wx;
18551 out[10] = 1 - xx - yy;
18552 out[11] = 0;
18553 out[12] = 0;
18554 out[13] = 0;
18555 out[14] = 0;
18556 out[15] = 1;
18557 return out;
18558}
18559/**
18560 * Generates a frustum matrix with the given bounds
18561 *
18562 * @param {mat4} out mat4 frustum matrix will be written into
18563 * @param {Number} left Left bound of the frustum
18564 * @param {Number} right Right bound of the frustum
18565 * @param {Number} bottom Bottom bound of the frustum
18566 * @param {Number} top Top bound of the frustum
18567 * @param {Number} near Near bound of the frustum
18568 * @param {Number} far Far bound of the frustum
18569 * @returns {mat4} out
18570 */
18571
18572function frustum(out, left, right, bottom, top, near, far) {
18573 var rl = 1 / (right - left);
18574 var tb = 1 / (top - bottom);
18575 var nf = 1 / (near - far);
18576 out[0] = near * 2 * rl;
18577 out[1] = 0;
18578 out[2] = 0;
18579 out[3] = 0;
18580 out[4] = 0;
18581 out[5] = near * 2 * tb;
18582 out[6] = 0;
18583 out[7] = 0;
18584 out[8] = (right + left) * rl;
18585 out[9] = (top + bottom) * tb;
18586 out[10] = (far + near) * nf;
18587 out[11] = -1;
18588 out[12] = 0;
18589 out[13] = 0;
18590 out[14] = far * near * 2 * nf;
18591 out[15] = 0;
18592 return out;
18593}
18594/**
18595 * Generates a perspective projection matrix with the given bounds.
18596 * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],
18597 * which matches WebGL/OpenGL's clip volume.
18598 * Passing null/undefined/no value for far will generate infinite projection matrix.
18599 *
18600 * @param {mat4} out mat4 frustum matrix will be written into
18601 * @param {number} fovy Vertical field of view in radians
18602 * @param {number} aspect Aspect ratio. typically viewport width/height
18603 * @param {number} near Near bound of the frustum
18604 * @param {number} far Far bound of the frustum, can be null or Infinity
18605 * @returns {mat4} out
18606 */
18607
18608function perspectiveNO(out, fovy, aspect, near, far) {
18609 var f = 1.0 / Math.tan(fovy / 2),
18610 nf;
18611 out[0] = f / aspect;
18612 out[1] = 0;
18613 out[2] = 0;
18614 out[3] = 0;
18615 out[4] = 0;
18616 out[5] = f;
18617 out[6] = 0;
18618 out[7] = 0;
18619 out[8] = 0;
18620 out[9] = 0;
18621 out[11] = -1;
18622 out[12] = 0;
18623 out[13] = 0;
18624 out[15] = 0;
18625
18626 if (far != null && far !== Infinity) {
18627 nf = 1 / (near - far);
18628 out[10] = (far + near) * nf;
18629 out[14] = 2 * far * near * nf;
18630 } else {
18631 out[10] = -1;
18632 out[14] = -2 * near;
18633 }
18634
18635 return out;
18636}
18637/**
18638 * Alias for {@link mat4.perspectiveNO}
18639 * @function
18640 */
18641
18642var perspective = perspectiveNO;
18643/**
18644 * Generates a perspective projection matrix suitable for WebGPU with the given bounds.
18645 * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],
18646 * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.
18647 * Passing null/undefined/no value for far will generate infinite projection matrix.
18648 *
18649 * @param {mat4} out mat4 frustum matrix will be written into
18650 * @param {number} fovy Vertical field of view in radians
18651 * @param {number} aspect Aspect ratio. typically viewport width/height
18652 * @param {number} near Near bound of the frustum
18653 * @param {number} far Far bound of the frustum, can be null or Infinity
18654 * @returns {mat4} out
18655 */
18656
18657function perspectiveZO(out, fovy, aspect, near, far) {
18658 var f = 1.0 / Math.tan(fovy / 2),
18659 nf;
18660 out[0] = f / aspect;
18661 out[1] = 0;
18662 out[2] = 0;
18663 out[3] = 0;
18664 out[4] = 0;
18665 out[5] = f;
18666 out[6] = 0;
18667 out[7] = 0;
18668 out[8] = 0;
18669 out[9] = 0;
18670 out[11] = -1;
18671 out[12] = 0;
18672 out[13] = 0;
18673 out[15] = 0;
18674
18675 if (far != null && far !== Infinity) {
18676 nf = 1 / (near - far);
18677 out[10] = far * nf;
18678 out[14] = far * near * nf;
18679 } else {
18680 out[10] = -1;
18681 out[14] = -near;
18682 }
18683
18684 return out;
18685}
18686/**
18687 * Generates a perspective projection matrix with the given field of view.
18688 * This is primarily useful for generating projection matrices to be used
18689 * with the still experiemental WebVR API.
18690 *
18691 * @param {mat4} out mat4 frustum matrix will be written into
18692 * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees
18693 * @param {number} near Near bound of the frustum
18694 * @param {number} far Far bound of the frustum
18695 * @returns {mat4} out
18696 */
18697
18698function perspectiveFromFieldOfView(out, fov, near, far) {
18699 var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);
18700 var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);
18701 var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);
18702 var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);
18703 var xScale = 2.0 / (leftTan + rightTan);
18704 var yScale = 2.0 / (upTan + downTan);
18705 out[0] = xScale;
18706 out[1] = 0.0;
18707 out[2] = 0.0;
18708 out[3] = 0.0;
18709 out[4] = 0.0;
18710 out[5] = yScale;
18711 out[6] = 0.0;
18712 out[7] = 0.0;
18713 out[8] = -((leftTan - rightTan) * xScale * 0.5);
18714 out[9] = (upTan - downTan) * yScale * 0.5;
18715 out[10] = far / (near - far);
18716 out[11] = -1.0;
18717 out[12] = 0.0;
18718 out[13] = 0.0;
18719 out[14] = far * near / (near - far);
18720 out[15] = 0.0;
18721 return out;
18722}
18723/**
18724 * Generates a orthogonal projection matrix with the given bounds.
18725 * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],
18726 * which matches WebGL/OpenGL's clip volume.
18727 *
18728 * @param {mat4} out mat4 frustum matrix will be written into
18729 * @param {number} left Left bound of the frustum
18730 * @param {number} right Right bound of the frustum
18731 * @param {number} bottom Bottom bound of the frustum
18732 * @param {number} top Top bound of the frustum
18733 * @param {number} near Near bound of the frustum
18734 * @param {number} far Far bound of the frustum
18735 * @returns {mat4} out
18736 */
18737
18738function orthoNO(out, left, right, bottom, top, near, far) {
18739 var lr = 1 / (left - right);
18740 var bt = 1 / (bottom - top);
18741 var nf = 1 / (near - far);
18742 out[0] = -2 * lr;
18743 out[1] = 0;
18744 out[2] = 0;
18745 out[3] = 0;
18746 out[4] = 0;
18747 out[5] = -2 * bt;
18748 out[6] = 0;
18749 out[7] = 0;
18750 out[8] = 0;
18751 out[9] = 0;
18752 out[10] = 2 * nf;
18753 out[11] = 0;
18754 out[12] = (left + right) * lr;
18755 out[13] = (top + bottom) * bt;
18756 out[14] = (far + near) * nf;
18757 out[15] = 1;
18758 return out;
18759}
18760/**
18761 * Alias for {@link mat4.orthoNO}
18762 * @function
18763 */
18764
18765var ortho = orthoNO;
18766/**
18767 * Generates a orthogonal projection matrix with the given bounds.
18768 * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],
18769 * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.
18770 *
18771 * @param {mat4} out mat4 frustum matrix will be written into
18772 * @param {number} left Left bound of the frustum
18773 * @param {number} right Right bound of the frustum
18774 * @param {number} bottom Bottom bound of the frustum
18775 * @param {number} top Top bound of the frustum
18776 * @param {number} near Near bound of the frustum
18777 * @param {number} far Far bound of the frustum
18778 * @returns {mat4} out
18779 */
18780
18781function orthoZO(out, left, right, bottom, top, near, far) {
18782 var lr = 1 / (left - right);
18783 var bt = 1 / (bottom - top);
18784 var nf = 1 / (near - far);
18785 out[0] = -2 * lr;
18786 out[1] = 0;
18787 out[2] = 0;
18788 out[3] = 0;
18789 out[4] = 0;
18790 out[5] = -2 * bt;
18791 out[6] = 0;
18792 out[7] = 0;
18793 out[8] = 0;
18794 out[9] = 0;
18795 out[10] = nf;
18796 out[11] = 0;
18797 out[12] = (left + right) * lr;
18798 out[13] = (top + bottom) * bt;
18799 out[14] = near * nf;
18800 out[15] = 1;
18801 return out;
18802}
18803/**
18804 * Generates a look-at matrix with the given eye position, focal point, and up axis.
18805 * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.
18806 *
18807 * @param {mat4} out mat4 frustum matrix will be written into
18808 * @param {ReadonlyVec3} eye Position of the viewer
18809 * @param {ReadonlyVec3} center Point the viewer is looking at
18810 * @param {ReadonlyVec3} up vec3 pointing up
18811 * @returns {mat4} out
18812 */
18813
18814function lookAt(out, eye, center, up) {
18815 var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;
18816 var eyex = eye[0];
18817 var eyey = eye[1];
18818 var eyez = eye[2];
18819 var upx = up[0];
18820 var upy = up[1];
18821 var upz = up[2];
18822 var centerx = center[0];
18823 var centery = center[1];
18824 var centerz = center[2];
18825
18826 if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) {
18827 return identity$2(out);
18828 }
18829
18830 z0 = eyex - centerx;
18831 z1 = eyey - centery;
18832 z2 = eyez - centerz;
18833 len = 1 / Math.hypot(z0, z1, z2);
18834 z0 *= len;
18835 z1 *= len;
18836 z2 *= len;
18837 x0 = upy * z2 - upz * z1;
18838 x1 = upz * z0 - upx * z2;
18839 x2 = upx * z1 - upy * z0;
18840 len = Math.hypot(x0, x1, x2);
18841
18842 if (!len) {
18843 x0 = 0;
18844 x1 = 0;
18845 x2 = 0;
18846 } else {
18847 len = 1 / len;
18848 x0 *= len;
18849 x1 *= len;
18850 x2 *= len;
18851 }
18852
18853 y0 = z1 * x2 - z2 * x1;
18854 y1 = z2 * x0 - z0 * x2;
18855 y2 = z0 * x1 - z1 * x0;
18856 len = Math.hypot(y0, y1, y2);
18857
18858 if (!len) {
18859 y0 = 0;
18860 y1 = 0;
18861 y2 = 0;
18862 } else {
18863 len = 1 / len;
18864 y0 *= len;
18865 y1 *= len;
18866 y2 *= len;
18867 }
18868
18869 out[0] = x0;
18870 out[1] = y0;
18871 out[2] = z0;
18872 out[3] = 0;
18873 out[4] = x1;
18874 out[5] = y1;
18875 out[6] = z1;
18876 out[7] = 0;
18877 out[8] = x2;
18878 out[9] = y2;
18879 out[10] = z2;
18880 out[11] = 0;
18881 out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
18882 out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
18883 out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
18884 out[15] = 1;
18885 return out;
18886}
18887/**
18888 * Generates a matrix that makes something look at something else.
18889 *
18890 * @param {mat4} out mat4 frustum matrix will be written into
18891 * @param {ReadonlyVec3} eye Position of the viewer
18892 * @param {ReadonlyVec3} center Point the viewer is looking at
18893 * @param {ReadonlyVec3} up vec3 pointing up
18894 * @returns {mat4} out
18895 */
18896
18897function targetTo(out, eye, target, up) {
18898 var eyex = eye[0],
18899 eyey = eye[1],
18900 eyez = eye[2],
18901 upx = up[0],
18902 upy = up[1],
18903 upz = up[2];
18904 var z0 = eyex - target[0],
18905 z1 = eyey - target[1],
18906 z2 = eyez - target[2];
18907 var len = z0 * z0 + z1 * z1 + z2 * z2;
18908
18909 if (len > 0) {
18910 len = 1 / Math.sqrt(len);
18911 z0 *= len;
18912 z1 *= len;
18913 z2 *= len;
18914 }
18915
18916 var x0 = upy * z2 - upz * z1,
18917 x1 = upz * z0 - upx * z2,
18918 x2 = upx * z1 - upy * z0;
18919 len = x0 * x0 + x1 * x1 + x2 * x2;
18920
18921 if (len > 0) {
18922 len = 1 / Math.sqrt(len);
18923 x0 *= len;
18924 x1 *= len;
18925 x2 *= len;
18926 }
18927
18928 out[0] = x0;
18929 out[1] = x1;
18930 out[2] = x2;
18931 out[3] = 0;
18932 out[4] = z1 * x2 - z2 * x1;
18933 out[5] = z2 * x0 - z0 * x2;
18934 out[6] = z0 * x1 - z1 * x0;
18935 out[7] = 0;
18936 out[8] = z0;
18937 out[9] = z1;
18938 out[10] = z2;
18939 out[11] = 0;
18940 out[12] = eyex;
18941 out[13] = eyey;
18942 out[14] = eyez;
18943 out[15] = 1;
18944 return out;
18945}
18946/**
18947 * Returns a string representation of a mat4
18948 *
18949 * @param {ReadonlyMat4} a matrix to represent as a string
18950 * @returns {String} string representation of the matrix
18951 */
18952
18953function str$5(a) {
18954 return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")";
18955}
18956/**
18957 * Returns Frobenius norm of a mat4
18958 *
18959 * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of
18960 * @returns {Number} Frobenius norm
18961 */
18962
18963function frob(a) {
18964 return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
18965}
18966/**
18967 * Adds two mat4's
18968 *
18969 * @param {mat4} out the receiving matrix
18970 * @param {ReadonlyMat4} a the first operand
18971 * @param {ReadonlyMat4} b the second operand
18972 * @returns {mat4} out
18973 */
18974
18975function add$5(out, a, b) {
18976 out[0] = a[0] + b[0];
18977 out[1] = a[1] + b[1];
18978 out[2] = a[2] + b[2];
18979 out[3] = a[3] + b[3];
18980 out[4] = a[4] + b[4];
18981 out[5] = a[5] + b[5];
18982 out[6] = a[6] + b[6];
18983 out[7] = a[7] + b[7];
18984 out[8] = a[8] + b[8];
18985 out[9] = a[9] + b[9];
18986 out[10] = a[10] + b[10];
18987 out[11] = a[11] + b[11];
18988 out[12] = a[12] + b[12];
18989 out[13] = a[13] + b[13];
18990 out[14] = a[14] + b[14];
18991 out[15] = a[15] + b[15];
18992 return out;
18993}
18994/**
18995 * Subtracts matrix b from matrix a
18996 *
18997 * @param {mat4} out the receiving matrix
18998 * @param {ReadonlyMat4} a the first operand
18999 * @param {ReadonlyMat4} b the second operand
19000 * @returns {mat4} out
19001 */
19002
19003function subtract$3(out, a, b) {
19004 out[0] = a[0] - b[0];
19005 out[1] = a[1] - b[1];
19006 out[2] = a[2] - b[2];
19007 out[3] = a[3] - b[3];
19008 out[4] = a[4] - b[4];
19009 out[5] = a[5] - b[5];
19010 out[6] = a[6] - b[6];
19011 out[7] = a[7] - b[7];
19012 out[8] = a[8] - b[8];
19013 out[9] = a[9] - b[9];
19014 out[10] = a[10] - b[10];
19015 out[11] = a[11] - b[11];
19016 out[12] = a[12] - b[12];
19017 out[13] = a[13] - b[13];
19018 out[14] = a[14] - b[14];
19019 out[15] = a[15] - b[15];
19020 return out;
19021}
19022/**
19023 * Multiply each element of the matrix by a scalar.
19024 *
19025 * @param {mat4} out the receiving matrix
19026 * @param {ReadonlyMat4} a the matrix to scale
19027 * @param {Number} b amount to scale the matrix's elements by
19028 * @returns {mat4} out
19029 */
19030
19031function multiplyScalar(out, a, b) {
19032 out[0] = a[0] * b;
19033 out[1] = a[1] * b;
19034 out[2] = a[2] * b;
19035 out[3] = a[3] * b;
19036 out[4] = a[4] * b;
19037 out[5] = a[5] * b;
19038 out[6] = a[6] * b;
19039 out[7] = a[7] * b;
19040 out[8] = a[8] * b;
19041 out[9] = a[9] * b;
19042 out[10] = a[10] * b;
19043 out[11] = a[11] * b;
19044 out[12] = a[12] * b;
19045 out[13] = a[13] * b;
19046 out[14] = a[14] * b;
19047 out[15] = a[15] * b;
19048 return out;
19049}
19050/**
19051 * Adds two mat4's after multiplying each element of the second operand by a scalar value.
19052 *
19053 * @param {mat4} out the receiving vector
19054 * @param {ReadonlyMat4} a the first operand
19055 * @param {ReadonlyMat4} b the second operand
19056 * @param {Number} scale the amount to scale b's elements by before adding
19057 * @returns {mat4} out
19058 */
19059
19060function multiplyScalarAndAdd(out, a, b, scale) {
19061 out[0] = a[0] + b[0] * scale;
19062 out[1] = a[1] + b[1] * scale;
19063 out[2] = a[2] + b[2] * scale;
19064 out[3] = a[3] + b[3] * scale;
19065 out[4] = a[4] + b[4] * scale;
19066 out[5] = a[5] + b[5] * scale;
19067 out[6] = a[6] + b[6] * scale;
19068 out[7] = a[7] + b[7] * scale;
19069 out[8] = a[8] + b[8] * scale;
19070 out[9] = a[9] + b[9] * scale;
19071 out[10] = a[10] + b[10] * scale;
19072 out[11] = a[11] + b[11] * scale;
19073 out[12] = a[12] + b[12] * scale;
19074 out[13] = a[13] + b[13] * scale;
19075 out[14] = a[14] + b[14] * scale;
19076 out[15] = a[15] + b[15] * scale;
19077 return out;
19078}
19079/**
19080 * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
19081 *
19082 * @param {ReadonlyMat4} a The first matrix.
19083 * @param {ReadonlyMat4} b The second matrix.
19084 * @returns {Boolean} True if the matrices are equal, false otherwise.
19085 */
19086
19087function exactEquals$5(a, b) {
19088 return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];
19089}
19090/**
19091 * Returns whether or not the matrices have approximately the same elements in the same position.
19092 *
19093 * @param {ReadonlyMat4} a The first matrix.
19094 * @param {ReadonlyMat4} b The second matrix.
19095 * @returns {Boolean} True if the matrices are equal, false otherwise.
19096 */
19097
19098function equals$6(a, b) {
19099 var a0 = a[0],
19100 a1 = a[1],
19101 a2 = a[2],
19102 a3 = a[3];
19103 var a4 = a[4],
19104 a5 = a[5],
19105 a6 = a[6],
19106 a7 = a[7];
19107 var a8 = a[8],
19108 a9 = a[9],
19109 a10 = a[10],
19110 a11 = a[11];
19111 var a12 = a[12],
19112 a13 = a[13],
19113 a14 = a[14],
19114 a15 = a[15];
19115 var b0 = b[0],
19116 b1 = b[1],
19117 b2 = b[2],
19118 b3 = b[3];
19119 var b4 = b[4],
19120 b5 = b[5],
19121 b6 = b[6],
19122 b7 = b[7];
19123 var b8 = b[8],
19124 b9 = b[9],
19125 b10 = b[10],
19126 b11 = b[11];
19127 var b12 = b[12],
19128 b13 = b[13],
19129 b14 = b[14],
19130 b15 = b[15];
19131 return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));
19132}
19133/**
19134 * Alias for {@link mat4.multiply}
19135 * @function
19136 */
19137
19138var mul$5 = multiply$5;
19139/**
19140 * Alias for {@link mat4.subtract}
19141 * @function
19142 */
19143
19144var sub$3 = subtract$3;
19145
19146var mat4 = /*#__PURE__*/Object.freeze({
19147__proto__: null,
19148create: create$5,
19149clone: clone$5,
19150copy: copy$5,
19151fromValues: fromValues$5,
19152set: set$5,
19153identity: identity$2,
19154transpose: transpose,
19155invert: invert$2,
19156adjoint: adjoint,
19157determinant: determinant,
19158multiply: multiply$5,
19159translate: translate$1,
19160scale: scale$5,
19161rotate: rotate$1,
19162rotateX: rotateX$3,
19163rotateY: rotateY$3,
19164rotateZ: rotateZ$3,
19165fromTranslation: fromTranslation$1,
19166fromScaling: fromScaling,
19167fromRotation: fromRotation$1,
19168fromXRotation: fromXRotation,
19169fromYRotation: fromYRotation,
19170fromZRotation: fromZRotation,
19171fromRotationTranslation: fromRotationTranslation$1,
19172fromQuat2: fromQuat2,
19173getTranslation: getTranslation$1,
19174getScaling: getScaling,
19175getRotation: getRotation,
19176fromRotationTranslationScale: fromRotationTranslationScale,
19177fromRotationTranslationScaleOrigin: fromRotationTranslationScaleOrigin,
19178fromQuat: fromQuat,
19179frustum: frustum,
19180perspectiveNO: perspectiveNO,
19181perspective: perspective,
19182perspectiveZO: perspectiveZO,
19183perspectiveFromFieldOfView: perspectiveFromFieldOfView,
19184orthoNO: orthoNO,
19185ortho: ortho,
19186orthoZO: orthoZO,
19187lookAt: lookAt,
19188targetTo: targetTo,
19189str: str$5,
19190frob: frob,
19191add: add$5,
19192subtract: subtract$3,
19193multiplyScalar: multiplyScalar,
19194multiplyScalarAndAdd: multiplyScalarAndAdd,
19195exactEquals: exactEquals$5,
19196equals: equals$6,
19197mul: mul$5,
19198sub: sub$3
19199});
19200
19201/**
19202 * 3 Dimensional Vector
19203 * @module vec3
19204 */
19205
19206/**
19207 * Creates a new, empty vec3
19208 *
19209 * @returns {vec3} a new 3D vector
19210 */
19211
19212function create$4() {
19213 var out = new ARRAY_TYPE(3);
19214
19215 if (ARRAY_TYPE != Float32Array) {
19216 out[0] = 0;
19217 out[1] = 0;
19218 out[2] = 0;
19219 }
19220
19221 return out;
19222}
19223/**
19224 * Creates a new vec3 initialized with values from an existing vector
19225 *
19226 * @param {ReadonlyVec3} a vector to clone
19227 * @returns {vec3} a new 3D vector
19228 */
19229
19230function clone$4(a) {
19231 var out = new ARRAY_TYPE(3);
19232 out[0] = a[0];
19233 out[1] = a[1];
19234 out[2] = a[2];
19235 return out;
19236}
19237/**
19238 * Calculates the length of a vec3
19239 *
19240 * @param {ReadonlyVec3} a vector to calculate length of
19241 * @returns {Number} length of a
19242 */
19243
19244function length$4(a) {
19245 var x = a[0];
19246 var y = a[1];
19247 var z = a[2];
19248 return Math.hypot(x, y, z);
19249}
19250/**
19251 * Creates a new vec3 initialized with the given values
19252 *
19253 * @param {Number} x X component
19254 * @param {Number} y Y component
19255 * @param {Number} z Z component
19256 * @returns {vec3} a new 3D vector
19257 */
19258
19259function fromValues$4(x, y, z) {
19260 var out = new ARRAY_TYPE(3);
19261 out[0] = x;
19262 out[1] = y;
19263 out[2] = z;
19264 return out;
19265}
19266/**
19267 * Copy the values from one vec3 to another
19268 *
19269 * @param {vec3} out the receiving vector
19270 * @param {ReadonlyVec3} a the source vector
19271 * @returns {vec3} out
19272 */
19273
19274function copy$4(out, a) {
19275 out[0] = a[0];
19276 out[1] = a[1];
19277 out[2] = a[2];
19278 return out;
19279}
19280/**
19281 * Set the components of a vec3 to the given values
19282 *
19283 * @param {vec3} out the receiving vector
19284 * @param {Number} x X component
19285 * @param {Number} y Y component
19286 * @param {Number} z Z component
19287 * @returns {vec3} out
19288 */
19289
19290function set$4(out, x, y, z) {
19291 out[0] = x;
19292 out[1] = y;
19293 out[2] = z;
19294 return out;
19295}
19296/**
19297 * Adds two vec3's
19298 *
19299 * @param {vec3} out the receiving vector
19300 * @param {ReadonlyVec3} a the first operand
19301 * @param {ReadonlyVec3} b the second operand
19302 * @returns {vec3} out
19303 */
19304
19305function add$4(out, a, b) {
19306 out[0] = a[0] + b[0];
19307 out[1] = a[1] + b[1];
19308 out[2] = a[2] + b[2];
19309 return out;
19310}
19311/**
19312 * Subtracts vector b from vector a
19313 *
19314 * @param {vec3} out the receiving vector
19315 * @param {ReadonlyVec3} a the first operand
19316 * @param {ReadonlyVec3} b the second operand
19317 * @returns {vec3} out
19318 */
19319
19320function subtract$2(out, a, b) {
19321 out[0] = a[0] - b[0];
19322 out[1] = a[1] - b[1];
19323 out[2] = a[2] - b[2];
19324 return out;
19325}
19326/**
19327 * Multiplies two vec3's
19328 *
19329 * @param {vec3} out the receiving vector
19330 * @param {ReadonlyVec3} a the first operand
19331 * @param {ReadonlyVec3} b the second operand
19332 * @returns {vec3} out
19333 */
19334
19335function multiply$4(out, a, b) {
19336 out[0] = a[0] * b[0];
19337 out[1] = a[1] * b[1];
19338 out[2] = a[2] * b[2];
19339 return out;
19340}
19341/**
19342 * Divides two vec3's
19343 *
19344 * @param {vec3} out the receiving vector
19345 * @param {ReadonlyVec3} a the first operand
19346 * @param {ReadonlyVec3} b the second operand
19347 * @returns {vec3} out
19348 */
19349
19350function divide$2(out, a, b) {
19351 out[0] = a[0] / b[0];
19352 out[1] = a[1] / b[1];
19353 out[2] = a[2] / b[2];
19354 return out;
19355}
19356/**
19357 * Math.ceil the components of a vec3
19358 *
19359 * @param {vec3} out the receiving vector
19360 * @param {ReadonlyVec3} a vector to ceil
19361 * @returns {vec3} out
19362 */
19363
19364function ceil$2(out, a) {
19365 out[0] = Math.ceil(a[0]);
19366 out[1] = Math.ceil(a[1]);
19367 out[2] = Math.ceil(a[2]);
19368 return out;
19369}
19370/**
19371 * Math.floor the components of a vec3
19372 *
19373 * @param {vec3} out the receiving vector
19374 * @param {ReadonlyVec3} a vector to floor
19375 * @returns {vec3} out
19376 */
19377
19378function floor$2(out, a) {
19379 out[0] = Math.floor(a[0]);
19380 out[1] = Math.floor(a[1]);
19381 out[2] = Math.floor(a[2]);
19382 return out;
19383}
19384/**
19385 * Returns the minimum of two vec3's
19386 *
19387 * @param {vec3} out the receiving vector
19388 * @param {ReadonlyVec3} a the first operand
19389 * @param {ReadonlyVec3} b the second operand
19390 * @returns {vec3} out
19391 */
19392
19393function min$2(out, a, b) {
19394 out[0] = Math.min(a[0], b[0]);
19395 out[1] = Math.min(a[1], b[1]);
19396 out[2] = Math.min(a[2], b[2]);
19397 return out;
19398}
19399/**
19400 * Returns the maximum of two vec3's
19401 *
19402 * @param {vec3} out the receiving vector
19403 * @param {ReadonlyVec3} a the first operand
19404 * @param {ReadonlyVec3} b the second operand
19405 * @returns {vec3} out
19406 */
19407
19408function max$2(out, a, b) {
19409 out[0] = Math.max(a[0], b[0]);
19410 out[1] = Math.max(a[1], b[1]);
19411 out[2] = Math.max(a[2], b[2]);
19412 return out;
19413}
19414/**
19415 * Math.round the components of a vec3
19416 *
19417 * @param {vec3} out the receiving vector
19418 * @param {ReadonlyVec3} a vector to round
19419 * @returns {vec3} out
19420 */
19421
19422function round$2(out, a) {
19423 out[0] = Math.round(a[0]);
19424 out[1] = Math.round(a[1]);
19425 out[2] = Math.round(a[2]);
19426 return out;
19427}
19428/**
19429 * Scales a vec3 by a scalar number
19430 *
19431 * @param {vec3} out the receiving vector
19432 * @param {ReadonlyVec3} a the vector to scale
19433 * @param {Number} b amount to scale the vector by
19434 * @returns {vec3} out
19435 */
19436
19437function scale$4(out, a, b) {
19438 out[0] = a[0] * b;
19439 out[1] = a[1] * b;
19440 out[2] = a[2] * b;
19441 return out;
19442}
19443/**
19444 * Adds two vec3's after scaling the second operand by a scalar value
19445 *
19446 * @param {vec3} out the receiving vector
19447 * @param {ReadonlyVec3} a the first operand
19448 * @param {ReadonlyVec3} b the second operand
19449 * @param {Number} scale the amount to scale b by before adding
19450 * @returns {vec3} out
19451 */
19452
19453function scaleAndAdd$2(out, a, b, scale) {
19454 out[0] = a[0] + b[0] * scale;
19455 out[1] = a[1] + b[1] * scale;
19456 out[2] = a[2] + b[2] * scale;
19457 return out;
19458}
19459/**
19460 * Calculates the euclidian distance between two vec3's
19461 *
19462 * @param {ReadonlyVec3} a the first operand
19463 * @param {ReadonlyVec3} b the second operand
19464 * @returns {Number} distance between a and b
19465 */
19466
19467function distance$2(a, b) {
19468 var x = b[0] - a[0];
19469 var y = b[1] - a[1];
19470 var z = b[2] - a[2];
19471 return Math.hypot(x, y, z);
19472}
19473/**
19474 * Calculates the squared euclidian distance between two vec3's
19475 *
19476 * @param {ReadonlyVec3} a the first operand
19477 * @param {ReadonlyVec3} b the second operand
19478 * @returns {Number} squared distance between a and b
19479 */
19480
19481function squaredDistance$2(a, b) {
19482 var x = b[0] - a[0];
19483 var y = b[1] - a[1];
19484 var z = b[2] - a[2];
19485 return x * x + y * y + z * z;
19486}
19487/**
19488 * Calculates the squared length of a vec3
19489 *
19490 * @param {ReadonlyVec3} a vector to calculate squared length of
19491 * @returns {Number} squared length of a
19492 */
19493
19494function squaredLength$4(a) {
19495 var x = a[0];
19496 var y = a[1];
19497 var z = a[2];
19498 return x * x + y * y + z * z;
19499}
19500/**
19501 * Negates the components of a vec3
19502 *
19503 * @param {vec3} out the receiving vector
19504 * @param {ReadonlyVec3} a vector to negate
19505 * @returns {vec3} out
19506 */
19507
19508function negate$2(out, a) {
19509 out[0] = -a[0];
19510 out[1] = -a[1];
19511 out[2] = -a[2];
19512 return out;
19513}
19514/**
19515 * Returns the inverse of the components of a vec3
19516 *
19517 * @param {vec3} out the receiving vector
19518 * @param {ReadonlyVec3} a vector to invert
19519 * @returns {vec3} out
19520 */
19521
19522function inverse$2(out, a) {
19523 out[0] = 1.0 / a[0];
19524 out[1] = 1.0 / a[1];
19525 out[2] = 1.0 / a[2];
19526 return out;
19527}
19528/**
19529 * Normalize a vec3
19530 *
19531 * @param {vec3} out the receiving vector
19532 * @param {ReadonlyVec3} a vector to normalize
19533 * @returns {vec3} out
19534 */
19535
19536function normalize$4(out, a) {
19537 var x = a[0];
19538 var y = a[1];
19539 var z = a[2];
19540 var len = x * x + y * y + z * z;
19541
19542 if (len > 0) {
19543 //TODO: evaluate use of glm_invsqrt here?
19544 len = 1 / Math.sqrt(len);
19545 }
19546
19547 out[0] = a[0] * len;
19548 out[1] = a[1] * len;
19549 out[2] = a[2] * len;
19550 return out;
19551}
19552/**
19553 * Calculates the dot product of two vec3's
19554 *
19555 * @param {ReadonlyVec3} a the first operand
19556 * @param {ReadonlyVec3} b the second operand
19557 * @returns {Number} dot product of a and b
19558 */
19559
19560function dot$5(a, b) {
19561 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
19562}
19563/**
19564 * Computes the cross product of two vec3's
19565 *
19566 * @param {vec3} out the receiving vector
19567 * @param {ReadonlyVec3} a the first operand
19568 * @param {ReadonlyVec3} b the second operand
19569 * @returns {vec3} out
19570 */
19571
19572function cross$2(out, a, b) {
19573 var ax = a[0],
19574 ay = a[1],
19575 az = a[2];
19576 var bx = b[0],
19577 by = b[1],
19578 bz = b[2];
19579 out[0] = ay * bz - az * by;
19580 out[1] = az * bx - ax * bz;
19581 out[2] = ax * by - ay * bx;
19582 return out;
19583}
19584/**
19585 * Performs a linear interpolation between two vec3's
19586 *
19587 * @param {vec3} out the receiving vector
19588 * @param {ReadonlyVec3} a the first operand
19589 * @param {ReadonlyVec3} b the second operand
19590 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
19591 * @returns {vec3} out
19592 */
19593
19594function lerp$4(out, a, b, t) {
19595 var ax = a[0];
19596 var ay = a[1];
19597 var az = a[2];
19598 out[0] = ax + t * (b[0] - ax);
19599 out[1] = ay + t * (b[1] - ay);
19600 out[2] = az + t * (b[2] - az);
19601 return out;
19602}
19603/**
19604 * Performs a hermite interpolation with two control points
19605 *
19606 * @param {vec3} out the receiving vector
19607 * @param {ReadonlyVec3} a the first operand
19608 * @param {ReadonlyVec3} b the second operand
19609 * @param {ReadonlyVec3} c the third operand
19610 * @param {ReadonlyVec3} d the fourth operand
19611 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
19612 * @returns {vec3} out
19613 */
19614
19615function hermite(out, a, b, c, d, t) {
19616 var factorTimes2 = t * t;
19617 var factor1 = factorTimes2 * (2 * t - 3) + 1;
19618 var factor2 = factorTimes2 * (t - 2) + t;
19619 var factor3 = factorTimes2 * (t - 1);
19620 var factor4 = factorTimes2 * (3 - 2 * t);
19621 out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;
19622 out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;
19623 out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;
19624 return out;
19625}
19626/**
19627 * Performs a bezier interpolation with two control points
19628 *
19629 * @param {vec3} out the receiving vector
19630 * @param {ReadonlyVec3} a the first operand
19631 * @param {ReadonlyVec3} b the second operand
19632 * @param {ReadonlyVec3} c the third operand
19633 * @param {ReadonlyVec3} d the fourth operand
19634 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
19635 * @returns {vec3} out
19636 */
19637
19638function bezier(out, a, b, c, d, t) {
19639 var inverseFactor = 1 - t;
19640 var inverseFactorTimesTwo = inverseFactor * inverseFactor;
19641 var factorTimes2 = t * t;
19642 var factor1 = inverseFactorTimesTwo * inverseFactor;
19643 var factor2 = 3 * t * inverseFactorTimesTwo;
19644 var factor3 = 3 * factorTimes2 * inverseFactor;
19645 var factor4 = factorTimes2 * t;
19646 out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;
19647 out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;
19648 out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;
19649 return out;
19650}
19651/**
19652 * Generates a random vector with the given scale
19653 *
19654 * @param {vec3} out the receiving vector
19655 * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned
19656 * @returns {vec3} out
19657 */
19658
19659function random$3(out, scale) {
19660 scale = scale || 1.0;
19661 var r = RANDOM() * 2.0 * Math.PI;
19662 var z = RANDOM() * 2.0 - 1.0;
19663 var zScale = Math.sqrt(1.0 - z * z) * scale;
19664 out[0] = Math.cos(r) * zScale;
19665 out[1] = Math.sin(r) * zScale;
19666 out[2] = z * scale;
19667 return out;
19668}
19669/**
19670 * Transforms the vec3 with a mat4.
19671 * 4th vector component is implicitly '1'
19672 *
19673 * @param {vec3} out the receiving vector
19674 * @param {ReadonlyVec3} a the vector to transform
19675 * @param {ReadonlyMat4} m matrix to transform with
19676 * @returns {vec3} out
19677 */
19678
19679function transformMat4$2(out, a, m) {
19680 var x = a[0],
19681 y = a[1],
19682 z = a[2];
19683 var w = m[3] * x + m[7] * y + m[11] * z + m[15];
19684 w = w || 1.0;
19685 out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;
19686 out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;
19687 out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;
19688 return out;
19689}
19690/**
19691 * Transforms the vec3 with a mat3.
19692 *
19693 * @param {vec3} out the receiving vector
19694 * @param {ReadonlyVec3} a the vector to transform
19695 * @param {ReadonlyMat3} m the 3x3 matrix to transform with
19696 * @returns {vec3} out
19697 */
19698
19699function transformMat3$1(out, a, m) {
19700 var x = a[0],
19701 y = a[1],
19702 z = a[2];
19703 out[0] = x * m[0] + y * m[3] + z * m[6];
19704 out[1] = x * m[1] + y * m[4] + z * m[7];
19705 out[2] = x * m[2] + y * m[5] + z * m[8];
19706 return out;
19707}
19708/**
19709 * Transforms the vec3 with a quat
19710 * Can also be used for dual quaternions. (Multiply it with the real part)
19711 *
19712 * @param {vec3} out the receiving vector
19713 * @param {ReadonlyVec3} a the vector to transform
19714 * @param {ReadonlyQuat} q quaternion to transform with
19715 * @returns {vec3} out
19716 */
19717
19718function transformQuat$1(out, a, q) {
19719 // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed
19720 var qx = q[0],
19721 qy = q[1],
19722 qz = q[2],
19723 qw = q[3];
19724 var x = a[0],
19725 y = a[1],
19726 z = a[2]; // var qvec = [qx, qy, qz];
19727 // var uv = vec3.cross([], qvec, a);
19728
19729 var uvx = qy * z - qz * y,
19730 uvy = qz * x - qx * z,
19731 uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);
19732
19733 var uuvx = qy * uvz - qz * uvy,
19734 uuvy = qz * uvx - qx * uvz,
19735 uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);
19736
19737 var w2 = qw * 2;
19738 uvx *= w2;
19739 uvy *= w2;
19740 uvz *= w2; // vec3.scale(uuv, uuv, 2);
19741
19742 uuvx *= 2;
19743 uuvy *= 2;
19744 uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));
19745
19746 out[0] = x + uvx + uuvx;
19747 out[1] = y + uvy + uuvy;
19748 out[2] = z + uvz + uuvz;
19749 return out;
19750}
19751/**
19752 * Rotate a 3D vector around the x-axis
19753 * @param {vec3} out The receiving vec3
19754 * @param {ReadonlyVec3} a The vec3 point to rotate
19755 * @param {ReadonlyVec3} b The origin of the rotation
19756 * @param {Number} rad The angle of rotation in radians
19757 * @returns {vec3} out
19758 */
19759
19760function rotateX$2(out, a, b, rad) {
19761 var p = [],
19762 r = []; //Translate point to the origin
19763
19764 p[0] = a[0] - b[0];
19765 p[1] = a[1] - b[1];
19766 p[2] = a[2] - b[2]; //perform rotation
19767
19768 r[0] = p[0];
19769 r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);
19770 r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position
19771
19772 out[0] = r[0] + b[0];
19773 out[1] = r[1] + b[1];
19774 out[2] = r[2] + b[2];
19775 return out;
19776}
19777/**
19778 * Rotate a 3D vector around the y-axis
19779 * @param {vec3} out The receiving vec3
19780 * @param {ReadonlyVec3} a The vec3 point to rotate
19781 * @param {ReadonlyVec3} b The origin of the rotation
19782 * @param {Number} rad The angle of rotation in radians
19783 * @returns {vec3} out
19784 */
19785
19786function rotateY$2(out, a, b, rad) {
19787 var p = [],
19788 r = []; //Translate point to the origin
19789
19790 p[0] = a[0] - b[0];
19791 p[1] = a[1] - b[1];
19792 p[2] = a[2] - b[2]; //perform rotation
19793
19794 r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);
19795 r[1] = p[1];
19796 r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position
19797
19798 out[0] = r[0] + b[0];
19799 out[1] = r[1] + b[1];
19800 out[2] = r[2] + b[2];
19801 return out;
19802}
19803/**
19804 * Rotate a 3D vector around the z-axis
19805 * @param {vec3} out The receiving vec3
19806 * @param {ReadonlyVec3} a The vec3 point to rotate
19807 * @param {ReadonlyVec3} b The origin of the rotation
19808 * @param {Number} rad The angle of rotation in radians
19809 * @returns {vec3} out
19810 */
19811
19812function rotateZ$2(out, a, b, rad) {
19813 var p = [],
19814 r = []; //Translate point to the origin
19815
19816 p[0] = a[0] - b[0];
19817 p[1] = a[1] - b[1];
19818 p[2] = a[2] - b[2]; //perform rotation
19819
19820 r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);
19821 r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);
19822 r[2] = p[2]; //translate to correct position
19823
19824 out[0] = r[0] + b[0];
19825 out[1] = r[1] + b[1];
19826 out[2] = r[2] + b[2];
19827 return out;
19828}
19829/**
19830 * Get the angle between two 3D vectors
19831 * @param {ReadonlyVec3} a The first operand
19832 * @param {ReadonlyVec3} b The second operand
19833 * @returns {Number} The angle in radians
19834 */
19835
19836function angle$1(a, b) {
19837 var ax = a[0],
19838 ay = a[1],
19839 az = a[2],
19840 bx = b[0],
19841 by = b[1],
19842 bz = b[2],
19843 mag1 = Math.sqrt(ax * ax + ay * ay + az * az),
19844 mag2 = Math.sqrt(bx * bx + by * by + bz * bz),
19845 mag = mag1 * mag2,
19846 cosine = mag && dot$5(a, b) / mag;
19847 return Math.acos(Math.min(Math.max(cosine, -1), 1));
19848}
19849/**
19850 * Set the components of a vec3 to zero
19851 *
19852 * @param {vec3} out the receiving vector
19853 * @returns {vec3} out
19854 */
19855
19856function zero$2(out) {
19857 out[0] = 0.0;
19858 out[1] = 0.0;
19859 out[2] = 0.0;
19860 return out;
19861}
19862/**
19863 * Returns a string representation of a vector
19864 *
19865 * @param {ReadonlyVec3} a vector to represent as a string
19866 * @returns {String} string representation of the vector
19867 */
19868
19869function str$4(a) {
19870 return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")";
19871}
19872/**
19873 * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)
19874 *
19875 * @param {ReadonlyVec3} a The first vector.
19876 * @param {ReadonlyVec3} b The second vector.
19877 * @returns {Boolean} True if the vectors are equal, false otherwise.
19878 */
19879
19880function exactEquals$4(a, b) {
19881 return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];
19882}
19883/**
19884 * Returns whether or not the vectors have approximately the same elements in the same position.
19885 *
19886 * @param {ReadonlyVec3} a The first vector.
19887 * @param {ReadonlyVec3} b The second vector.
19888 * @returns {Boolean} True if the vectors are equal, false otherwise.
19889 */
19890
19891function equals$5(a, b) {
19892 var a0 = a[0],
19893 a1 = a[1],
19894 a2 = a[2];
19895 var b0 = b[0],
19896 b1 = b[1],
19897 b2 = b[2];
19898 return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));
19899}
19900/**
19901 * Alias for {@link vec3.subtract}
19902 * @function
19903 */
19904
19905var sub$2 = subtract$2;
19906/**
19907 * Alias for {@link vec3.multiply}
19908 * @function
19909 */
19910
19911var mul$4 = multiply$4;
19912/**
19913 * Alias for {@link vec3.divide}
19914 * @function
19915 */
19916
19917var div$2 = divide$2;
19918/**
19919 * Alias for {@link vec3.distance}
19920 * @function
19921 */
19922
19923var dist$2 = distance$2;
19924/**
19925 * Alias for {@link vec3.squaredDistance}
19926 * @function
19927 */
19928
19929var sqrDist$2 = squaredDistance$2;
19930/**
19931 * Alias for {@link vec3.length}
19932 * @function
19933 */
19934
19935var len$4 = length$4;
19936/**
19937 * Alias for {@link vec3.squaredLength}
19938 * @function
19939 */
19940
19941var sqrLen$4 = squaredLength$4;
19942/**
19943 * Perform some operation over an array of vec3s.
19944 *
19945 * @param {Array} a the array of vectors to iterate over
19946 * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed
19947 * @param {Number} offset Number of elements to skip at the beginning of the array
19948 * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array
19949 * @param {Function} fn Function to call for each vector in the array
19950 * @param {Object} [arg] additional argument to pass to fn
19951 * @returns {Array} a
19952 * @function
19953 */
19954
19955var forEach$2 = function () {
19956 var vec = create$4();
19957 return function (a, stride, offset, count, fn, arg) {
19958 var i, l;
19959
19960 if (!stride) {
19961 stride = 3;
19962 }
19963
19964 if (!offset) {
19965 offset = 0;
19966 }
19967
19968 if (count) {
19969 l = Math.min(count * stride + offset, a.length);
19970 } else {
19971 l = a.length;
19972 }
19973
19974 for (i = offset; i < l; i += stride) {
19975 vec[0] = a[i];
19976 vec[1] = a[i + 1];
19977 vec[2] = a[i + 2];
19978 fn(vec, vec, arg);
19979 a[i] = vec[0];
19980 a[i + 1] = vec[1];
19981 a[i + 2] = vec[2];
19982 }
19983
19984 return a;
19985 };
19986}();
19987
19988var vec3 = /*#__PURE__*/Object.freeze({
19989__proto__: null,
19990create: create$4,
19991clone: clone$4,
19992length: length$4,
19993fromValues: fromValues$4,
19994copy: copy$4,
19995set: set$4,
19996add: add$4,
19997subtract: subtract$2,
19998multiply: multiply$4,
19999divide: divide$2,
20000ceil: ceil$2,
20001floor: floor$2,
20002min: min$2,
20003max: max$2,
20004round: round$2,
20005scale: scale$4,
20006scaleAndAdd: scaleAndAdd$2,
20007distance: distance$2,
20008squaredDistance: squaredDistance$2,
20009squaredLength: squaredLength$4,
20010negate: negate$2,
20011inverse: inverse$2,
20012normalize: normalize$4,
20013dot: dot$5,
20014cross: cross$2,
20015lerp: lerp$4,
20016hermite: hermite,
20017bezier: bezier,
20018random: random$3,
20019transformMat4: transformMat4$2,
20020transformMat3: transformMat3$1,
20021transformQuat: transformQuat$1,
20022rotateX: rotateX$2,
20023rotateY: rotateY$2,
20024rotateZ: rotateZ$2,
20025angle: angle$1,
20026zero: zero$2,
20027str: str$4,
20028exactEquals: exactEquals$4,
20029equals: equals$5,
20030sub: sub$2,
20031mul: mul$4,
20032div: div$2,
20033dist: dist$2,
20034sqrDist: sqrDist$2,
20035len: len$4,
20036sqrLen: sqrLen$4,
20037forEach: forEach$2
20038});
20039
20040/**
20041 * 4 Dimensional Vector
20042 * @module vec4
20043 */
20044
20045/**
20046 * Creates a new, empty vec4
20047 *
20048 * @returns {vec4} a new 4D vector
20049 */
20050
20051function create$3() {
20052 var out = new ARRAY_TYPE(4);
20053
20054 if (ARRAY_TYPE != Float32Array) {
20055 out[0] = 0;
20056 out[1] = 0;
20057 out[2] = 0;
20058 out[3] = 0;
20059 }
20060
20061 return out;
20062}
20063/**
20064 * Creates a new vec4 initialized with values from an existing vector
20065 *
20066 * @param {ReadonlyVec4} a vector to clone
20067 * @returns {vec4} a new 4D vector
20068 */
20069
20070function clone$3(a) {
20071 var out = new ARRAY_TYPE(4);
20072 out[0] = a[0];
20073 out[1] = a[1];
20074 out[2] = a[2];
20075 out[3] = a[3];
20076 return out;
20077}
20078/**
20079 * Creates a new vec4 initialized with the given values
20080 *
20081 * @param {Number} x X component
20082 * @param {Number} y Y component
20083 * @param {Number} z Z component
20084 * @param {Number} w W component
20085 * @returns {vec4} a new 4D vector
20086 */
20087
20088function fromValues$3(x, y, z, w) {
20089 var out = new ARRAY_TYPE(4);
20090 out[0] = x;
20091 out[1] = y;
20092 out[2] = z;
20093 out[3] = w;
20094 return out;
20095}
20096/**
20097 * Copy the values from one vec4 to another
20098 *
20099 * @param {vec4} out the receiving vector
20100 * @param {ReadonlyVec4} a the source vector
20101 * @returns {vec4} out
20102 */
20103
20104function copy$3(out, a) {
20105 out[0] = a[0];
20106 out[1] = a[1];
20107 out[2] = a[2];
20108 out[3] = a[3];
20109 return out;
20110}
20111/**
20112 * Set the components of a vec4 to the given values
20113 *
20114 * @param {vec4} out the receiving vector
20115 * @param {Number} x X component
20116 * @param {Number} y Y component
20117 * @param {Number} z Z component
20118 * @param {Number} w W component
20119 * @returns {vec4} out
20120 */
20121
20122function set$3(out, x, y, z, w) {
20123 out[0] = x;
20124 out[1] = y;
20125 out[2] = z;
20126 out[3] = w;
20127 return out;
20128}
20129/**
20130 * Adds two vec4's
20131 *
20132 * @param {vec4} out the receiving vector
20133 * @param {ReadonlyVec4} a the first operand
20134 * @param {ReadonlyVec4} b the second operand
20135 * @returns {vec4} out
20136 */
20137
20138function add$3(out, a, b) {
20139 out[0] = a[0] + b[0];
20140 out[1] = a[1] + b[1];
20141 out[2] = a[2] + b[2];
20142 out[3] = a[3] + b[3];
20143 return out;
20144}
20145/**
20146 * Subtracts vector b from vector a
20147 *
20148 * @param {vec4} out the receiving vector
20149 * @param {ReadonlyVec4} a the first operand
20150 * @param {ReadonlyVec4} b the second operand
20151 * @returns {vec4} out
20152 */
20153
20154function subtract$1(out, a, b) {
20155 out[0] = a[0] - b[0];
20156 out[1] = a[1] - b[1];
20157 out[2] = a[2] - b[2];
20158 out[3] = a[3] - b[3];
20159 return out;
20160}
20161/**
20162 * Multiplies two vec4's
20163 *
20164 * @param {vec4} out the receiving vector
20165 * @param {ReadonlyVec4} a the first operand
20166 * @param {ReadonlyVec4} b the second operand
20167 * @returns {vec4} out
20168 */
20169
20170function multiply$3(out, a, b) {
20171 out[0] = a[0] * b[0];
20172 out[1] = a[1] * b[1];
20173 out[2] = a[2] * b[2];
20174 out[3] = a[3] * b[3];
20175 return out;
20176}
20177/**
20178 * Divides two vec4's
20179 *
20180 * @param {vec4} out the receiving vector
20181 * @param {ReadonlyVec4} a the first operand
20182 * @param {ReadonlyVec4} b the second operand
20183 * @returns {vec4} out
20184 */
20185
20186function divide$1(out, a, b) {
20187 out[0] = a[0] / b[0];
20188 out[1] = a[1] / b[1];
20189 out[2] = a[2] / b[2];
20190 out[3] = a[3] / b[3];
20191 return out;
20192}
20193/**
20194 * Math.ceil the components of a vec4
20195 *
20196 * @param {vec4} out the receiving vector
20197 * @param {ReadonlyVec4} a vector to ceil
20198 * @returns {vec4} out
20199 */
20200
20201function ceil$1(out, a) {
20202 out[0] = Math.ceil(a[0]);
20203 out[1] = Math.ceil(a[1]);
20204 out[2] = Math.ceil(a[2]);
20205 out[3] = Math.ceil(a[3]);
20206 return out;
20207}
20208/**
20209 * Math.floor the components of a vec4
20210 *
20211 * @param {vec4} out the receiving vector
20212 * @param {ReadonlyVec4} a vector to floor
20213 * @returns {vec4} out
20214 */
20215
20216function floor$1(out, a) {
20217 out[0] = Math.floor(a[0]);
20218 out[1] = Math.floor(a[1]);
20219 out[2] = Math.floor(a[2]);
20220 out[3] = Math.floor(a[3]);
20221 return out;
20222}
20223/**
20224 * Returns the minimum of two vec4's
20225 *
20226 * @param {vec4} out the receiving vector
20227 * @param {ReadonlyVec4} a the first operand
20228 * @param {ReadonlyVec4} b the second operand
20229 * @returns {vec4} out
20230 */
20231
20232function min$1(out, a, b) {
20233 out[0] = Math.min(a[0], b[0]);
20234 out[1] = Math.min(a[1], b[1]);
20235 out[2] = Math.min(a[2], b[2]);
20236 out[3] = Math.min(a[3], b[3]);
20237 return out;
20238}
20239/**
20240 * Returns the maximum of two vec4's
20241 *
20242 * @param {vec4} out the receiving vector
20243 * @param {ReadonlyVec4} a the first operand
20244 * @param {ReadonlyVec4} b the second operand
20245 * @returns {vec4} out
20246 */
20247
20248function max$1(out, a, b) {
20249 out[0] = Math.max(a[0], b[0]);
20250 out[1] = Math.max(a[1], b[1]);
20251 out[2] = Math.max(a[2], b[2]);
20252 out[3] = Math.max(a[3], b[3]);
20253 return out;
20254}
20255/**
20256 * Math.round the components of a vec4
20257 *
20258 * @param {vec4} out the receiving vector
20259 * @param {ReadonlyVec4} a vector to round
20260 * @returns {vec4} out
20261 */
20262
20263function round$1(out, a) {
20264 out[0] = Math.round(a[0]);
20265 out[1] = Math.round(a[1]);
20266 out[2] = Math.round(a[2]);
20267 out[3] = Math.round(a[3]);
20268 return out;
20269}
20270/**
20271 * Scales a vec4 by a scalar number
20272 *
20273 * @param {vec4} out the receiving vector
20274 * @param {ReadonlyVec4} a the vector to scale
20275 * @param {Number} b amount to scale the vector by
20276 * @returns {vec4} out
20277 */
20278
20279function scale$3(out, a, b) {
20280 out[0] = a[0] * b;
20281 out[1] = a[1] * b;
20282 out[2] = a[2] * b;
20283 out[3] = a[3] * b;
20284 return out;
20285}
20286/**
20287 * Adds two vec4's after scaling the second operand by a scalar value
20288 *
20289 * @param {vec4} out the receiving vector
20290 * @param {ReadonlyVec4} a the first operand
20291 * @param {ReadonlyVec4} b the second operand
20292 * @param {Number} scale the amount to scale b by before adding
20293 * @returns {vec4} out
20294 */
20295
20296function scaleAndAdd$1(out, a, b, scale) {
20297 out[0] = a[0] + b[0] * scale;
20298 out[1] = a[1] + b[1] * scale;
20299 out[2] = a[2] + b[2] * scale;
20300 out[3] = a[3] + b[3] * scale;
20301 return out;
20302}
20303/**
20304 * Calculates the euclidian distance between two vec4's
20305 *
20306 * @param {ReadonlyVec4} a the first operand
20307 * @param {ReadonlyVec4} b the second operand
20308 * @returns {Number} distance between a and b
20309 */
20310
20311function distance$1(a, b) {
20312 var x = b[0] - a[0];
20313 var y = b[1] - a[1];
20314 var z = b[2] - a[2];
20315 var w = b[3] - a[3];
20316 return Math.hypot(x, y, z, w);
20317}
20318/**
20319 * Calculates the squared euclidian distance between two vec4's
20320 *
20321 * @param {ReadonlyVec4} a the first operand
20322 * @param {ReadonlyVec4} b the second operand
20323 * @returns {Number} squared distance between a and b
20324 */
20325
20326function squaredDistance$1(a, b) {
20327 var x = b[0] - a[0];
20328 var y = b[1] - a[1];
20329 var z = b[2] - a[2];
20330 var w = b[3] - a[3];
20331 return x * x + y * y + z * z + w * w;
20332}
20333/**
20334 * Calculates the length of a vec4
20335 *
20336 * @param {ReadonlyVec4} a vector to calculate length of
20337 * @returns {Number} length of a
20338 */
20339
20340function length$3(a) {
20341 var x = a[0];
20342 var y = a[1];
20343 var z = a[2];
20344 var w = a[3];
20345 return Math.hypot(x, y, z, w);
20346}
20347/**
20348 * Calculates the squared length of a vec4
20349 *
20350 * @param {ReadonlyVec4} a vector to calculate squared length of
20351 * @returns {Number} squared length of a
20352 */
20353
20354function squaredLength$3(a) {
20355 var x = a[0];
20356 var y = a[1];
20357 var z = a[2];
20358 var w = a[3];
20359 return x * x + y * y + z * z + w * w;
20360}
20361/**
20362 * Negates the components of a vec4
20363 *
20364 * @param {vec4} out the receiving vector
20365 * @param {ReadonlyVec4} a vector to negate
20366 * @returns {vec4} out
20367 */
20368
20369function negate$1(out, a) {
20370 out[0] = -a[0];
20371 out[1] = -a[1];
20372 out[2] = -a[2];
20373 out[3] = -a[3];
20374 return out;
20375}
20376/**
20377 * Returns the inverse of the components of a vec4
20378 *
20379 * @param {vec4} out the receiving vector
20380 * @param {ReadonlyVec4} a vector to invert
20381 * @returns {vec4} out
20382 */
20383
20384function inverse$1(out, a) {
20385 out[0] = 1.0 / a[0];
20386 out[1] = 1.0 / a[1];
20387 out[2] = 1.0 / a[2];
20388 out[3] = 1.0 / a[3];
20389 return out;
20390}
20391/**
20392 * Normalize a vec4
20393 *
20394 * @param {vec4} out the receiving vector
20395 * @param {ReadonlyVec4} a vector to normalize
20396 * @returns {vec4} out
20397 */
20398
20399function normalize$3(out, a) {
20400 var x = a[0];
20401 var y = a[1];
20402 var z = a[2];
20403 var w = a[3];
20404 var len = x * x + y * y + z * z + w * w;
20405
20406 if (len > 0) {
20407 len = 1 / Math.sqrt(len);
20408 }
20409
20410 out[0] = x * len;
20411 out[1] = y * len;
20412 out[2] = z * len;
20413 out[3] = w * len;
20414 return out;
20415}
20416/**
20417 * Calculates the dot product of two vec4's
20418 *
20419 * @param {ReadonlyVec4} a the first operand
20420 * @param {ReadonlyVec4} b the second operand
20421 * @returns {Number} dot product of a and b
20422 */
20423
20424function dot$4(a, b) {
20425 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
20426}
20427/**
20428 * Returns the cross-product of three vectors in a 4-dimensional space
20429 *
20430 * @param {ReadonlyVec4} result the receiving vector
20431 * @param {ReadonlyVec4} U the first vector
20432 * @param {ReadonlyVec4} V the second vector
20433 * @param {ReadonlyVec4} W the third vector
20434 * @returns {vec4} result
20435 */
20436
20437function cross$1(out, u, v, w) {
20438 var A = v[0] * w[1] - v[1] * w[0],
20439 B = v[0] * w[2] - v[2] * w[0],
20440 C = v[0] * w[3] - v[3] * w[0],
20441 D = v[1] * w[2] - v[2] * w[1],
20442 E = v[1] * w[3] - v[3] * w[1],
20443 F = v[2] * w[3] - v[3] * w[2];
20444 var G = u[0];
20445 var H = u[1];
20446 var I = u[2];
20447 var J = u[3];
20448 out[0] = H * F - I * E + J * D;
20449 out[1] = -(G * F) + I * C - J * B;
20450 out[2] = G * E - H * C + J * A;
20451 out[3] = -(G * D) + H * B - I * A;
20452 return out;
20453}
20454/**
20455 * Performs a linear interpolation between two vec4's
20456 *
20457 * @param {vec4} out the receiving vector
20458 * @param {ReadonlyVec4} a the first operand
20459 * @param {ReadonlyVec4} b the second operand
20460 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
20461 * @returns {vec4} out
20462 */
20463
20464function lerp$3(out, a, b, t) {
20465 var ax = a[0];
20466 var ay = a[1];
20467 var az = a[2];
20468 var aw = a[3];
20469 out[0] = ax + t * (b[0] - ax);
20470 out[1] = ay + t * (b[1] - ay);
20471 out[2] = az + t * (b[2] - az);
20472 out[3] = aw + t * (b[3] - aw);
20473 return out;
20474}
20475/**
20476 * Generates a random vector with the given scale
20477 *
20478 * @param {vec4} out the receiving vector
20479 * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned
20480 * @returns {vec4} out
20481 */
20482
20483function random$2(out, scale) {
20484 scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a
20485 // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.
20486 // http://projecteuclid.org/euclid.aoms/1177692644;
20487
20488 var v1, v2, v3, v4;
20489 var s1, s2;
20490
20491 do {
20492 v1 = RANDOM() * 2 - 1;
20493 v2 = RANDOM() * 2 - 1;
20494 s1 = v1 * v1 + v2 * v2;
20495 } while (s1 >= 1);
20496
20497 do {
20498 v3 = RANDOM() * 2 - 1;
20499 v4 = RANDOM() * 2 - 1;
20500 s2 = v3 * v3 + v4 * v4;
20501 } while (s2 >= 1);
20502
20503 var d = Math.sqrt((1 - s1) / s2);
20504 out[0] = scale * v1;
20505 out[1] = scale * v2;
20506 out[2] = scale * v3 * d;
20507 out[3] = scale * v4 * d;
20508 return out;
20509}
20510/**
20511 * Transforms the vec4 with a mat4.
20512 *
20513 * @param {vec4} out the receiving vector
20514 * @param {ReadonlyVec4} a the vector to transform
20515 * @param {ReadonlyMat4} m matrix to transform with
20516 * @returns {vec4} out
20517 */
20518
20519function transformMat4$1(out, a, m) {
20520 var x = a[0],
20521 y = a[1],
20522 z = a[2],
20523 w = a[3];
20524 out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
20525 out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
20526 out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
20527 out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
20528 return out;
20529}
20530/**
20531 * Transforms the vec4 with a quat
20532 *
20533 * @param {vec4} out the receiving vector
20534 * @param {ReadonlyVec4} a the vector to transform
20535 * @param {ReadonlyQuat} q quaternion to transform with
20536 * @returns {vec4} out
20537 */
20538
20539function transformQuat(out, a, q) {
20540 var x = a[0],
20541 y = a[1],
20542 z = a[2];
20543 var qx = q[0],
20544 qy = q[1],
20545 qz = q[2],
20546 qw = q[3]; // calculate quat * vec
20547
20548 var ix = qw * x + qy * z - qz * y;
20549 var iy = qw * y + qz * x - qx * z;
20550 var iz = qw * z + qx * y - qy * x;
20551 var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat
20552
20553 out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
20554 out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
20555 out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
20556 out[3] = a[3];
20557 return out;
20558}
20559/**
20560 * Set the components of a vec4 to zero
20561 *
20562 * @param {vec4} out the receiving vector
20563 * @returns {vec4} out
20564 */
20565
20566function zero$1(out) {
20567 out[0] = 0.0;
20568 out[1] = 0.0;
20569 out[2] = 0.0;
20570 out[3] = 0.0;
20571 return out;
20572}
20573/**
20574 * Returns a string representation of a vector
20575 *
20576 * @param {ReadonlyVec4} a vector to represent as a string
20577 * @returns {String} string representation of the vector
20578 */
20579
20580function str$3(a) {
20581 return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")";
20582}
20583/**
20584 * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)
20585 *
20586 * @param {ReadonlyVec4} a The first vector.
20587 * @param {ReadonlyVec4} b The second vector.
20588 * @returns {Boolean} True if the vectors are equal, false otherwise.
20589 */
20590
20591function exactEquals$3(a, b) {
20592 return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
20593}
20594/**
20595 * Returns whether or not the vectors have approximately the same elements in the same position.
20596 *
20597 * @param {ReadonlyVec4} a The first vector.
20598 * @param {ReadonlyVec4} b The second vector.
20599 * @returns {Boolean} True if the vectors are equal, false otherwise.
20600 */
20601
20602function equals$4(a, b) {
20603 var a0 = a[0],
20604 a1 = a[1],
20605 a2 = a[2],
20606 a3 = a[3];
20607 var b0 = b[0],
20608 b1 = b[1],
20609 b2 = b[2],
20610 b3 = b[3];
20611 return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));
20612}
20613/**
20614 * Alias for {@link vec4.subtract}
20615 * @function
20616 */
20617
20618var sub$1 = subtract$1;
20619/**
20620 * Alias for {@link vec4.multiply}
20621 * @function
20622 */
20623
20624var mul$3 = multiply$3;
20625/**
20626 * Alias for {@link vec4.divide}
20627 * @function
20628 */
20629
20630var div$1 = divide$1;
20631/**
20632 * Alias for {@link vec4.distance}
20633 * @function
20634 */
20635
20636var dist$1 = distance$1;
20637/**
20638 * Alias for {@link vec4.squaredDistance}
20639 * @function
20640 */
20641
20642var sqrDist$1 = squaredDistance$1;
20643/**
20644 * Alias for {@link vec4.length}
20645 * @function
20646 */
20647
20648var len$3 = length$3;
20649/**
20650 * Alias for {@link vec4.squaredLength}
20651 * @function
20652 */
20653
20654var sqrLen$3 = squaredLength$3;
20655/**
20656 * Perform some operation over an array of vec4s.
20657 *
20658 * @param {Array} a the array of vectors to iterate over
20659 * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed
20660 * @param {Number} offset Number of elements to skip at the beginning of the array
20661 * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array
20662 * @param {Function} fn Function to call for each vector in the array
20663 * @param {Object} [arg] additional argument to pass to fn
20664 * @returns {Array} a
20665 * @function
20666 */
20667
20668var forEach$1 = function () {
20669 var vec = create$3();
20670 return function (a, stride, offset, count, fn, arg) {
20671 var i, l;
20672
20673 if (!stride) {
20674 stride = 4;
20675 }
20676
20677 if (!offset) {
20678 offset = 0;
20679 }
20680
20681 if (count) {
20682 l = Math.min(count * stride + offset, a.length);
20683 } else {
20684 l = a.length;
20685 }
20686
20687 for (i = offset; i < l; i += stride) {
20688 vec[0] = a[i];
20689 vec[1] = a[i + 1];
20690 vec[2] = a[i + 2];
20691 vec[3] = a[i + 3];
20692 fn(vec, vec, arg);
20693 a[i] = vec[0];
20694 a[i + 1] = vec[1];
20695 a[i + 2] = vec[2];
20696 a[i + 3] = vec[3];
20697 }
20698
20699 return a;
20700 };
20701}();
20702
20703var vec4 = /*#__PURE__*/Object.freeze({
20704__proto__: null,
20705create: create$3,
20706clone: clone$3,
20707fromValues: fromValues$3,
20708copy: copy$3,
20709set: set$3,
20710add: add$3,
20711subtract: subtract$1,
20712multiply: multiply$3,
20713divide: divide$1,
20714ceil: ceil$1,
20715floor: floor$1,
20716min: min$1,
20717max: max$1,
20718round: round$1,
20719scale: scale$3,
20720scaleAndAdd: scaleAndAdd$1,
20721distance: distance$1,
20722squaredDistance: squaredDistance$1,
20723length: length$3,
20724squaredLength: squaredLength$3,
20725negate: negate$1,
20726inverse: inverse$1,
20727normalize: normalize$3,
20728dot: dot$4,
20729cross: cross$1,
20730lerp: lerp$3,
20731random: random$2,
20732transformMat4: transformMat4$1,
20733transformQuat: transformQuat,
20734zero: zero$1,
20735str: str$3,
20736exactEquals: exactEquals$3,
20737equals: equals$4,
20738sub: sub$1,
20739mul: mul$3,
20740div: div$1,
20741dist: dist$1,
20742sqrDist: sqrDist$1,
20743len: len$3,
20744sqrLen: sqrLen$3,
20745forEach: forEach$1
20746});
20747
20748/**
20749 * Quaternion
20750 * @module quat
20751 */
20752
20753/**
20754 * Creates a new identity quat
20755 *
20756 * @returns {quat} a new quaternion
20757 */
20758
20759function create$2() {
20760 var out = new ARRAY_TYPE(4);
20761
20762 if (ARRAY_TYPE != Float32Array) {
20763 out[0] = 0;
20764 out[1] = 0;
20765 out[2] = 0;
20766 }
20767
20768 out[3] = 1;
20769 return out;
20770}
20771/**
20772 * Set a quat to the identity quaternion
20773 *
20774 * @param {quat} out the receiving quaternion
20775 * @returns {quat} out
20776 */
20777
20778function identity$1(out) {
20779 out[0] = 0;
20780 out[1] = 0;
20781 out[2] = 0;
20782 out[3] = 1;
20783 return out;
20784}
20785/**
20786 * Sets a quat from the given angle and rotation axis,
20787 * then returns it.
20788 *
20789 * @param {quat} out the receiving quaternion
20790 * @param {ReadonlyVec3} axis the axis around which to rotate
20791 * @param {Number} rad the angle in radians
20792 * @returns {quat} out
20793 **/
20794
20795function setAxisAngle(out, axis, rad) {
20796 rad = rad * 0.5;
20797 var s = Math.sin(rad);
20798 out[0] = s * axis[0];
20799 out[1] = s * axis[1];
20800 out[2] = s * axis[2];
20801 out[3] = Math.cos(rad);
20802 return out;
20803}
20804/**
20805 * Gets the rotation axis and angle for a given
20806 * quaternion. If a quaternion is created with
20807 * setAxisAngle, this method will return the same
20808 * values as providied in the original parameter list
20809 * OR functionally equivalent values.
20810 * Example: The quaternion formed by axis [0, 0, 1] and
20811 * angle -90 is the same as the quaternion formed by
20812 * [0, 0, 1] and 270. This method favors the latter.
20813 * @param {vec3} out_axis Vector receiving the axis of rotation
20814 * @param {ReadonlyQuat} q Quaternion to be decomposed
20815 * @return {Number} Angle, in radians, of the rotation
20816 */
20817
20818function getAxisAngle(out_axis, q) {
20819 var rad = Math.acos(q[3]) * 2.0;
20820 var s = Math.sin(rad / 2.0);
20821
20822 if (s > EPSILON) {
20823 out_axis[0] = q[0] / s;
20824 out_axis[1] = q[1] / s;
20825 out_axis[2] = q[2] / s;
20826 } else {
20827 // If s is zero, return any axis (no rotation - axis does not matter)
20828 out_axis[0] = 1;
20829 out_axis[1] = 0;
20830 out_axis[2] = 0;
20831 }
20832
20833 return rad;
20834}
20835/**
20836 * Gets the angular distance between two unit quaternions
20837 *
20838 * @param {ReadonlyQuat} a Origin unit quaternion
20839 * @param {ReadonlyQuat} b Destination unit quaternion
20840 * @return {Number} Angle, in radians, between the two quaternions
20841 */
20842
20843function getAngle(a, b) {
20844 var dotproduct = dot$3(a, b);
20845 return Math.acos(2 * dotproduct * dotproduct - 1);
20846}
20847/**
20848 * Multiplies two quat's
20849 *
20850 * @param {quat} out the receiving quaternion
20851 * @param {ReadonlyQuat} a the first operand
20852 * @param {ReadonlyQuat} b the second operand
20853 * @returns {quat} out
20854 */
20855
20856function multiply$2(out, a, b) {
20857 var ax = a[0],
20858 ay = a[1],
20859 az = a[2],
20860 aw = a[3];
20861 var bx = b[0],
20862 by = b[1],
20863 bz = b[2],
20864 bw = b[3];
20865 out[0] = ax * bw + aw * bx + ay * bz - az * by;
20866 out[1] = ay * bw + aw * by + az * bx - ax * bz;
20867 out[2] = az * bw + aw * bz + ax * by - ay * bx;
20868 out[3] = aw * bw - ax * bx - ay * by - az * bz;
20869 return out;
20870}
20871/**
20872 * Rotates a quaternion by the given angle about the X axis
20873 *
20874 * @param {quat} out quat receiving operation result
20875 * @param {ReadonlyQuat} a quat to rotate
20876 * @param {number} rad angle (in radians) to rotate
20877 * @returns {quat} out
20878 */
20879
20880function rotateX$1(out, a, rad) {
20881 rad *= 0.5;
20882 var ax = a[0],
20883 ay = a[1],
20884 az = a[2],
20885 aw = a[3];
20886 var bx = Math.sin(rad),
20887 bw = Math.cos(rad);
20888 out[0] = ax * bw + aw * bx;
20889 out[1] = ay * bw + az * bx;
20890 out[2] = az * bw - ay * bx;
20891 out[3] = aw * bw - ax * bx;
20892 return out;
20893}
20894/**
20895 * Rotates a quaternion by the given angle about the Y axis
20896 *
20897 * @param {quat} out quat receiving operation result
20898 * @param {ReadonlyQuat} a quat to rotate
20899 * @param {number} rad angle (in radians) to rotate
20900 * @returns {quat} out
20901 */
20902
20903function rotateY$1(out, a, rad) {
20904 rad *= 0.5;
20905 var ax = a[0],
20906 ay = a[1],
20907 az = a[2],
20908 aw = a[3];
20909 var by = Math.sin(rad),
20910 bw = Math.cos(rad);
20911 out[0] = ax * bw - az * by;
20912 out[1] = ay * bw + aw * by;
20913 out[2] = az * bw + ax * by;
20914 out[3] = aw * bw - ay * by;
20915 return out;
20916}
20917/**
20918 * Rotates a quaternion by the given angle about the Z axis
20919 *
20920 * @param {quat} out quat receiving operation result
20921 * @param {ReadonlyQuat} a quat to rotate
20922 * @param {number} rad angle (in radians) to rotate
20923 * @returns {quat} out
20924 */
20925
20926function rotateZ$1(out, a, rad) {
20927 rad *= 0.5;
20928 var ax = a[0],
20929 ay = a[1],
20930 az = a[2],
20931 aw = a[3];
20932 var bz = Math.sin(rad),
20933 bw = Math.cos(rad);
20934 out[0] = ax * bw + ay * bz;
20935 out[1] = ay * bw - ax * bz;
20936 out[2] = az * bw + aw * bz;
20937 out[3] = aw * bw - az * bz;
20938 return out;
20939}
20940/**
20941 * Calculates the W component of a quat from the X, Y, and Z components.
20942 * Assumes that quaternion is 1 unit in length.
20943 * Any existing W component will be ignored.
20944 *
20945 * @param {quat} out the receiving quaternion
20946 * @param {ReadonlyQuat} a quat to calculate W component of
20947 * @returns {quat} out
20948 */
20949
20950function calculateW(out, a) {
20951 var x = a[0],
20952 y = a[1],
20953 z = a[2];
20954 out[0] = x;
20955 out[1] = y;
20956 out[2] = z;
20957 out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));
20958 return out;
20959}
20960/**
20961 * Calculate the exponential of a unit quaternion.
20962 *
20963 * @param {quat} out the receiving quaternion
20964 * @param {ReadonlyQuat} a quat to calculate the exponential of
20965 * @returns {quat} out
20966 */
20967
20968function exp(out, a) {
20969 var x = a[0],
20970 y = a[1],
20971 z = a[2],
20972 w = a[3];
20973 var r = Math.sqrt(x * x + y * y + z * z);
20974 var et = Math.exp(w);
20975 var s = r > 0 ? et * Math.sin(r) / r : 0;
20976 out[0] = x * s;
20977 out[1] = y * s;
20978 out[2] = z * s;
20979 out[3] = et * Math.cos(r);
20980 return out;
20981}
20982/**
20983 * Calculate the natural logarithm of a unit quaternion.
20984 *
20985 * @param {quat} out the receiving quaternion
20986 * @param {ReadonlyQuat} a quat to calculate the exponential of
20987 * @returns {quat} out
20988 */
20989
20990function ln(out, a) {
20991 var x = a[0],
20992 y = a[1],
20993 z = a[2],
20994 w = a[3];
20995 var r = Math.sqrt(x * x + y * y + z * z);
20996 var t = r > 0 ? Math.atan2(r, w) / r : 0;
20997 out[0] = x * t;
20998 out[1] = y * t;
20999 out[2] = z * t;
21000 out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);
21001 return out;
21002}
21003/**
21004 * Calculate the scalar power of a unit quaternion.
21005 *
21006 * @param {quat} out the receiving quaternion
21007 * @param {ReadonlyQuat} a quat to calculate the exponential of
21008 * @param {Number} b amount to scale the quaternion by
21009 * @returns {quat} out
21010 */
21011
21012function pow(out, a, b) {
21013 ln(out, a);
21014 scale$2(out, out, b);
21015 exp(out, out);
21016 return out;
21017}
21018/**
21019 * Performs a spherical linear interpolation between two quat
21020 *
21021 * @param {quat} out the receiving quaternion
21022 * @param {ReadonlyQuat} a the first operand
21023 * @param {ReadonlyQuat} b the second operand
21024 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
21025 * @returns {quat} out
21026 */
21027
21028function slerp(out, a, b, t) {
21029 // benchmarks:
21030 // http://jsperf.com/quaternion-slerp-implementations
21031 var ax = a[0],
21032 ay = a[1],
21033 az = a[2],
21034 aw = a[3];
21035 var bx = b[0],
21036 by = b[1],
21037 bz = b[2],
21038 bw = b[3];
21039 var omega, cosom, sinom, scale0, scale1; // calc cosine
21040
21041 cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)
21042
21043 if (cosom < 0.0) {
21044 cosom = -cosom;
21045 bx = -bx;
21046 by = -by;
21047 bz = -bz;
21048 bw = -bw;
21049 } // calculate coefficients
21050
21051
21052 if (1.0 - cosom > EPSILON) {
21053 // standard case (slerp)
21054 omega = Math.acos(cosom);
21055 sinom = Math.sin(omega);
21056 scale0 = Math.sin((1.0 - t) * omega) / sinom;
21057 scale1 = Math.sin(t * omega) / sinom;
21058 } else {
21059 // "from" and "to" quaternions are very close
21060 // ... so we can do a linear interpolation
21061 scale0 = 1.0 - t;
21062 scale1 = t;
21063 } // calculate final values
21064
21065
21066 out[0] = scale0 * ax + scale1 * bx;
21067 out[1] = scale0 * ay + scale1 * by;
21068 out[2] = scale0 * az + scale1 * bz;
21069 out[3] = scale0 * aw + scale1 * bw;
21070 return out;
21071}
21072/**
21073 * Generates a random unit quaternion
21074 *
21075 * @param {quat} out the receiving quaternion
21076 * @returns {quat} out
21077 */
21078
21079function random$1(out) {
21080 // Implementation of http://planning.cs.uiuc.edu/node198.html
21081 // TODO: Calling random 3 times is probably not the fastest solution
21082 var u1 = RANDOM();
21083 var u2 = RANDOM();
21084 var u3 = RANDOM();
21085 var sqrt1MinusU1 = Math.sqrt(1 - u1);
21086 var sqrtU1 = Math.sqrt(u1);
21087 out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);
21088 out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);
21089 out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);
21090 out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);
21091 return out;
21092}
21093/**
21094 * Calculates the inverse of a quat
21095 *
21096 * @param {quat} out the receiving quaternion
21097 * @param {ReadonlyQuat} a quat to calculate inverse of
21098 * @returns {quat} out
21099 */
21100
21101function invert$1(out, a) {
21102 var a0 = a[0],
21103 a1 = a[1],
21104 a2 = a[2],
21105 a3 = a[3];
21106 var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;
21107 var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0
21108
21109 out[0] = -a0 * invDot;
21110 out[1] = -a1 * invDot;
21111 out[2] = -a2 * invDot;
21112 out[3] = a3 * invDot;
21113 return out;
21114}
21115/**
21116 * Calculates the conjugate of a quat
21117 * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.
21118 *
21119 * @param {quat} out the receiving quaternion
21120 * @param {ReadonlyQuat} a quat to calculate conjugate of
21121 * @returns {quat} out
21122 */
21123
21124function conjugate$1(out, a) {
21125 out[0] = -a[0];
21126 out[1] = -a[1];
21127 out[2] = -a[2];
21128 out[3] = a[3];
21129 return out;
21130}
21131/**
21132 * Creates a quaternion from the given 3x3 rotation matrix.
21133 *
21134 * NOTE: The resultant quaternion is not normalized, so you should be sure
21135 * to renormalize the quaternion yourself where necessary.
21136 *
21137 * @param {quat} out the receiving quaternion
21138 * @param {ReadonlyMat3} m rotation matrix
21139 * @returns {quat} out
21140 * @function
21141 */
21142
21143function fromMat3(out, m) {
21144 // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
21145 // article "Quaternion Calculus and Fast Animation".
21146 var fTrace = m[0] + m[4] + m[8];
21147 var fRoot;
21148
21149 if (fTrace > 0.0) {
21150 // |w| > 1/2, may as well choose w > 1/2
21151 fRoot = Math.sqrt(fTrace + 1.0); // 2w
21152
21153 out[3] = 0.5 * fRoot;
21154 fRoot = 0.5 / fRoot; // 1/(4w)
21155
21156 out[0] = (m[5] - m[7]) * fRoot;
21157 out[1] = (m[6] - m[2]) * fRoot;
21158 out[2] = (m[1] - m[3]) * fRoot;
21159 } else {
21160 // |w| <= 1/2
21161 var i = 0;
21162 if (m[4] > m[0]) i = 1;
21163 if (m[8] > m[i * 3 + i]) i = 2;
21164 var j = (i + 1) % 3;
21165 var k = (i + 2) % 3;
21166 fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);
21167 out[i] = 0.5 * fRoot;
21168 fRoot = 0.5 / fRoot;
21169 out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;
21170 out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;
21171 out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;
21172 }
21173
21174 return out;
21175}
21176/**
21177 * Creates a quaternion from the given euler angle x, y, z.
21178 *
21179 * @param {quat} out the receiving quaternion
21180 * @param {x} Angle to rotate around X axis in degrees.
21181 * @param {y} Angle to rotate around Y axis in degrees.
21182 * @param {z} Angle to rotate around Z axis in degrees.
21183 * @returns {quat} out
21184 * @function
21185 */
21186
21187function fromEuler(out, x, y, z) {
21188 var halfToRad = 0.5 * Math.PI / 180.0;
21189 x *= halfToRad;
21190 y *= halfToRad;
21191 z *= halfToRad;
21192 var sx = Math.sin(x);
21193 var cx = Math.cos(x);
21194 var sy = Math.sin(y);
21195 var cy = Math.cos(y);
21196 var sz = Math.sin(z);
21197 var cz = Math.cos(z);
21198 out[0] = sx * cy * cz - cx * sy * sz;
21199 out[1] = cx * sy * cz + sx * cy * sz;
21200 out[2] = cx * cy * sz - sx * sy * cz;
21201 out[3] = cx * cy * cz + sx * sy * sz;
21202 return out;
21203}
21204/**
21205 * Returns a string representation of a quatenion
21206 *
21207 * @param {ReadonlyQuat} a vector to represent as a string
21208 * @returns {String} string representation of the vector
21209 */
21210
21211function str$2(a) {
21212 return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")";
21213}
21214/**
21215 * Creates a new quat initialized with values from an existing quaternion
21216 *
21217 * @param {ReadonlyQuat} a quaternion to clone
21218 * @returns {quat} a new quaternion
21219 * @function
21220 */
21221
21222var clone$2 = clone$3;
21223/**
21224 * Creates a new quat initialized with the given values
21225 *
21226 * @param {Number} x X component
21227 * @param {Number} y Y component
21228 * @param {Number} z Z component
21229 * @param {Number} w W component
21230 * @returns {quat} a new quaternion
21231 * @function
21232 */
21233
21234var fromValues$2 = fromValues$3;
21235/**
21236 * Copy the values from one quat to another
21237 *
21238 * @param {quat} out the receiving quaternion
21239 * @param {ReadonlyQuat} a the source quaternion
21240 * @returns {quat} out
21241 * @function
21242 */
21243
21244var copy$2 = copy$3;
21245/**
21246 * Set the components of a quat to the given values
21247 *
21248 * @param {quat} out the receiving quaternion
21249 * @param {Number} x X component
21250 * @param {Number} y Y component
21251 * @param {Number} z Z component
21252 * @param {Number} w W component
21253 * @returns {quat} out
21254 * @function
21255 */
21256
21257var set$2 = set$3;
21258/**
21259 * Adds two quat's
21260 *
21261 * @param {quat} out the receiving quaternion
21262 * @param {ReadonlyQuat} a the first operand
21263 * @param {ReadonlyQuat} b the second operand
21264 * @returns {quat} out
21265 * @function
21266 */
21267
21268var add$2 = add$3;
21269/**
21270 * Alias for {@link quat.multiply}
21271 * @function
21272 */
21273
21274var mul$2 = multiply$2;
21275/**
21276 * Scales a quat by a scalar number
21277 *
21278 * @param {quat} out the receiving vector
21279 * @param {ReadonlyQuat} a the vector to scale
21280 * @param {Number} b amount to scale the vector by
21281 * @returns {quat} out
21282 * @function
21283 */
21284
21285var scale$2 = scale$3;
21286/**
21287 * Calculates the dot product of two quat's
21288 *
21289 * @param {ReadonlyQuat} a the first operand
21290 * @param {ReadonlyQuat} b the second operand
21291 * @returns {Number} dot product of a and b
21292 * @function
21293 */
21294
21295var dot$3 = dot$4;
21296/**
21297 * Performs a linear interpolation between two quat's
21298 *
21299 * @param {quat} out the receiving quaternion
21300 * @param {ReadonlyQuat} a the first operand
21301 * @param {ReadonlyQuat} b the second operand
21302 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
21303 * @returns {quat} out
21304 * @function
21305 */
21306
21307var lerp$2 = lerp$3;
21308/**
21309 * Calculates the length of a quat
21310 *
21311 * @param {ReadonlyQuat} a vector to calculate length of
21312 * @returns {Number} length of a
21313 */
21314
21315var length$2 = length$3;
21316/**
21317 * Alias for {@link quat.length}
21318 * @function
21319 */
21320
21321var len$2 = length$2;
21322/**
21323 * Calculates the squared length of a quat
21324 *
21325 * @param {ReadonlyQuat} a vector to calculate squared length of
21326 * @returns {Number} squared length of a
21327 * @function
21328 */
21329
21330var squaredLength$2 = squaredLength$3;
21331/**
21332 * Alias for {@link quat.squaredLength}
21333 * @function
21334 */
21335
21336var sqrLen$2 = squaredLength$2;
21337/**
21338 * Normalize a quat
21339 *
21340 * @param {quat} out the receiving quaternion
21341 * @param {ReadonlyQuat} a quaternion to normalize
21342 * @returns {quat} out
21343 * @function
21344 */
21345
21346var normalize$2 = normalize$3;
21347/**
21348 * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)
21349 *
21350 * @param {ReadonlyQuat} a The first quaternion.
21351 * @param {ReadonlyQuat} b The second quaternion.
21352 * @returns {Boolean} True if the vectors are equal, false otherwise.
21353 */
21354
21355var exactEquals$2 = exactEquals$3;
21356/**
21357 * Returns whether or not the quaternions have approximately the same elements in the same position.
21358 *
21359 * @param {ReadonlyQuat} a The first vector.
21360 * @param {ReadonlyQuat} b The second vector.
21361 * @returns {Boolean} True if the vectors are equal, false otherwise.
21362 */
21363
21364var equals$3 = equals$4;
21365/**
21366 * Sets a quaternion to represent the shortest rotation from one
21367 * vector to another.
21368 *
21369 * Both vectors are assumed to be unit length.
21370 *
21371 * @param {quat} out the receiving quaternion.
21372 * @param {ReadonlyVec3} a the initial vector
21373 * @param {ReadonlyVec3} b the destination vector
21374 * @returns {quat} out
21375 */
21376
21377var rotationTo = function () {
21378 var tmpvec3 = create$4();
21379 var xUnitVec3 = fromValues$4(1, 0, 0);
21380 var yUnitVec3 = fromValues$4(0, 1, 0);
21381 return function (out, a, b) {
21382 var dot = dot$5(a, b);
21383
21384 if (dot < -0.999999) {
21385 cross$2(tmpvec3, xUnitVec3, a);
21386 if (len$4(tmpvec3) < 0.000001) cross$2(tmpvec3, yUnitVec3, a);
21387 normalize$4(tmpvec3, tmpvec3);
21388 setAxisAngle(out, tmpvec3, Math.PI);
21389 return out;
21390 } else if (dot > 0.999999) {
21391 out[0] = 0;
21392 out[1] = 0;
21393 out[2] = 0;
21394 out[3] = 1;
21395 return out;
21396 } else {
21397 cross$2(tmpvec3, a, b);
21398 out[0] = tmpvec3[0];
21399 out[1] = tmpvec3[1];
21400 out[2] = tmpvec3[2];
21401 out[3] = 1 + dot;
21402 return normalize$2(out, out);
21403 }
21404 };
21405}();
21406/**
21407 * Performs a spherical linear interpolation with two control points
21408 *
21409 * @param {quat} out the receiving quaternion
21410 * @param {ReadonlyQuat} a the first operand
21411 * @param {ReadonlyQuat} b the second operand
21412 * @param {ReadonlyQuat} c the third operand
21413 * @param {ReadonlyQuat} d the fourth operand
21414 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
21415 * @returns {quat} out
21416 */
21417
21418var sqlerp = function () {
21419 var temp1 = create$2();
21420 var temp2 = create$2();
21421 return function (out, a, b, c, d, t) {
21422 slerp(temp1, a, d, t);
21423 slerp(temp2, b, c, t);
21424 slerp(out, temp1, temp2, 2 * t * (1 - t));
21425 return out;
21426 };
21427}();
21428/**
21429 * Sets the specified quaternion with values corresponding to the given
21430 * axes. Each axis is a vec3 and is expected to be unit length and
21431 * perpendicular to all other specified axes.
21432 *
21433 * @param {ReadonlyVec3} view the vector representing the viewing direction
21434 * @param {ReadonlyVec3} right the vector representing the local "right" direction
21435 * @param {ReadonlyVec3} up the vector representing the local "up" direction
21436 * @returns {quat} out
21437 */
21438
21439var setAxes = function () {
21440 var matr = create$6();
21441 return function (out, view, right, up) {
21442 matr[0] = right[0];
21443 matr[3] = right[1];
21444 matr[6] = right[2];
21445 matr[1] = up[0];
21446 matr[4] = up[1];
21447 matr[7] = up[2];
21448 matr[2] = -view[0];
21449 matr[5] = -view[1];
21450 matr[8] = -view[2];
21451 return normalize$2(out, fromMat3(out, matr));
21452 };
21453}();
21454
21455var quat = /*#__PURE__*/Object.freeze({
21456__proto__: null,
21457create: create$2,
21458identity: identity$1,
21459setAxisAngle: setAxisAngle,
21460getAxisAngle: getAxisAngle,
21461getAngle: getAngle,
21462multiply: multiply$2,
21463rotateX: rotateX$1,
21464rotateY: rotateY$1,
21465rotateZ: rotateZ$1,
21466calculateW: calculateW,
21467exp: exp,
21468ln: ln,
21469pow: pow,
21470slerp: slerp,
21471random: random$1,
21472invert: invert$1,
21473conjugate: conjugate$1,
21474fromMat3: fromMat3,
21475fromEuler: fromEuler,
21476str: str$2,
21477clone: clone$2,
21478fromValues: fromValues$2,
21479copy: copy$2,
21480set: set$2,
21481add: add$2,
21482mul: mul$2,
21483scale: scale$2,
21484dot: dot$3,
21485lerp: lerp$2,
21486length: length$2,
21487len: len$2,
21488squaredLength: squaredLength$2,
21489sqrLen: sqrLen$2,
21490normalize: normalize$2,
21491exactEquals: exactEquals$2,
21492equals: equals$3,
21493rotationTo: rotationTo,
21494sqlerp: sqlerp,
21495setAxes: setAxes
21496});
21497
21498/**
21499 * Dual Quaternion<br>
21500 * Format: [real, dual]<br>
21501 * Quaternion format: XYZW<br>
21502 * Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.<br>
21503 * @module quat2
21504 */
21505
21506/**
21507 * Creates a new identity dual quat
21508 *
21509 * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation]
21510 */
21511
21512function create$1() {
21513 var dq = new ARRAY_TYPE(8);
21514
21515 if (ARRAY_TYPE != Float32Array) {
21516 dq[0] = 0;
21517 dq[1] = 0;
21518 dq[2] = 0;
21519 dq[4] = 0;
21520 dq[5] = 0;
21521 dq[6] = 0;
21522 dq[7] = 0;
21523 }
21524
21525 dq[3] = 1;
21526 return dq;
21527}
21528/**
21529 * Creates a new quat initialized with values from an existing quaternion
21530 *
21531 * @param {ReadonlyQuat2} a dual quaternion to clone
21532 * @returns {quat2} new dual quaternion
21533 * @function
21534 */
21535
21536function clone$1(a) {
21537 var dq = new ARRAY_TYPE(8);
21538 dq[0] = a[0];
21539 dq[1] = a[1];
21540 dq[2] = a[2];
21541 dq[3] = a[3];
21542 dq[4] = a[4];
21543 dq[5] = a[5];
21544 dq[6] = a[6];
21545 dq[7] = a[7];
21546 return dq;
21547}
21548/**
21549 * Creates a new dual quat initialized with the given values
21550 *
21551 * @param {Number} x1 X component
21552 * @param {Number} y1 Y component
21553 * @param {Number} z1 Z component
21554 * @param {Number} w1 W component
21555 * @param {Number} x2 X component
21556 * @param {Number} y2 Y component
21557 * @param {Number} z2 Z component
21558 * @param {Number} w2 W component
21559 * @returns {quat2} new dual quaternion
21560 * @function
21561 */
21562
21563function fromValues$1(x1, y1, z1, w1, x2, y2, z2, w2) {
21564 var dq = new ARRAY_TYPE(8);
21565 dq[0] = x1;
21566 dq[1] = y1;
21567 dq[2] = z1;
21568 dq[3] = w1;
21569 dq[4] = x2;
21570 dq[5] = y2;
21571 dq[6] = z2;
21572 dq[7] = w2;
21573 return dq;
21574}
21575/**
21576 * Creates a new dual quat from the given values (quat and translation)
21577 *
21578 * @param {Number} x1 X component
21579 * @param {Number} y1 Y component
21580 * @param {Number} z1 Z component
21581 * @param {Number} w1 W component
21582 * @param {Number} x2 X component (translation)
21583 * @param {Number} y2 Y component (translation)
21584 * @param {Number} z2 Z component (translation)
21585 * @returns {quat2} new dual quaternion
21586 * @function
21587 */
21588
21589function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) {
21590 var dq = new ARRAY_TYPE(8);
21591 dq[0] = x1;
21592 dq[1] = y1;
21593 dq[2] = z1;
21594 dq[3] = w1;
21595 var ax = x2 * 0.5,
21596 ay = y2 * 0.5,
21597 az = z2 * 0.5;
21598 dq[4] = ax * w1 + ay * z1 - az * y1;
21599 dq[5] = ay * w1 + az * x1 - ax * z1;
21600 dq[6] = az * w1 + ax * y1 - ay * x1;
21601 dq[7] = -ax * x1 - ay * y1 - az * z1;
21602 return dq;
21603}
21604/**
21605 * Creates a dual quat from a quaternion and a translation
21606 *
21607 * @param {ReadonlyQuat2} dual quaternion receiving operation result
21608 * @param {ReadonlyQuat} q a normalized quaternion
21609 * @param {ReadonlyVec3} t tranlation vector
21610 * @returns {quat2} dual quaternion receiving operation result
21611 * @function
21612 */
21613
21614function fromRotationTranslation(out, q, t) {
21615 var ax = t[0] * 0.5,
21616 ay = t[1] * 0.5,
21617 az = t[2] * 0.5,
21618 bx = q[0],
21619 by = q[1],
21620 bz = q[2],
21621 bw = q[3];
21622 out[0] = bx;
21623 out[1] = by;
21624 out[2] = bz;
21625 out[3] = bw;
21626 out[4] = ax * bw + ay * bz - az * by;
21627 out[5] = ay * bw + az * bx - ax * bz;
21628 out[6] = az * bw + ax * by - ay * bx;
21629 out[7] = -ax * bx - ay * by - az * bz;
21630 return out;
21631}
21632/**
21633 * Creates a dual quat from a translation
21634 *
21635 * @param {ReadonlyQuat2} dual quaternion receiving operation result
21636 * @param {ReadonlyVec3} t translation vector
21637 * @returns {quat2} dual quaternion receiving operation result
21638 * @function
21639 */
21640
21641function fromTranslation(out, t) {
21642 out[0] = 0;
21643 out[1] = 0;
21644 out[2] = 0;
21645 out[3] = 1;
21646 out[4] = t[0] * 0.5;
21647 out[5] = t[1] * 0.5;
21648 out[6] = t[2] * 0.5;
21649 out[7] = 0;
21650 return out;
21651}
21652/**
21653 * Creates a dual quat from a quaternion
21654 *
21655 * @param {ReadonlyQuat2} dual quaternion receiving operation result
21656 * @param {ReadonlyQuat} q the quaternion
21657 * @returns {quat2} dual quaternion receiving operation result
21658 * @function
21659 */
21660
21661function fromRotation(out, q) {
21662 out[0] = q[0];
21663 out[1] = q[1];
21664 out[2] = q[2];
21665 out[3] = q[3];
21666 out[4] = 0;
21667 out[5] = 0;
21668 out[6] = 0;
21669 out[7] = 0;
21670 return out;
21671}
21672/**
21673 * Creates a new dual quat from a matrix (4x4)
21674 *
21675 * @param {quat2} out the dual quaternion
21676 * @param {ReadonlyMat4} a the matrix
21677 * @returns {quat2} dual quat receiving operation result
21678 * @function
21679 */
21680
21681function fromMat4(out, a) {
21682 //TODO Optimize this
21683 var outer = create$2();
21684 getRotation(outer, a);
21685 var t = new ARRAY_TYPE(3);
21686 getTranslation$1(t, a);
21687 fromRotationTranslation(out, outer, t);
21688 return out;
21689}
21690/**
21691 * Copy the values from one dual quat to another
21692 *
21693 * @param {quat2} out the receiving dual quaternion
21694 * @param {ReadonlyQuat2} a the source dual quaternion
21695 * @returns {quat2} out
21696 * @function
21697 */
21698
21699function copy$1(out, a) {
21700 out[0] = a[0];
21701 out[1] = a[1];
21702 out[2] = a[2];
21703 out[3] = a[3];
21704 out[4] = a[4];
21705 out[5] = a[5];
21706 out[6] = a[6];
21707 out[7] = a[7];
21708 return out;
21709}
21710/**
21711 * Set a dual quat to the identity dual quaternion
21712 *
21713 * @param {quat2} out the receiving quaternion
21714 * @returns {quat2} out
21715 */
21716
21717function identity(out) {
21718 out[0] = 0;
21719 out[1] = 0;
21720 out[2] = 0;
21721 out[3] = 1;
21722 out[4] = 0;
21723 out[5] = 0;
21724 out[6] = 0;
21725 out[7] = 0;
21726 return out;
21727}
21728/**
21729 * Set the components of a dual quat to the given values
21730 *
21731 * @param {quat2} out the receiving quaternion
21732 * @param {Number} x1 X component
21733 * @param {Number} y1 Y component
21734 * @param {Number} z1 Z component
21735 * @param {Number} w1 W component
21736 * @param {Number} x2 X component
21737 * @param {Number} y2 Y component
21738 * @param {Number} z2 Z component
21739 * @param {Number} w2 W component
21740 * @returns {quat2} out
21741 * @function
21742 */
21743
21744function set$1(out, x1, y1, z1, w1, x2, y2, z2, w2) {
21745 out[0] = x1;
21746 out[1] = y1;
21747 out[2] = z1;
21748 out[3] = w1;
21749 out[4] = x2;
21750 out[5] = y2;
21751 out[6] = z2;
21752 out[7] = w2;
21753 return out;
21754}
21755/**
21756 * Gets the real part of a dual quat
21757 * @param {quat} out real part
21758 * @param {ReadonlyQuat2} a Dual Quaternion
21759 * @return {quat} real part
21760 */
21761
21762var getReal = copy$2;
21763/**
21764 * Gets the dual part of a dual quat
21765 * @param {quat} out dual part
21766 * @param {ReadonlyQuat2} a Dual Quaternion
21767 * @return {quat} dual part
21768 */
21769
21770function getDual(out, a) {
21771 out[0] = a[4];
21772 out[1] = a[5];
21773 out[2] = a[6];
21774 out[3] = a[7];
21775 return out;
21776}
21777/**
21778 * Set the real component of a dual quat to the given quaternion
21779 *
21780 * @param {quat2} out the receiving quaternion
21781 * @param {ReadonlyQuat} q a quaternion representing the real part
21782 * @returns {quat2} out
21783 * @function
21784 */
21785
21786var setReal = copy$2;
21787/**
21788 * Set the dual component of a dual quat to the given quaternion
21789 *
21790 * @param {quat2} out the receiving quaternion
21791 * @param {ReadonlyQuat} q a quaternion representing the dual part
21792 * @returns {quat2} out
21793 * @function
21794 */
21795
21796function setDual(out, q) {
21797 out[4] = q[0];
21798 out[5] = q[1];
21799 out[6] = q[2];
21800 out[7] = q[3];
21801 return out;
21802}
21803/**
21804 * Gets the translation of a normalized dual quat
21805 * @param {vec3} out translation
21806 * @param {ReadonlyQuat2} a Dual Quaternion to be decomposed
21807 * @return {vec3} translation
21808 */
21809
21810function getTranslation(out, a) {
21811 var ax = a[4],
21812 ay = a[5],
21813 az = a[6],
21814 aw = a[7],
21815 bx = -a[0],
21816 by = -a[1],
21817 bz = -a[2],
21818 bw = a[3];
21819 out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;
21820 out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;
21821 out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;
21822 return out;
21823}
21824/**
21825 * Translates a dual quat by the given vector
21826 *
21827 * @param {quat2} out the receiving dual quaternion
21828 * @param {ReadonlyQuat2} a the dual quaternion to translate
21829 * @param {ReadonlyVec3} v vector to translate by
21830 * @returns {quat2} out
21831 */
21832
21833function translate(out, a, v) {
21834 var ax1 = a[0],
21835 ay1 = a[1],
21836 az1 = a[2],
21837 aw1 = a[3],
21838 bx1 = v[0] * 0.5,
21839 by1 = v[1] * 0.5,
21840 bz1 = v[2] * 0.5,
21841 ax2 = a[4],
21842 ay2 = a[5],
21843 az2 = a[6],
21844 aw2 = a[7];
21845 out[0] = ax1;
21846 out[1] = ay1;
21847 out[2] = az1;
21848 out[3] = aw1;
21849 out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2;
21850 out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2;
21851 out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2;
21852 out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2;
21853 return out;
21854}
21855/**
21856 * Rotates a dual quat around the X axis
21857 *
21858 * @param {quat2} out the receiving dual quaternion
21859 * @param {ReadonlyQuat2} a the dual quaternion to rotate
21860 * @param {number} rad how far should the rotation be
21861 * @returns {quat2} out
21862 */
21863
21864function rotateX(out, a, rad) {
21865 var bx = -a[0],
21866 by = -a[1],
21867 bz = -a[2],
21868 bw = a[3],
21869 ax = a[4],
21870 ay = a[5],
21871 az = a[6],
21872 aw = a[7],
21873 ax1 = ax * bw + aw * bx + ay * bz - az * by,
21874 ay1 = ay * bw + aw * by + az * bx - ax * bz,
21875 az1 = az * bw + aw * bz + ax * by - ay * bx,
21876 aw1 = aw * bw - ax * bx - ay * by - az * bz;
21877 rotateX$1(out, a, rad);
21878 bx = out[0];
21879 by = out[1];
21880 bz = out[2];
21881 bw = out[3];
21882 out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
21883 out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
21884 out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
21885 out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
21886 return out;
21887}
21888/**
21889 * Rotates a dual quat around the Y axis
21890 *
21891 * @param {quat2} out the receiving dual quaternion
21892 * @param {ReadonlyQuat2} a the dual quaternion to rotate
21893 * @param {number} rad how far should the rotation be
21894 * @returns {quat2} out
21895 */
21896
21897function rotateY(out, a, rad) {
21898 var bx = -a[0],
21899 by = -a[1],
21900 bz = -a[2],
21901 bw = a[3],
21902 ax = a[4],
21903 ay = a[5],
21904 az = a[6],
21905 aw = a[7],
21906 ax1 = ax * bw + aw * bx + ay * bz - az * by,
21907 ay1 = ay * bw + aw * by + az * bx - ax * bz,
21908 az1 = az * bw + aw * bz + ax * by - ay * bx,
21909 aw1 = aw * bw - ax * bx - ay * by - az * bz;
21910 rotateY$1(out, a, rad);
21911 bx = out[0];
21912 by = out[1];
21913 bz = out[2];
21914 bw = out[3];
21915 out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
21916 out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
21917 out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
21918 out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
21919 return out;
21920}
21921/**
21922 * Rotates a dual quat around the Z axis
21923 *
21924 * @param {quat2} out the receiving dual quaternion
21925 * @param {ReadonlyQuat2} a the dual quaternion to rotate
21926 * @param {number} rad how far should the rotation be
21927 * @returns {quat2} out
21928 */
21929
21930function rotateZ(out, a, rad) {
21931 var bx = -a[0],
21932 by = -a[1],
21933 bz = -a[2],
21934 bw = a[3],
21935 ax = a[4],
21936 ay = a[5],
21937 az = a[6],
21938 aw = a[7],
21939 ax1 = ax * bw + aw * bx + ay * bz - az * by,
21940 ay1 = ay * bw + aw * by + az * bx - ax * bz,
21941 az1 = az * bw + aw * bz + ax * by - ay * bx,
21942 aw1 = aw * bw - ax * bx - ay * by - az * bz;
21943 rotateZ$1(out, a, rad);
21944 bx = out[0];
21945 by = out[1];
21946 bz = out[2];
21947 bw = out[3];
21948 out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
21949 out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
21950 out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
21951 out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
21952 return out;
21953}
21954/**
21955 * Rotates a dual quat by a given quaternion (a * q)
21956 *
21957 * @param {quat2} out the receiving dual quaternion
21958 * @param {ReadonlyQuat2} a the dual quaternion to rotate
21959 * @param {ReadonlyQuat} q quaternion to rotate by
21960 * @returns {quat2} out
21961 */
21962
21963function rotateByQuatAppend(out, a, q) {
21964 var qx = q[0],
21965 qy = q[1],
21966 qz = q[2],
21967 qw = q[3],
21968 ax = a[0],
21969 ay = a[1],
21970 az = a[2],
21971 aw = a[3];
21972 out[0] = ax * qw + aw * qx + ay * qz - az * qy;
21973 out[1] = ay * qw + aw * qy + az * qx - ax * qz;
21974 out[2] = az * qw + aw * qz + ax * qy - ay * qx;
21975 out[3] = aw * qw - ax * qx - ay * qy - az * qz;
21976 ax = a[4];
21977 ay = a[5];
21978 az = a[6];
21979 aw = a[7];
21980 out[4] = ax * qw + aw * qx + ay * qz - az * qy;
21981 out[5] = ay * qw + aw * qy + az * qx - ax * qz;
21982 out[6] = az * qw + aw * qz + ax * qy - ay * qx;
21983 out[7] = aw * qw - ax * qx - ay * qy - az * qz;
21984 return out;
21985}
21986/**
21987 * Rotates a dual quat by a given quaternion (q * a)
21988 *
21989 * @param {quat2} out the receiving dual quaternion
21990 * @param {ReadonlyQuat} q quaternion to rotate by
21991 * @param {ReadonlyQuat2} a the dual quaternion to rotate
21992 * @returns {quat2} out
21993 */
21994
21995function rotateByQuatPrepend(out, q, a) {
21996 var qx = q[0],
21997 qy = q[1],
21998 qz = q[2],
21999 qw = q[3],
22000 bx = a[0],
22001 by = a[1],
22002 bz = a[2],
22003 bw = a[3];
22004 out[0] = qx * bw + qw * bx + qy * bz - qz * by;
22005 out[1] = qy * bw + qw * by + qz * bx - qx * bz;
22006 out[2] = qz * bw + qw * bz + qx * by - qy * bx;
22007 out[3] = qw * bw - qx * bx - qy * by - qz * bz;
22008 bx = a[4];
22009 by = a[5];
22010 bz = a[6];
22011 bw = a[7];
22012 out[4] = qx * bw + qw * bx + qy * bz - qz * by;
22013 out[5] = qy * bw + qw * by + qz * bx - qx * bz;
22014 out[6] = qz * bw + qw * bz + qx * by - qy * bx;
22015 out[7] = qw * bw - qx * bx - qy * by - qz * bz;
22016 return out;
22017}
22018/**
22019 * Rotates a dual quat around a given axis. Does the normalisation automatically
22020 *
22021 * @param {quat2} out the receiving dual quaternion
22022 * @param {ReadonlyQuat2} a the dual quaternion to rotate
22023 * @param {ReadonlyVec3} axis the axis to rotate around
22024 * @param {Number} rad how far the rotation should be
22025 * @returns {quat2} out
22026 */
22027
22028function rotateAroundAxis(out, a, axis, rad) {
22029 //Special case for rad = 0
22030 if (Math.abs(rad) < EPSILON) {
22031 return copy$1(out, a);
22032 }
22033
22034 var axisLength = Math.hypot(axis[0], axis[1], axis[2]);
22035 rad = rad * 0.5;
22036 var s = Math.sin(rad);
22037 var bx = s * axis[0] / axisLength;
22038 var by = s * axis[1] / axisLength;
22039 var bz = s * axis[2] / axisLength;
22040 var bw = Math.cos(rad);
22041 var ax1 = a[0],
22042 ay1 = a[1],
22043 az1 = a[2],
22044 aw1 = a[3];
22045 out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
22046 out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
22047 out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
22048 out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
22049 var ax = a[4],
22050 ay = a[5],
22051 az = a[6],
22052 aw = a[7];
22053 out[4] = ax * bw + aw * bx + ay * bz - az * by;
22054 out[5] = ay * bw + aw * by + az * bx - ax * bz;
22055 out[6] = az * bw + aw * bz + ax * by - ay * bx;
22056 out[7] = aw * bw - ax * bx - ay * by - az * bz;
22057 return out;
22058}
22059/**
22060 * Adds two dual quat's
22061 *
22062 * @param {quat2} out the receiving dual quaternion
22063 * @param {ReadonlyQuat2} a the first operand
22064 * @param {ReadonlyQuat2} b the second operand
22065 * @returns {quat2} out
22066 * @function
22067 */
22068
22069function add$1(out, a, b) {
22070 out[0] = a[0] + b[0];
22071 out[1] = a[1] + b[1];
22072 out[2] = a[2] + b[2];
22073 out[3] = a[3] + b[3];
22074 out[4] = a[4] + b[4];
22075 out[5] = a[5] + b[5];
22076 out[6] = a[6] + b[6];
22077 out[7] = a[7] + b[7];
22078 return out;
22079}
22080/**
22081 * Multiplies two dual quat's
22082 *
22083 * @param {quat2} out the receiving dual quaternion
22084 * @param {ReadonlyQuat2} a the first operand
22085 * @param {ReadonlyQuat2} b the second operand
22086 * @returns {quat2} out
22087 */
22088
22089function multiply$1(out, a, b) {
22090 var ax0 = a[0],
22091 ay0 = a[1],
22092 az0 = a[2],
22093 aw0 = a[3],
22094 bx1 = b[4],
22095 by1 = b[5],
22096 bz1 = b[6],
22097 bw1 = b[7],
22098 ax1 = a[4],
22099 ay1 = a[5],
22100 az1 = a[6],
22101 aw1 = a[7],
22102 bx0 = b[0],
22103 by0 = b[1],
22104 bz0 = b[2],
22105 bw0 = b[3];
22106 out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0;
22107 out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0;
22108 out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0;
22109 out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0;
22110 out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0;
22111 out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0;
22112 out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0;
22113 out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0;
22114 return out;
22115}
22116/**
22117 * Alias for {@link quat2.multiply}
22118 * @function
22119 */
22120
22121var mul$1 = multiply$1;
22122/**
22123 * Scales a dual quat by a scalar number
22124 *
22125 * @param {quat2} out the receiving dual quat
22126 * @param {ReadonlyQuat2} a the dual quat to scale
22127 * @param {Number} b amount to scale the dual quat by
22128 * @returns {quat2} out
22129 * @function
22130 */
22131
22132function scale$1(out, a, b) {
22133 out[0] = a[0] * b;
22134 out[1] = a[1] * b;
22135 out[2] = a[2] * b;
22136 out[3] = a[3] * b;
22137 out[4] = a[4] * b;
22138 out[5] = a[5] * b;
22139 out[6] = a[6] * b;
22140 out[7] = a[7] * b;
22141 return out;
22142}
22143/**
22144 * Calculates the dot product of two dual quat's (The dot product of the real parts)
22145 *
22146 * @param {ReadonlyQuat2} a the first operand
22147 * @param {ReadonlyQuat2} b the second operand
22148 * @returns {Number} dot product of a and b
22149 * @function
22150 */
22151
22152var dot$2 = dot$3;
22153/**
22154 * Performs a linear interpolation between two dual quats's
22155 * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5)
22156 *
22157 * @param {quat2} out the receiving dual quat
22158 * @param {ReadonlyQuat2} a the first operand
22159 * @param {ReadonlyQuat2} b the second operand
22160 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
22161 * @returns {quat2} out
22162 */
22163
22164function lerp$1(out, a, b, t) {
22165 var mt = 1 - t;
22166 if (dot$2(a, b) < 0) t = -t;
22167 out[0] = a[0] * mt + b[0] * t;
22168 out[1] = a[1] * mt + b[1] * t;
22169 out[2] = a[2] * mt + b[2] * t;
22170 out[3] = a[3] * mt + b[3] * t;
22171 out[4] = a[4] * mt + b[4] * t;
22172 out[5] = a[5] * mt + b[5] * t;
22173 out[6] = a[6] * mt + b[6] * t;
22174 out[7] = a[7] * mt + b[7] * t;
22175 return out;
22176}
22177/**
22178 * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper
22179 *
22180 * @param {quat2} out the receiving dual quaternion
22181 * @param {ReadonlyQuat2} a dual quat to calculate inverse of
22182 * @returns {quat2} out
22183 */
22184
22185function invert(out, a) {
22186 var sqlen = squaredLength$1(a);
22187 out[0] = -a[0] / sqlen;
22188 out[1] = -a[1] / sqlen;
22189 out[2] = -a[2] / sqlen;
22190 out[3] = a[3] / sqlen;
22191 out[4] = -a[4] / sqlen;
22192 out[5] = -a[5] / sqlen;
22193 out[6] = -a[6] / sqlen;
22194 out[7] = a[7] / sqlen;
22195 return out;
22196}
22197/**
22198 * Calculates the conjugate of a dual quat
22199 * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result.
22200 *
22201 * @param {quat2} out the receiving quaternion
22202 * @param {ReadonlyQuat2} a quat to calculate conjugate of
22203 * @returns {quat2} out
22204 */
22205
22206function conjugate(out, a) {
22207 out[0] = -a[0];
22208 out[1] = -a[1];
22209 out[2] = -a[2];
22210 out[3] = a[3];
22211 out[4] = -a[4];
22212 out[5] = -a[5];
22213 out[6] = -a[6];
22214 out[7] = a[7];
22215 return out;
22216}
22217/**
22218 * Calculates the length of a dual quat
22219 *
22220 * @param {ReadonlyQuat2} a dual quat to calculate length of
22221 * @returns {Number} length of a
22222 * @function
22223 */
22224
22225var length$1 = length$2;
22226/**
22227 * Alias for {@link quat2.length}
22228 * @function
22229 */
22230
22231var len$1 = length$1;
22232/**
22233 * Calculates the squared length of a dual quat
22234 *
22235 * @param {ReadonlyQuat2} a dual quat to calculate squared length of
22236 * @returns {Number} squared length of a
22237 * @function
22238 */
22239
22240var squaredLength$1 = squaredLength$2;
22241/**
22242 * Alias for {@link quat2.squaredLength}
22243 * @function
22244 */
22245
22246var sqrLen$1 = squaredLength$1;
22247/**
22248 * Normalize a dual quat
22249 *
22250 * @param {quat2} out the receiving dual quaternion
22251 * @param {ReadonlyQuat2} a dual quaternion to normalize
22252 * @returns {quat2} out
22253 * @function
22254 */
22255
22256function normalize$1(out, a) {
22257 var magnitude = squaredLength$1(a);
22258
22259 if (magnitude > 0) {
22260 magnitude = Math.sqrt(magnitude);
22261 var a0 = a[0] / magnitude;
22262 var a1 = a[1] / magnitude;
22263 var a2 = a[2] / magnitude;
22264 var a3 = a[3] / magnitude;
22265 var b0 = a[4];
22266 var b1 = a[5];
22267 var b2 = a[6];
22268 var b3 = a[7];
22269 var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3;
22270 out[0] = a0;
22271 out[1] = a1;
22272 out[2] = a2;
22273 out[3] = a3;
22274 out[4] = (b0 - a0 * a_dot_b) / magnitude;
22275 out[5] = (b1 - a1 * a_dot_b) / magnitude;
22276 out[6] = (b2 - a2 * a_dot_b) / magnitude;
22277 out[7] = (b3 - a3 * a_dot_b) / magnitude;
22278 }
22279
22280 return out;
22281}
22282/**
22283 * Returns a string representation of a dual quatenion
22284 *
22285 * @param {ReadonlyQuat2} a dual quaternion to represent as a string
22286 * @returns {String} string representation of the dual quat
22287 */
22288
22289function str$1(a) {
22290 return "quat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ")";
22291}
22292/**
22293 * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===)
22294 *
22295 * @param {ReadonlyQuat2} a the first dual quaternion.
22296 * @param {ReadonlyQuat2} b the second dual quaternion.
22297 * @returns {Boolean} true if the dual quaternions are equal, false otherwise.
22298 */
22299
22300function exactEquals$1(a, b) {
22301 return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7];
22302}
22303/**
22304 * Returns whether or not the dual quaternions have approximately the same elements in the same position.
22305 *
22306 * @param {ReadonlyQuat2} a the first dual quat.
22307 * @param {ReadonlyQuat2} b the second dual quat.
22308 * @returns {Boolean} true if the dual quats are equal, false otherwise.
22309 */
22310
22311function equals$2(a, b) {
22312 var a0 = a[0],
22313 a1 = a[1],
22314 a2 = a[2],
22315 a3 = a[3],
22316 a4 = a[4],
22317 a5 = a[5],
22318 a6 = a[6],
22319 a7 = a[7];
22320 var b0 = b[0],
22321 b1 = b[1],
22322 b2 = b[2],
22323 b3 = b[3],
22324 b4 = b[4],
22325 b5 = b[5],
22326 b6 = b[6],
22327 b7 = b[7];
22328 return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7));
22329}
22330
22331var quat2 = /*#__PURE__*/Object.freeze({
22332__proto__: null,
22333create: create$1,
22334clone: clone$1,
22335fromValues: fromValues$1,
22336fromRotationTranslationValues: fromRotationTranslationValues,
22337fromRotationTranslation: fromRotationTranslation,
22338fromTranslation: fromTranslation,
22339fromRotation: fromRotation,
22340fromMat4: fromMat4,
22341copy: copy$1,
22342identity: identity,
22343set: set$1,
22344getReal: getReal,
22345getDual: getDual,
22346setReal: setReal,
22347setDual: setDual,
22348getTranslation: getTranslation,
22349translate: translate,
22350rotateX: rotateX,
22351rotateY: rotateY,
22352rotateZ: rotateZ,
22353rotateByQuatAppend: rotateByQuatAppend,
22354rotateByQuatPrepend: rotateByQuatPrepend,
22355rotateAroundAxis: rotateAroundAxis,
22356add: add$1,
22357multiply: multiply$1,
22358mul: mul$1,
22359scale: scale$1,
22360dot: dot$2,
22361lerp: lerp$1,
22362invert: invert,
22363conjugate: conjugate,
22364length: length$1,
22365len: len$1,
22366squaredLength: squaredLength$1,
22367sqrLen: sqrLen$1,
22368normalize: normalize$1,
22369str: str$1,
22370exactEquals: exactEquals$1,
22371equals: equals$2
22372});
22373
22374/**
22375 * 2 Dimensional Vector
22376 * @module vec2
22377 */
22378
22379/**
22380 * Creates a new, empty vec2
22381 *
22382 * @returns {vec2} a new 2D vector
22383 */
22384
22385function create() {
22386 var out = new ARRAY_TYPE(2);
22387
22388 if (ARRAY_TYPE != Float32Array) {
22389 out[0] = 0;
22390 out[1] = 0;
22391 }
22392
22393 return out;
22394}
22395/**
22396 * Creates a new vec2 initialized with values from an existing vector
22397 *
22398 * @param {ReadonlyVec2} a vector to clone
22399 * @returns {vec2} a new 2D vector
22400 */
22401
22402function clone(a) {
22403 var out = new ARRAY_TYPE(2);
22404 out[0] = a[0];
22405 out[1] = a[1];
22406 return out;
22407}
22408/**
22409 * Creates a new vec2 initialized with the given values
22410 *
22411 * @param {Number} x X component
22412 * @param {Number} y Y component
22413 * @returns {vec2} a new 2D vector
22414 */
22415
22416function fromValues(x, y) {
22417 var out = new ARRAY_TYPE(2);
22418 out[0] = x;
22419 out[1] = y;
22420 return out;
22421}
22422/**
22423 * Copy the values from one vec2 to another
22424 *
22425 * @param {vec2} out the receiving vector
22426 * @param {ReadonlyVec2} a the source vector
22427 * @returns {vec2} out
22428 */
22429
22430function copy(out, a) {
22431 out[0] = a[0];
22432 out[1] = a[1];
22433 return out;
22434}
22435/**
22436 * Set the components of a vec2 to the given values
22437 *
22438 * @param {vec2} out the receiving vector
22439 * @param {Number} x X component
22440 * @param {Number} y Y component
22441 * @returns {vec2} out
22442 */
22443
22444function set(out, x, y) {
22445 out[0] = x;
22446 out[1] = y;
22447 return out;
22448}
22449/**
22450 * Adds two vec2's
22451 *
22452 * @param {vec2} out the receiving vector
22453 * @param {ReadonlyVec2} a the first operand
22454 * @param {ReadonlyVec2} b the second operand
22455 * @returns {vec2} out
22456 */
22457
22458function add(out, a, b) {
22459 out[0] = a[0] + b[0];
22460 out[1] = a[1] + b[1];
22461 return out;
22462}
22463/**
22464 * Subtracts vector b from vector a
22465 *
22466 * @param {vec2} out the receiving vector
22467 * @param {ReadonlyVec2} a the first operand
22468 * @param {ReadonlyVec2} b the second operand
22469 * @returns {vec2} out
22470 */
22471
22472function subtract(out, a, b) {
22473 out[0] = a[0] - b[0];
22474 out[1] = a[1] - b[1];
22475 return out;
22476}
22477/**
22478 * Multiplies two vec2's
22479 *
22480 * @param {vec2} out the receiving vector
22481 * @param {ReadonlyVec2} a the first operand
22482 * @param {ReadonlyVec2} b the second operand
22483 * @returns {vec2} out
22484 */
22485
22486function multiply(out, a, b) {
22487 out[0] = a[0] * b[0];
22488 out[1] = a[1] * b[1];
22489 return out;
22490}
22491/**
22492 * Divides two vec2's
22493 *
22494 * @param {vec2} out the receiving vector
22495 * @param {ReadonlyVec2} a the first operand
22496 * @param {ReadonlyVec2} b the second operand
22497 * @returns {vec2} out
22498 */
22499
22500function divide(out, a, b) {
22501 out[0] = a[0] / b[0];
22502 out[1] = a[1] / b[1];
22503 return out;
22504}
22505/**
22506 * Math.ceil the components of a vec2
22507 *
22508 * @param {vec2} out the receiving vector
22509 * @param {ReadonlyVec2} a vector to ceil
22510 * @returns {vec2} out
22511 */
22512
22513function ceil(out, a) {
22514 out[0] = Math.ceil(a[0]);
22515 out[1] = Math.ceil(a[1]);
22516 return out;
22517}
22518/**
22519 * Math.floor the components of a vec2
22520 *
22521 * @param {vec2} out the receiving vector
22522 * @param {ReadonlyVec2} a vector to floor
22523 * @returns {vec2} out
22524 */
22525
22526function floor(out, a) {
22527 out[0] = Math.floor(a[0]);
22528 out[1] = Math.floor(a[1]);
22529 return out;
22530}
22531/**
22532 * Returns the minimum of two vec2's
22533 *
22534 * @param {vec2} out the receiving vector
22535 * @param {ReadonlyVec2} a the first operand
22536 * @param {ReadonlyVec2} b the second operand
22537 * @returns {vec2} out
22538 */
22539
22540function min(out, a, b) {
22541 out[0] = Math.min(a[0], b[0]);
22542 out[1] = Math.min(a[1], b[1]);
22543 return out;
22544}
22545/**
22546 * Returns the maximum of two vec2's
22547 *
22548 * @param {vec2} out the receiving vector
22549 * @param {ReadonlyVec2} a the first operand
22550 * @param {ReadonlyVec2} b the second operand
22551 * @returns {vec2} out
22552 */
22553
22554function max(out, a, b) {
22555 out[0] = Math.max(a[0], b[0]);
22556 out[1] = Math.max(a[1], b[1]);
22557 return out;
22558}
22559/**
22560 * Math.round the components of a vec2
22561 *
22562 * @param {vec2} out the receiving vector
22563 * @param {ReadonlyVec2} a vector to round
22564 * @returns {vec2} out
22565 */
22566
22567function round(out, a) {
22568 out[0] = Math.round(a[0]);
22569 out[1] = Math.round(a[1]);
22570 return out;
22571}
22572/**
22573 * Scales a vec2 by a scalar number
22574 *
22575 * @param {vec2} out the receiving vector
22576 * @param {ReadonlyVec2} a the vector to scale
22577 * @param {Number} b amount to scale the vector by
22578 * @returns {vec2} out
22579 */
22580
22581function scale(out, a, b) {
22582 out[0] = a[0] * b;
22583 out[1] = a[1] * b;
22584 return out;
22585}
22586/**
22587 * Adds two vec2's after scaling the second operand by a scalar value
22588 *
22589 * @param {vec2} out the receiving vector
22590 * @param {ReadonlyVec2} a the first operand
22591 * @param {ReadonlyVec2} b the second operand
22592 * @param {Number} scale the amount to scale b by before adding
22593 * @returns {vec2} out
22594 */
22595
22596function scaleAndAdd(out, a, b, scale) {
22597 out[0] = a[0] + b[0] * scale;
22598 out[1] = a[1] + b[1] * scale;
22599 return out;
22600}
22601/**
22602 * Calculates the euclidian distance between two vec2's
22603 *
22604 * @param {ReadonlyVec2} a the first operand
22605 * @param {ReadonlyVec2} b the second operand
22606 * @returns {Number} distance between a and b
22607 */
22608
22609function distance(a, b) {
22610 var x = b[0] - a[0],
22611 y = b[1] - a[1];
22612 return Math.hypot(x, y);
22613}
22614/**
22615 * Calculates the squared euclidian distance between two vec2's
22616 *
22617 * @param {ReadonlyVec2} a the first operand
22618 * @param {ReadonlyVec2} b the second operand
22619 * @returns {Number} squared distance between a and b
22620 */
22621
22622function squaredDistance(a, b) {
22623 var x = b[0] - a[0],
22624 y = b[1] - a[1];
22625 return x * x + y * y;
22626}
22627/**
22628 * Calculates the length of a vec2
22629 *
22630 * @param {ReadonlyVec2} a vector to calculate length of
22631 * @returns {Number} length of a
22632 */
22633
22634function length(a) {
22635 var x = a[0],
22636 y = a[1];
22637 return Math.hypot(x, y);
22638}
22639/**
22640 * Calculates the squared length of a vec2
22641 *
22642 * @param {ReadonlyVec2} a vector to calculate squared length of
22643 * @returns {Number} squared length of a
22644 */
22645
22646function squaredLength(a) {
22647 var x = a[0],
22648 y = a[1];
22649 return x * x + y * y;
22650}
22651/**
22652 * Negates the components of a vec2
22653 *
22654 * @param {vec2} out the receiving vector
22655 * @param {ReadonlyVec2} a vector to negate
22656 * @returns {vec2} out
22657 */
22658
22659function negate(out, a) {
22660 out[0] = -a[0];
22661 out[1] = -a[1];
22662 return out;
22663}
22664/**
22665 * Returns the inverse of the components of a vec2
22666 *
22667 * @param {vec2} out the receiving vector
22668 * @param {ReadonlyVec2} a vector to invert
22669 * @returns {vec2} out
22670 */
22671
22672function inverse(out, a) {
22673 out[0] = 1.0 / a[0];
22674 out[1] = 1.0 / a[1];
22675 return out;
22676}
22677/**
22678 * Normalize a vec2
22679 *
22680 * @param {vec2} out the receiving vector
22681 * @param {ReadonlyVec2} a vector to normalize
22682 * @returns {vec2} out
22683 */
22684
22685function normalize(out, a) {
22686 var x = a[0],
22687 y = a[1];
22688 var len = x * x + y * y;
22689
22690 if (len > 0) {
22691 //TODO: evaluate use of glm_invsqrt here?
22692 len = 1 / Math.sqrt(len);
22693 }
22694
22695 out[0] = a[0] * len;
22696 out[1] = a[1] * len;
22697 return out;
22698}
22699/**
22700 * Calculates the dot product of two vec2's
22701 *
22702 * @param {ReadonlyVec2} a the first operand
22703 * @param {ReadonlyVec2} b the second operand
22704 * @returns {Number} dot product of a and b
22705 */
22706
22707function dot$1(a, b) {
22708 return a[0] * b[0] + a[1] * b[1];
22709}
22710/**
22711 * Computes the cross product of two vec2's
22712 * Note that the cross product must by definition produce a 3D vector
22713 *
22714 * @param {vec3} out the receiving vector
22715 * @param {ReadonlyVec2} a the first operand
22716 * @param {ReadonlyVec2} b the second operand
22717 * @returns {vec3} out
22718 */
22719
22720function cross(out, a, b) {
22721 var z = a[0] * b[1] - a[1] * b[0];
22722 out[0] = out[1] = 0;
22723 out[2] = z;
22724 return out;
22725}
22726/**
22727 * Performs a linear interpolation between two vec2's
22728 *
22729 * @param {vec2} out the receiving vector
22730 * @param {ReadonlyVec2} a the first operand
22731 * @param {ReadonlyVec2} b the second operand
22732 * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
22733 * @returns {vec2} out
22734 */
22735
22736function lerp(out, a, b, t) {
22737 var ax = a[0],
22738 ay = a[1];
22739 out[0] = ax + t * (b[0] - ax);
22740 out[1] = ay + t * (b[1] - ay);
22741 return out;
22742}
22743/**
22744 * Generates a random vector with the given scale
22745 *
22746 * @param {vec2} out the receiving vector
22747 * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned
22748 * @returns {vec2} out
22749 */
22750
22751function random(out, scale) {
22752 scale = scale || 1.0;
22753 var r = RANDOM() * 2.0 * Math.PI;
22754 out[0] = Math.cos(r) * scale;
22755 out[1] = Math.sin(r) * scale;
22756 return out;
22757}
22758/**
22759 * Transforms the vec2 with a mat2
22760 *
22761 * @param {vec2} out the receiving vector
22762 * @param {ReadonlyVec2} a the vector to transform
22763 * @param {ReadonlyMat2} m matrix to transform with
22764 * @returns {vec2} out
22765 */
22766
22767function transformMat2(out, a, m) {
22768 var x = a[0],
22769 y = a[1];
22770 out[0] = m[0] * x + m[2] * y;
22771 out[1] = m[1] * x + m[3] * y;
22772 return out;
22773}
22774/**
22775 * Transforms the vec2 with a mat2d
22776 *
22777 * @param {vec2} out the receiving vector
22778 * @param {ReadonlyVec2} a the vector to transform
22779 * @param {ReadonlyMat2d} m matrix to transform with
22780 * @returns {vec2} out
22781 */
22782
22783function transformMat2d(out, a, m) {
22784 var x = a[0],
22785 y = a[1];
22786 out[0] = m[0] * x + m[2] * y + m[4];
22787 out[1] = m[1] * x + m[3] * y + m[5];
22788 return out;
22789}
22790/**
22791 * Transforms the vec2 with a mat3
22792 * 3rd vector component is implicitly '1'
22793 *
22794 * @param {vec2} out the receiving vector
22795 * @param {ReadonlyVec2} a the vector to transform
22796 * @param {ReadonlyMat3} m matrix to transform with
22797 * @returns {vec2} out
22798 */
22799
22800function transformMat3(out, a, m) {
22801 var x = a[0],
22802 y = a[1];
22803 out[0] = m[0] * x + m[3] * y + m[6];
22804 out[1] = m[1] * x + m[4] * y + m[7];
22805 return out;
22806}
22807/**
22808 * Transforms the vec2 with a mat4
22809 * 3rd vector component is implicitly '0'
22810 * 4th vector component is implicitly '1'
22811 *
22812 * @param {vec2} out the receiving vector
22813 * @param {ReadonlyVec2} a the vector to transform
22814 * @param {ReadonlyMat4} m matrix to transform with
22815 * @returns {vec2} out
22816 */
22817
22818function transformMat4(out, a, m) {
22819 var x = a[0];
22820 var y = a[1];
22821 out[0] = m[0] * x + m[4] * y + m[12];
22822 out[1] = m[1] * x + m[5] * y + m[13];
22823 return out;
22824}
22825/**
22826 * Rotate a 2D vector
22827 * @param {vec2} out The receiving vec2
22828 * @param {ReadonlyVec2} a The vec2 point to rotate
22829 * @param {ReadonlyVec2} b The origin of the rotation
22830 * @param {Number} rad The angle of rotation in radians
22831 * @returns {vec2} out
22832 */
22833
22834function rotate(out, a, b, rad) {
22835 //Translate point to the origin
22836 var p0 = a[0] - b[0],
22837 p1 = a[1] - b[1],
22838 sinC = Math.sin(rad),
22839 cosC = Math.cos(rad); //perform rotation and translate to correct position
22840
22841 out[0] = p0 * cosC - p1 * sinC + b[0];
22842 out[1] = p0 * sinC + p1 * cosC + b[1];
22843 return out;
22844}
22845/**
22846 * Get the angle between two 2D vectors
22847 * @param {ReadonlyVec2} a The first operand
22848 * @param {ReadonlyVec2} b The second operand
22849 * @returns {Number} The angle in radians
22850 */
22851
22852function angle(a, b) {
22853 var x1 = a[0],
22854 y1 = a[1],
22855 x2 = b[0],
22856 y2 = b[1],
22857 // mag is the product of the magnitudes of a and b
22858 mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),
22859 // mag &&.. short circuits if mag == 0
22860 cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1
22861
22862 return Math.acos(Math.min(Math.max(cosine, -1), 1));
22863}
22864/**
22865 * Set the components of a vec2 to zero
22866 *
22867 * @param {vec2} out the receiving vector
22868 * @returns {vec2} out
22869 */
22870
22871function zero(out) {
22872 out[0] = 0.0;
22873 out[1] = 0.0;
22874 return out;
22875}
22876/**
22877 * Returns a string representation of a vector
22878 *
22879 * @param {ReadonlyVec2} a vector to represent as a string
22880 * @returns {String} string representation of the vector
22881 */
22882
22883function str(a) {
22884 return "vec2(" + a[0] + ", " + a[1] + ")";
22885}
22886/**
22887 * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)
22888 *
22889 * @param {ReadonlyVec2} a The first vector.
22890 * @param {ReadonlyVec2} b The second vector.
22891 * @returns {Boolean} True if the vectors are equal, false otherwise.
22892 */
22893
22894function exactEquals(a, b) {
22895 return a[0] === b[0] && a[1] === b[1];
22896}
22897/**
22898 * Returns whether or not the vectors have approximately the same elements in the same position.
22899 *
22900 * @param {ReadonlyVec2} a The first vector.
22901 * @param {ReadonlyVec2} b The second vector.
22902 * @returns {Boolean} True if the vectors are equal, false otherwise.
22903 */
22904
22905function equals$1(a, b) {
22906 var a0 = a[0],
22907 a1 = a[1];
22908 var b0 = b[0],
22909 b1 = b[1];
22910 return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));
22911}
22912/**
22913 * Alias for {@link vec2.length}
22914 * @function
22915 */
22916
22917var len = length;
22918/**
22919 * Alias for {@link vec2.subtract}
22920 * @function
22921 */
22922
22923var sub = subtract;
22924/**
22925 * Alias for {@link vec2.multiply}
22926 * @function
22927 */
22928
22929var mul = multiply;
22930/**
22931 * Alias for {@link vec2.divide}
22932 * @function
22933 */
22934
22935var div = divide;
22936/**
22937 * Alias for {@link vec2.distance}
22938 * @function
22939 */
22940
22941var dist = distance;
22942/**
22943 * Alias for {@link vec2.squaredDistance}
22944 * @function
22945 */
22946
22947var sqrDist = squaredDistance;
22948/**
22949 * Alias for {@link vec2.squaredLength}
22950 * @function
22951 */
22952
22953var sqrLen = squaredLength;
22954/**
22955 * Perform some operation over an array of vec2s.
22956 *
22957 * @param {Array} a the array of vectors to iterate over
22958 * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed
22959 * @param {Number} offset Number of elements to skip at the beginning of the array
22960 * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array
22961 * @param {Function} fn Function to call for each vector in the array
22962 * @param {Object} [arg] additional argument to pass to fn
22963 * @returns {Array} a
22964 * @function
22965 */
22966
22967var forEach = function () {
22968 var vec = create();
22969 return function (a, stride, offset, count, fn, arg) {
22970 var i, l;
22971
22972 if (!stride) {
22973 stride = 2;
22974 }
22975
22976 if (!offset) {
22977 offset = 0;
22978 }
22979
22980 if (count) {
22981 l = Math.min(count * stride + offset, a.length);
22982 } else {
22983 l = a.length;
22984 }
22985
22986 for (i = offset; i < l; i += stride) {
22987 vec[0] = a[i];
22988 vec[1] = a[i + 1];
22989 fn(vec, vec, arg);
22990 a[i] = vec[0];
22991 a[i + 1] = vec[1];
22992 }
22993
22994 return a;
22995 };
22996}();
22997
22998var vec2 = /*#__PURE__*/Object.freeze({
22999__proto__: null,
23000create: create,
23001clone: clone,
23002fromValues: fromValues,
23003copy: copy,
23004set: set,
23005add: add,
23006subtract: subtract,
23007multiply: multiply,
23008divide: divide,
23009ceil: ceil,
23010floor: floor,
23011min: min,
23012max: max,
23013round: round,
23014scale: scale,
23015scaleAndAdd: scaleAndAdd,
23016distance: distance,
23017squaredDistance: squaredDistance,
23018length: length,
23019squaredLength: squaredLength,
23020negate: negate,
23021inverse: inverse,
23022normalize: normalize,
23023dot: dot$1,
23024cross: cross,
23025lerp: lerp,
23026random: random,
23027transformMat2: transformMat2,
23028transformMat2d: transformMat2d,
23029transformMat3: transformMat3,
23030transformMat4: transformMat4,
23031rotate: rotate,
23032angle: angle,
23033zero: zero,
23034str: str,
23035exactEquals: exactEquals,
23036equals: equals$1,
23037len: len,
23038sub: sub,
23039mul: mul,
23040div: div,
23041dist: dist,
23042sqrDist: sqrDist,
23043sqrLen: sqrLen,
23044forEach: forEach
23045});
23046
23047class CircleStyleLayer extends StyleLayer {
23048 constructor(layer) {
23049 super(layer, properties$8);
23050 }
23051 createBucket(parameters) {
23052 return new CircleBucket(parameters);
23053 }
23054 queryRadius(bucket) {
23055 const circleBucket = bucket;
23056 return getMaximumPaintValue('circle-radius', this, circleBucket) +
23057 getMaximumPaintValue('circle-stroke-width', this, circleBucket) +
23058 translateDistance(this.paint.get('circle-translate'));
23059 }
23060 queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits, pixelPosMatrix) {
23061 const translatedPolygon = translate$4(queryGeometry, this.paint.get('circle-translate'), this.paint.get('circle-translate-anchor'), transform.angle, pixelsToTileUnits);
23062 const radius = this.paint.get('circle-radius').evaluate(feature, featureState);
23063 const stroke = this.paint.get('circle-stroke-width').evaluate(feature, featureState);
23064 const size = radius + stroke;
23065 // For pitch-alignment: map, compare feature geometry to query geometry in the plane of the tile
23066 // // Otherwise, compare geometry in the plane of the viewport
23067 // // A circle with fixed scaling relative to the viewport gets larger in tile space as it moves into the distance
23068 // // A circle with fixed scaling relative to the map gets smaller in viewport space as it moves into the distance
23069 const alignWithMap = this.paint.get('circle-pitch-alignment') === 'map';
23070 const transformedPolygon = alignWithMap ? translatedPolygon : projectQueryGeometry$1(translatedPolygon, pixelPosMatrix);
23071 const transformedSize = alignWithMap ? size * pixelsToTileUnits : size;
23072 for (const ring of geometry) {
23073 for (const point of ring) {
23074 const transformedPoint = alignWithMap ? point : projectPoint(point, pixelPosMatrix);
23075 let adjustedSize = transformedSize;
23076 const projectedCenter = transformMat4$1([], [point.x, point.y, 0, 1], pixelPosMatrix);
23077 if (this.paint.get('circle-pitch-scale') === 'viewport' && this.paint.get('circle-pitch-alignment') === 'map') {
23078 adjustedSize *= projectedCenter[3] / transform.cameraToCenterDistance;
23079 }
23080 else if (this.paint.get('circle-pitch-scale') === 'map' && this.paint.get('circle-pitch-alignment') === 'viewport') {
23081 adjustedSize *= transform.cameraToCenterDistance / projectedCenter[3];
23082 }
23083 if (polygonIntersectsBufferedPoint(transformedPolygon, transformedPoint, adjustedSize))
23084 return true;
23085 }
23086 }
23087 return false;
23088 }
23089}
23090function projectPoint(p, pixelPosMatrix) {
23091 const point = transformMat4$1([], [p.x, p.y, 0, 1], pixelPosMatrix);
23092 return new pointGeometry(point[0] / point[3], point[1] / point[3]);
23093}
23094function projectQueryGeometry$1(queryGeometry, pixelPosMatrix) {
23095 return queryGeometry.map((p) => {
23096 return projectPoint(p, pixelPosMatrix);
23097 });
23098}
23099
23100class HeatmapBucket extends CircleBucket {
23101}
23102register('HeatmapBucket', HeatmapBucket, { omit: ['layers'] });
23103
23104// This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
23105const paint$7 = new Properties({
23106 "heatmap-radius": new DataDrivenProperty(spec["paint_heatmap"]["heatmap-radius"]),
23107 "heatmap-weight": new DataDrivenProperty(spec["paint_heatmap"]["heatmap-weight"]),
23108 "heatmap-intensity": new DataConstantProperty(spec["paint_heatmap"]["heatmap-intensity"]),
23109 "heatmap-color": new ColorRampProperty(spec["paint_heatmap"]["heatmap-color"]),
23110 "heatmap-opacity": new DataConstantProperty(spec["paint_heatmap"]["heatmap-opacity"]),
23111});
23112var properties$7 = { paint: paint$7 };
23113
23114function createImage(image, { width, height }, channels, data) {
23115 if (!data) {
23116 data = new Uint8Array(width * height * channels);
23117 }
23118 else if (data instanceof Uint8ClampedArray) {
23119 data = new Uint8Array(data.buffer);
23120 }
23121 else if (data.length !== width * height * channels) {
23122 throw new RangeError(`mismatched image size. expected: ${data.length} but got: ${width * height * channels}`);
23123 }
23124 image.width = width;
23125 image.height = height;
23126 image.data = data;
23127 return image;
23128}
23129function resizeImage(image, { width, height }, channels) {
23130 if (width === image.width && height === image.height) {
23131 return;
23132 }
23133 const newImage = createImage({}, { width, height }, channels);
23134 copyImage(image, newImage, { x: 0, y: 0 }, { x: 0, y: 0 }, {
23135 width: Math.min(image.width, width),
23136 height: Math.min(image.height, height)
23137 }, channels);
23138 image.width = width;
23139 image.height = height;
23140 image.data = newImage.data;
23141}
23142function copyImage(srcImg, dstImg, srcPt, dstPt, size, channels) {
23143 if (size.width === 0 || size.height === 0) {
23144 return dstImg;
23145 }
23146 if (size.width > srcImg.width ||
23147 size.height > srcImg.height ||
23148 srcPt.x > srcImg.width - size.width ||
23149 srcPt.y > srcImg.height - size.height) {
23150 throw new RangeError('out of range source coordinates for image copy');
23151 }
23152 if (size.width > dstImg.width ||
23153 size.height > dstImg.height ||
23154 dstPt.x > dstImg.width - size.width ||
23155 dstPt.y > dstImg.height - size.height) {
23156 throw new RangeError('out of range destination coordinates for image copy');
23157 }
23158 const srcData = srcImg.data;
23159 const dstData = dstImg.data;
23160 assert$1(srcData !== dstData);
23161 for (let y = 0; y < size.height; y++) {
23162 const srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels;
23163 const dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels;
23164 for (let i = 0; i < size.width * channels; i++) {
23165 dstData[dstOffset + i] = srcData[srcOffset + i];
23166 }
23167 }
23168 return dstImg;
23169}
23170class AlphaImage {
23171 constructor(size, data) {
23172 createImage(this, size, 1, data);
23173 }
23174 resize(size) {
23175 resizeImage(this, size, 1);
23176 }
23177 clone() {
23178 return new AlphaImage({ width: this.width, height: this.height }, new Uint8Array(this.data));
23179 }
23180 static copy(srcImg, dstImg, srcPt, dstPt, size) {
23181 copyImage(srcImg, dstImg, srcPt, dstPt, size, 1);
23182 }
23183}
23184// Not premultiplied, because ImageData is not premultiplied.
23185// UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture.
23186class RGBAImage {
23187 constructor(size, data) {
23188 createImage(this, size, 4, data);
23189 }
23190 resize(size) {
23191 resizeImage(this, size, 4);
23192 }
23193 replace(data, copy) {
23194 if (copy) {
23195 this.data.set(data);
23196 }
23197 else if (data instanceof Uint8ClampedArray) {
23198 this.data = new Uint8Array(data.buffer);
23199 }
23200 else {
23201 this.data = data;
23202 }
23203 }
23204 clone() {
23205 return new RGBAImage({ width: this.width, height: this.height }, new Uint8Array(this.data));
23206 }
23207 static copy(srcImg, dstImg, srcPt, dstPt, size) {
23208 copyImage(srcImg, dstImg, srcPt, dstPt, size, 4);
23209 }
23210}
23211register('AlphaImage', AlphaImage);
23212register('RGBAImage', RGBAImage);
23213
23214/**
23215 * Given an expression that should evaluate to a color ramp,
23216 * return a RGBA image representing that ramp expression.
23217 *
23218 * @private
23219 */
23220function renderColorRamp(params) {
23221 const evaluationGlobals = {};
23222 const width = params.resolution || 256;
23223 const height = params.clips ? params.clips.length : 1;
23224 const image = params.image || new RGBAImage({ width, height });
23225 assert$1(isPowerOfTwo(width));
23226 const renderPixel = (stride, index, progress) => {
23227 evaluationGlobals[params.evaluationKey] = progress;
23228 const pxColor = params.expression.evaluate(evaluationGlobals);
23229 // the colors are being unpremultiplied because Color uses
23230 // premultiplied values, and the Texture class expects unpremultiplied ones
23231 image.data[stride + index + 0] = Math.floor(pxColor.r * 255 / pxColor.a);
23232 image.data[stride + index + 1] = Math.floor(pxColor.g * 255 / pxColor.a);
23233 image.data[stride + index + 2] = Math.floor(pxColor.b * 255 / pxColor.a);
23234 image.data[stride + index + 3] = Math.floor(pxColor.a * 255);
23235 };
23236 if (!params.clips) {
23237 for (let i = 0, j = 0; i < width; i++, j += 4) {
23238 const progress = i / (width - 1);
23239 renderPixel(0, j, progress);
23240 }
23241 }
23242 else {
23243 for (let clip = 0, stride = 0; clip < height; ++clip, stride += width * 4) {
23244 for (let i = 0, j = 0; i < width; i++, j += 4) {
23245 // Remap progress between clips
23246 const progress = i / (width - 1);
23247 const { start, end } = params.clips[clip];
23248 const evaluationProgress = start * (1 - progress) + end * progress;
23249 renderPixel(stride, j, evaluationProgress);
23250 }
23251 }
23252 }
23253 return image;
23254}
23255
23256class HeatmapStyleLayer extends StyleLayer {
23257 constructor(layer) {
23258 super(layer, properties$7);
23259 // make sure color ramp texture is generated for default heatmap color too
23260 this._updateColorRamp();
23261 }
23262 createBucket(options) {
23263 return new HeatmapBucket(options);
23264 }
23265 _handleSpecialPaintPropertyUpdate(name) {
23266 if (name === 'heatmap-color') {
23267 this._updateColorRamp();
23268 }
23269 }
23270 _updateColorRamp() {
23271 const expression = this._transitionablePaint._values['heatmap-color'].value.expression;
23272 this.colorRamp = renderColorRamp({
23273 expression,
23274 evaluationKey: 'heatmapDensity',
23275 image: this.colorRamp
23276 });
23277 this.colorRampTexture = null;
23278 }
23279 resize() {
23280 if (this.heatmapFbo) {
23281 this.heatmapFbo.destroy();
23282 this.heatmapFbo = null;
23283 }
23284 }
23285 queryRadius() {
23286 return 0;
23287 }
23288 queryIntersectsFeature() {
23289 return false;
23290 }
23291 hasOffscreenPass() {
23292 return this.paint.get('heatmap-opacity') !== 0 && this.visibility !== 'none';
23293 }
23294}
23295
23296// This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
23297const paint$6 = new Properties({
23298 "hillshade-illumination-direction": new DataConstantProperty(spec["paint_hillshade"]["hillshade-illumination-direction"]),
23299 "hillshade-illumination-anchor": new DataConstantProperty(spec["paint_hillshade"]["hillshade-illumination-anchor"]),
23300 "hillshade-exaggeration": new DataConstantProperty(spec["paint_hillshade"]["hillshade-exaggeration"]),
23301 "hillshade-shadow-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-shadow-color"]),
23302 "hillshade-highlight-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-highlight-color"]),
23303 "hillshade-accent-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-accent-color"]),
23304});
23305var properties$6 = { paint: paint$6 };
23306
23307class HillshadeStyleLayer extends StyleLayer {
23308 constructor(layer) {
23309 super(layer, properties$6);
23310 }
23311 hasOffscreenPass() {
23312 return this.paint.get('hillshade-exaggeration') !== 0 && this.visibility !== 'none';
23313 }
23314}
23315
23316const layout$4 = createLayout([
23317 { name: 'a_pos', components: 2, type: 'Int16' }
23318], 4);
23319const { members: members$3, size: size$3, alignment: alignment$3 } = layout$4;
23320
23321var earcut$2 = {exports: {}};
23322
23323'use strict';
23324
23325earcut$2.exports = earcut;
23326var _default = earcut$2.exports.default = earcut;
23327
23328function earcut(data, holeIndices, dim) {
23329
23330 dim = dim || 2;
23331
23332 var hasHoles = holeIndices && holeIndices.length,
23333 outerLen = hasHoles ? holeIndices[0] * dim : data.length,
23334 outerNode = linkedList(data, 0, outerLen, dim, true),
23335 triangles = [];
23336
23337 if (!outerNode || outerNode.next === outerNode.prev) return triangles;
23338
23339 var minX, minY, maxX, maxY, x, y, invSize;
23340
23341 if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
23342
23343 // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
23344 if (data.length > 80 * dim) {
23345 minX = maxX = data[0];
23346 minY = maxY = data[1];
23347
23348 for (var i = dim; i < outerLen; i += dim) {
23349 x = data[i];
23350 y = data[i + 1];
23351 if (x < minX) minX = x;
23352 if (y < minY) minY = y;
23353 if (x > maxX) maxX = x;
23354 if (y > maxY) maxY = y;
23355 }
23356
23357 // minX, minY and invSize are later used to transform coords into integers for z-order calculation
23358 invSize = Math.max(maxX - minX, maxY - minY);
23359 invSize = invSize !== 0 ? 1 / invSize : 0;
23360 }
23361
23362 earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
23363
23364 return triangles;
23365}
23366
23367// create a circular doubly linked list from polygon points in the specified winding order
23368function linkedList(data, start, end, dim, clockwise) {
23369 var i, last;
23370
23371 if (clockwise === (signedArea$1(data, start, end, dim) > 0)) {
23372 for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);
23373 } else {
23374 for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);
23375 }
23376
23377 if (last && equals(last, last.next)) {
23378 removeNode(last);
23379 last = last.next;
23380 }
23381
23382 return last;
23383}
23384
23385// eliminate colinear or duplicate points
23386function filterPoints(start, end) {
23387 if (!start) return start;
23388 if (!end) end = start;
23389
23390 var p = start,
23391 again;
23392 do {
23393 again = false;
23394
23395 if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
23396 removeNode(p);
23397 p = end = p.prev;
23398 if (p === p.next) break;
23399 again = true;
23400
23401 } else {
23402 p = p.next;
23403 }
23404 } while (again || p !== end);
23405
23406 return end;
23407}
23408
23409// main ear slicing loop which triangulates a polygon (given as a linked list)
23410function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
23411 if (!ear) return;
23412
23413 // interlink polygon nodes in z-order
23414 if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
23415
23416 var stop = ear,
23417 prev, next;
23418
23419 // iterate through ears, slicing them one by one
23420 while (ear.prev !== ear.next) {
23421 prev = ear.prev;
23422 next = ear.next;
23423
23424 if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
23425 // cut off the triangle
23426 triangles.push(prev.i / dim);
23427 triangles.push(ear.i / dim);
23428 triangles.push(next.i / dim);
23429
23430 removeNode(ear);
23431
23432 // skipping the next vertex leads to less sliver triangles
23433 ear = next.next;
23434 stop = next.next;
23435
23436 continue;
23437 }
23438
23439 ear = next;
23440
23441 // if we looped through the whole remaining polygon and can't find any more ears
23442 if (ear === stop) {
23443 // try filtering points and slicing again
23444 if (!pass) {
23445 earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
23446
23447 // if this didn't work, try curing all small self-intersections locally
23448 } else if (pass === 1) {
23449 ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
23450 earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
23451
23452 // as a last resort, try splitting the remaining polygon into two
23453 } else if (pass === 2) {
23454 splitEarcut(ear, triangles, dim, minX, minY, invSize);
23455 }
23456
23457 break;
23458 }
23459 }
23460}
23461
23462// check whether a polygon node forms a valid ear with adjacent nodes
23463function isEar(ear) {
23464 var a = ear.prev,
23465 b = ear,
23466 c = ear.next;
23467
23468 if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
23469
23470 // now make sure we don't have other points inside the potential ear
23471 var p = ear.next.next;
23472
23473 while (p !== ear.prev) {
23474 if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
23475 area(p.prev, p, p.next) >= 0) return false;
23476 p = p.next;
23477 }
23478
23479 return true;
23480}
23481
23482function isEarHashed(ear, minX, minY, invSize) {
23483 var a = ear.prev,
23484 b = ear,
23485 c = ear.next;
23486
23487 if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
23488
23489 // triangle bbox; min & max are calculated like this for speed
23490 var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
23491 minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
23492 maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
23493 maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
23494
23495 // z-order range for the current triangle bbox;
23496 var minZ = zOrder(minTX, minTY, minX, minY, invSize),
23497 maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
23498
23499 var p = ear.prevZ,
23500 n = ear.nextZ;
23501
23502 // look for points inside the triangle in both directions
23503 while (p && p.z >= minZ && n && n.z <= maxZ) {
23504 if (p !== ear.prev && p !== ear.next &&
23505 pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
23506 area(p.prev, p, p.next) >= 0) return false;
23507 p = p.prevZ;
23508
23509 if (n !== ear.prev && n !== ear.next &&
23510 pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
23511 area(n.prev, n, n.next) >= 0) return false;
23512 n = n.nextZ;
23513 }
23514
23515 // look for remaining points in decreasing z-order
23516 while (p && p.z >= minZ) {
23517 if (p !== ear.prev && p !== ear.next &&
23518 pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
23519 area(p.prev, p, p.next) >= 0) return false;
23520 p = p.prevZ;
23521 }
23522
23523 // look for remaining points in increasing z-order
23524 while (n && n.z <= maxZ) {
23525 if (n !== ear.prev && n !== ear.next &&
23526 pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
23527 area(n.prev, n, n.next) >= 0) return false;
23528 n = n.nextZ;
23529 }
23530
23531 return true;
23532}
23533
23534// go through all polygon nodes and cure small local self-intersections
23535function cureLocalIntersections(start, triangles, dim) {
23536 var p = start;
23537 do {
23538 var a = p.prev,
23539 b = p.next.next;
23540
23541 if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
23542
23543 triangles.push(a.i / dim);
23544 triangles.push(p.i / dim);
23545 triangles.push(b.i / dim);
23546
23547 // remove two nodes involved
23548 removeNode(p);
23549 removeNode(p.next);
23550
23551 p = start = b;
23552 }
23553 p = p.next;
23554 } while (p !== start);
23555
23556 return filterPoints(p);
23557}
23558
23559// try splitting polygon into two and triangulate them independently
23560function splitEarcut(start, triangles, dim, minX, minY, invSize) {
23561 // look for a valid diagonal that divides the polygon into two
23562 var a = start;
23563 do {
23564 var b = a.next.next;
23565 while (b !== a.prev) {
23566 if (a.i !== b.i && isValidDiagonal(a, b)) {
23567 // split the polygon in two by the diagonal
23568 var c = splitPolygon(a, b);
23569
23570 // filter colinear points around the cuts
23571 a = filterPoints(a, a.next);
23572 c = filterPoints(c, c.next);
23573
23574 // run earcut on each half
23575 earcutLinked(a, triangles, dim, minX, minY, invSize);
23576 earcutLinked(c, triangles, dim, minX, minY, invSize);
23577 return;
23578 }
23579 b = b.next;
23580 }
23581 a = a.next;
23582 } while (a !== start);
23583}
23584
23585// link every hole into the outer loop, producing a single-ring polygon without holes
23586function eliminateHoles(data, holeIndices, outerNode, dim) {
23587 var queue = [],
23588 i, len, start, end, list;
23589
23590 for (i = 0, len = holeIndices.length; i < len; i++) {
23591 start = holeIndices[i] * dim;
23592 end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
23593 list = linkedList(data, start, end, dim, false);
23594 if (list === list.next) list.steiner = true;
23595 queue.push(getLeftmost(list));
23596 }
23597
23598 queue.sort(compareX);
23599
23600 // process holes from left to right
23601 for (i = 0; i < queue.length; i++) {
23602 outerNode = eliminateHole(queue[i], outerNode);
23603 outerNode = filterPoints(outerNode, outerNode.next);
23604 }
23605
23606 return outerNode;
23607}
23608
23609function compareX(a, b) {
23610 return a.x - b.x;
23611}
23612
23613// find a bridge between vertices that connects hole with an outer ring and and link it
23614function eliminateHole(hole, outerNode) {
23615 var bridge = findHoleBridge(hole, outerNode);
23616 if (!bridge) {
23617 return outerNode;
23618 }
23619
23620 var bridgeReverse = splitPolygon(bridge, hole);
23621
23622 // filter collinear points around the cuts
23623 var filteredBridge = filterPoints(bridge, bridge.next);
23624 filterPoints(bridgeReverse, bridgeReverse.next);
23625
23626 // Check if input node was removed by the filtering
23627 return outerNode === bridge ? filteredBridge : outerNode;
23628}
23629
23630// David Eberly's algorithm for finding a bridge between hole and outer polygon
23631function findHoleBridge(hole, outerNode) {
23632 var p = outerNode,
23633 hx = hole.x,
23634 hy = hole.y,
23635 qx = -Infinity,
23636 m;
23637
23638 // find a segment intersected by a ray from the hole's leftmost point to the left;
23639 // segment's endpoint with lesser x will be potential connection point
23640 do {
23641 if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
23642 var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
23643 if (x <= hx && x > qx) {
23644 qx = x;
23645 if (x === hx) {
23646 if (hy === p.y) return p;
23647 if (hy === p.next.y) return p.next;
23648 }
23649 m = p.x < p.next.x ? p : p.next;
23650 }
23651 }
23652 p = p.next;
23653 } while (p !== outerNode);
23654
23655 if (!m) return null;
23656
23657 if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint
23658
23659 // look for points inside the triangle of hole point, segment intersection and endpoint;
23660 // if there are no points found, we have a valid connection;
23661 // otherwise choose the point of the minimum angle with the ray as connection point
23662
23663 var stop = m,
23664 mx = m.x,
23665 my = m.y,
23666 tanMin = Infinity,
23667 tan;
23668
23669 p = m;
23670
23671 do {
23672 if (hx >= p.x && p.x >= mx && hx !== p.x &&
23673 pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
23674
23675 tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
23676
23677 if (locallyInside(p, hole) &&
23678 (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {
23679 m = p;
23680 tanMin = tan;
23681 }
23682 }
23683
23684 p = p.next;
23685 } while (p !== stop);
23686
23687 return m;
23688}
23689
23690// whether sector in vertex m contains sector in vertex p in the same coordinates
23691function sectorContainsSector(m, p) {
23692 return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
23693}
23694
23695// interlink polygon nodes in z-order
23696function indexCurve(start, minX, minY, invSize) {
23697 var p = start;
23698 do {
23699 if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);
23700 p.prevZ = p.prev;
23701 p.nextZ = p.next;
23702 p = p.next;
23703 } while (p !== start);
23704
23705 p.prevZ.nextZ = null;
23706 p.prevZ = null;
23707
23708 sortLinked(p);
23709}
23710
23711// Simon Tatham's linked list merge sort algorithm
23712// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
23713function sortLinked(list) {
23714 var i, p, q, e, tail, numMerges, pSize, qSize,
23715 inSize = 1;
23716
23717 do {
23718 p = list;
23719 list = null;
23720 tail = null;
23721 numMerges = 0;
23722
23723 while (p) {
23724 numMerges++;
23725 q = p;
23726 pSize = 0;
23727 for (i = 0; i < inSize; i++) {
23728 pSize++;
23729 q = q.nextZ;
23730 if (!q) break;
23731 }
23732 qSize = inSize;
23733
23734 while (pSize > 0 || (qSize > 0 && q)) {
23735
23736 if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
23737 e = p;
23738 p = p.nextZ;
23739 pSize--;
23740 } else {
23741 e = q;
23742 q = q.nextZ;
23743 qSize--;
23744 }
23745
23746 if (tail) tail.nextZ = e;
23747 else list = e;
23748
23749 e.prevZ = tail;
23750 tail = e;
23751 }
23752
23753 p = q;
23754 }
23755
23756 tail.nextZ = null;
23757 inSize *= 2;
23758
23759 } while (numMerges > 1);
23760
23761 return list;
23762}
23763
23764// z-order of a point given coords and inverse of the longer side of data bbox
23765function zOrder(x, y, minX, minY, invSize) {
23766 // coords are transformed into non-negative 15-bit integer range
23767 x = 32767 * (x - minX) * invSize;
23768 y = 32767 * (y - minY) * invSize;
23769
23770 x = (x | (x << 8)) & 0x00FF00FF;
23771 x = (x | (x << 4)) & 0x0F0F0F0F;
23772 x = (x | (x << 2)) & 0x33333333;
23773 x = (x | (x << 1)) & 0x55555555;
23774
23775 y = (y | (y << 8)) & 0x00FF00FF;
23776 y = (y | (y << 4)) & 0x0F0F0F0F;
23777 y = (y | (y << 2)) & 0x33333333;
23778 y = (y | (y << 1)) & 0x55555555;
23779
23780 return x | (y << 1);
23781}
23782
23783// find the leftmost node of a polygon ring
23784function getLeftmost(start) {
23785 var p = start,
23786 leftmost = start;
23787 do {
23788 if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;
23789 p = p.next;
23790 } while (p !== start);
23791
23792 return leftmost;
23793}
23794
23795// check if a point lies within a convex triangle
23796function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
23797 return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
23798 (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
23799 (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
23800}
23801
23802// check if a diagonal between two polygon nodes is valid (lies in polygon interior)
23803function isValidDiagonal(a, b) {
23804 return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges
23805 (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
23806 (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors
23807 equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
23808}
23809
23810// signed area of a triangle
23811function area(p, q, r) {
23812 return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
23813}
23814
23815// check if two points are equal
23816function equals(p1, p2) {
23817 return p1.x === p2.x && p1.y === p2.y;
23818}
23819
23820// check if two segments intersect
23821function intersects(p1, q1, p2, q2) {
23822 var o1 = sign(area(p1, q1, p2));
23823 var o2 = sign(area(p1, q1, q2));
23824 var o3 = sign(area(p2, q2, p1));
23825 var o4 = sign(area(p2, q2, q1));
23826
23827 if (o1 !== o2 && o3 !== o4) return true; // general case
23828
23829 if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
23830 if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
23831 if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
23832 if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
23833
23834 return false;
23835}
23836
23837// for collinear points p, q, r, check if point q lies on segment pr
23838function onSegment(p, q, r) {
23839 return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);
23840}
23841
23842function sign(num) {
23843 return num > 0 ? 1 : num < 0 ? -1 : 0;
23844}
23845
23846// check if a polygon diagonal intersects any polygon segments
23847function intersectsPolygon(a, b) {
23848 var p = a;
23849 do {
23850 if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
23851 intersects(p, p.next, a, b)) return true;
23852 p = p.next;
23853 } while (p !== a);
23854
23855 return false;
23856}
23857
23858// check if a polygon diagonal is locally inside the polygon
23859function locallyInside(a, b) {
23860 return area(a.prev, a, a.next) < 0 ?
23861 area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
23862 area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
23863}
23864
23865// check if the middle point of a polygon diagonal is inside the polygon
23866function middleInside(a, b) {
23867 var p = a,
23868 inside = false,
23869 px = (a.x + b.x) / 2,
23870 py = (a.y + b.y) / 2;
23871 do {
23872 if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
23873 (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
23874 inside = !inside;
23875 p = p.next;
23876 } while (p !== a);
23877
23878 return inside;
23879}
23880
23881// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
23882// if one belongs to the outer ring and another to a hole, it merges it into a single ring
23883function splitPolygon(a, b) {
23884 var a2 = new Node(a.i, a.x, a.y),
23885 b2 = new Node(b.i, b.x, b.y),
23886 an = a.next,
23887 bp = b.prev;
23888
23889 a.next = b;
23890 b.prev = a;
23891
23892 a2.next = an;
23893 an.prev = a2;
23894
23895 b2.next = a2;
23896 a2.prev = b2;
23897
23898 bp.next = b2;
23899 b2.prev = bp;
23900
23901 return b2;
23902}
23903
23904// create a node and optionally link it with previous one (in a circular doubly linked list)
23905function insertNode(i, x, y, last) {
23906 var p = new Node(i, x, y);
23907
23908 if (!last) {
23909 p.prev = p;
23910 p.next = p;
23911
23912 } else {
23913 p.next = last.next;
23914 p.prev = last;
23915 last.next.prev = p;
23916 last.next = p;
23917 }
23918 return p;
23919}
23920
23921function removeNode(p) {
23922 p.next.prev = p.prev;
23923 p.prev.next = p.next;
23924
23925 if (p.prevZ) p.prevZ.nextZ = p.nextZ;
23926 if (p.nextZ) p.nextZ.prevZ = p.prevZ;
23927}
23928
23929function Node(i, x, y) {
23930 // vertex index in coordinates array
23931 this.i = i;
23932
23933 // vertex coordinates
23934 this.x = x;
23935 this.y = y;
23936
23937 // previous and next vertex nodes in a polygon ring
23938 this.prev = null;
23939 this.next = null;
23940
23941 // z-order curve value
23942 this.z = null;
23943
23944 // previous and next nodes in z-order
23945 this.prevZ = null;
23946 this.nextZ = null;
23947
23948 // indicates whether this is a steiner point
23949 this.steiner = false;
23950}
23951
23952// return a percentage difference between the polygon area and its triangulation area;
23953// used to verify correctness of triangulation
23954earcut.deviation = function (data, holeIndices, dim, triangles) {
23955 var hasHoles = holeIndices && holeIndices.length;
23956 var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
23957
23958 var polygonArea = Math.abs(signedArea$1(data, 0, outerLen, dim));
23959 if (hasHoles) {
23960 for (var i = 0, len = holeIndices.length; i < len; i++) {
23961 var start = holeIndices[i] * dim;
23962 var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
23963 polygonArea -= Math.abs(signedArea$1(data, start, end, dim));
23964 }
23965 }
23966
23967 var trianglesArea = 0;
23968 for (i = 0; i < triangles.length; i += 3) {
23969 var a = triangles[i] * dim;
23970 var b = triangles[i + 1] * dim;
23971 var c = triangles[i + 2] * dim;
23972 trianglesArea += Math.abs(
23973 (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
23974 (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
23975 }
23976
23977 return polygonArea === 0 && trianglesArea === 0 ? 0 :
23978 Math.abs((trianglesArea - polygonArea) / polygonArea);
23979};
23980
23981function signedArea$1(data, start, end, dim) {
23982 var sum = 0;
23983 for (var i = start, j = end - dim; i < end; i += dim) {
23984 sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
23985 j = i;
23986 }
23987 return sum;
23988}
23989
23990// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
23991earcut.flatten = function (data) {
23992 var dim = data[0][0].length,
23993 result = {vertices: [], holes: [], dimensions: dim},
23994 holeIndex = 0;
23995
23996 for (var i = 0; i < data.length; i++) {
23997 for (var j = 0; j < data[i].length; j++) {
23998 for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);
23999 }
24000 if (i > 0) {
24001 holeIndex += data[i - 1].length;
24002 result.holes.push(holeIndex);
24003 }
24004 }
24005 return result;
24006};
24007
24008var earcut$1 = earcut$2.exports;
24009
24010function quickselect(arr, k, left, right, compare) {
24011 quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare$1);
24012}
24013
24014function quickselectStep(arr, k, left, right, compare) {
24015
24016 while (right > left) {
24017 if (right - left > 600) {
24018 var n = right - left + 1;
24019 var m = k - left + 1;
24020 var z = Math.log(n);
24021 var s = 0.5 * Math.exp(2 * z / 3);
24022 var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
24023 var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
24024 var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
24025 quickselectStep(arr, k, newLeft, newRight, compare);
24026 }
24027
24028 var t = arr[k];
24029 var i = left;
24030 var j = right;
24031
24032 swap(arr, left, k);
24033 if (compare(arr[right], t) > 0) swap(arr, left, right);
24034
24035 while (i < j) {
24036 swap(arr, i, j);
24037 i++;
24038 j--;
24039 while (compare(arr[i], t) < 0) i++;
24040 while (compare(arr[j], t) > 0) j--;
24041 }
24042
24043 if (compare(arr[left], t) === 0) swap(arr, left, j);
24044 else {
24045 j++;
24046 swap(arr, j, right);
24047 }
24048
24049 if (j <= k) left = j + 1;
24050 if (k <= j) right = j - 1;
24051 }
24052}
24053
24054function swap(arr, i, j) {
24055 var tmp = arr[i];
24056 arr[i] = arr[j];
24057 arr[j] = tmp;
24058}
24059
24060function defaultCompare$1(a, b) {
24061 return a < b ? -1 : a > b ? 1 : 0;
24062}
24063
24064// classifies an array of rings into polygons with outer rings and holes
24065function classifyRings$1(rings, maxRings) {
24066 const len = rings.length;
24067 if (len <= 1)
24068 return [rings];
24069 const polygons = [];
24070 let polygon, ccw;
24071 for (let i = 0; i < len; i++) {
24072 const area = calculateSignedArea(rings[i]);
24073 if (area === 0)
24074 continue;
24075 rings[i].area = Math.abs(area);
24076 if (ccw === undefined)
24077 ccw = area < 0;
24078 if (ccw === area < 0) {
24079 if (polygon)
24080 polygons.push(polygon);
24081 polygon = [rings[i]];
24082 }
24083 else {
24084 polygon.push(rings[i]);
24085 }
24086 }
24087 if (polygon)
24088 polygons.push(polygon);
24089 // Earcut performance degrades with the # of rings in a polygon. For this
24090 // reason, we limit strip out all but the `maxRings` largest rings.
24091 if (maxRings > 1) {
24092 for (let j = 0; j < polygons.length; j++) {
24093 if (polygons[j].length <= maxRings)
24094 continue;
24095 quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas);
24096 polygons[j] = polygons[j].slice(0, maxRings);
24097 }
24098 }
24099 return polygons;
24100}
24101function compareAreas(a, b) {
24102 return b.area - a.area;
24103}
24104
24105function hasPattern(type, layers, options) {
24106 const patterns = options.patternDependencies;
24107 let hasPattern = false;
24108 for (const layer of layers) {
24109 const patternProperty = layer.paint.get(`${type}-pattern`);
24110 if (!patternProperty.isConstant()) {
24111 hasPattern = true;
24112 }
24113 const constantPattern = patternProperty.constantOr(null);
24114 if (constantPattern) {
24115 hasPattern = true;
24116 patterns[constantPattern.to] = true;
24117 patterns[constantPattern.from] = true;
24118 }
24119 }
24120 return hasPattern;
24121}
24122function addPatternDependencies(type, layers, patternFeature, zoom, options) {
24123 const patterns = options.patternDependencies;
24124 for (const layer of layers) {
24125 const patternProperty = layer.paint.get(`${type}-pattern`);
24126 const patternPropertyValue = patternProperty.value;
24127 if (patternPropertyValue.kind !== 'constant') {
24128 let min = patternPropertyValue.evaluate({ zoom: zoom - 1 }, patternFeature, {}, options.availableImages);
24129 let mid = patternPropertyValue.evaluate({ zoom }, patternFeature, {}, options.availableImages);
24130 let max = patternPropertyValue.evaluate({ zoom: zoom + 1 }, patternFeature, {}, options.availableImages);
24131 min = min && min.name ? min.name : min;
24132 mid = mid && mid.name ? mid.name : mid;
24133 max = max && max.name ? max.name : max;
24134 // add to patternDependencies
24135 patterns[min] = true;
24136 patterns[mid] = true;
24137 patterns[max] = true;
24138 // save for layout
24139 patternFeature.patterns[layer.id] = { min, mid, max };
24140 }
24141 }
24142 return patternFeature;
24143}
24144
24145const EARCUT_MAX_RINGS$1 = 500;
24146class FillBucket {
24147 constructor(options) {
24148 this.zoom = options.zoom;
24149 this.overscaling = options.overscaling;
24150 this.layers = options.layers;
24151 this.layerIds = this.layers.map(layer => layer.id);
24152 this.index = options.index;
24153 this.hasPattern = false;
24154 this.patternFeatures = [];
24155 this.layoutVertexArray = new FillLayoutArray();
24156 this.indexArray = new TriangleIndexArray();
24157 this.indexArray2 = new LineIndexArray();
24158 this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);
24159 this.segments = new SegmentVector();
24160 this.segments2 = new SegmentVector();
24161 this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
24162 }
24163 populate(features, options, canonical) {
24164 this.hasPattern = hasPattern('fill', this.layers, options);
24165 const fillSortKey = this.layers[0].layout.get('fill-sort-key');
24166 const sortFeaturesByKey = !fillSortKey.isConstant();
24167 const bucketFeatures = [];
24168 for (const { feature, id, index, sourceLayerIndex } of features) {
24169 const needGeometry = this.layers[0]._featureFilter.needGeometry;
24170 const evaluationFeature = toEvaluationFeature(feature, needGeometry);
24171 if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical))
24172 continue;
24173 const sortKey = sortFeaturesByKey ?
24174 fillSortKey.evaluate(evaluationFeature, {}, canonical, options.availableImages) :
24175 undefined;
24176 const bucketFeature = {
24177 id,
24178 properties: feature.properties,
24179 type: feature.type,
24180 sourceLayerIndex,
24181 index,
24182 geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature),
24183 patterns: {},
24184 sortKey
24185 };
24186 bucketFeatures.push(bucketFeature);
24187 }
24188 if (sortFeaturesByKey) {
24189 bucketFeatures.sort((a, b) => a.sortKey - b.sortKey);
24190 }
24191 for (const bucketFeature of bucketFeatures) {
24192 const { geometry, index, sourceLayerIndex } = bucketFeature;
24193 if (this.hasPattern) {
24194 const patternFeature = addPatternDependencies('fill', this.layers, bucketFeature, this.zoom, options);
24195 // pattern features are added only once the pattern is loaded into the image atlas
24196 // so are stored during populate until later updated with positions by tile worker in addFeatures
24197 this.patternFeatures.push(patternFeature);
24198 }
24199 else {
24200 this.addFeature(bucketFeature, geometry, index, canonical, {});
24201 }
24202 const feature = features[index].feature;
24203 options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);
24204 }
24205 }
24206 update(states, vtLayer, imagePositions) {
24207 if (!this.stateDependentLayers.length)
24208 return;
24209 this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
24210 }
24211 addFeatures(options, canonical, imagePositions) {
24212 for (const feature of this.patternFeatures) {
24213 this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions);
24214 }
24215 }
24216 isEmpty() {
24217 return this.layoutVertexArray.length === 0;
24218 }
24219 uploadPending() {
24220 return !this.uploaded || this.programConfigurations.needsUpload;
24221 }
24222 upload(context) {
24223 if (!this.uploaded) {
24224 this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$3);
24225 this.indexBuffer = context.createIndexBuffer(this.indexArray);
24226 this.indexBuffer2 = context.createIndexBuffer(this.indexArray2);
24227 }
24228 this.programConfigurations.upload(context);
24229 this.uploaded = true;
24230 }
24231 destroy() {
24232 if (!this.layoutVertexBuffer)
24233 return;
24234 this.layoutVertexBuffer.destroy();
24235 this.indexBuffer.destroy();
24236 this.indexBuffer2.destroy();
24237 this.programConfigurations.destroy();
24238 this.segments.destroy();
24239 this.segments2.destroy();
24240 }
24241 addFeature(feature, geometry, index, canonical, imagePositions) {
24242 for (const polygon of classifyRings$1(geometry, EARCUT_MAX_RINGS$1)) {
24243 let numVertices = 0;
24244 for (const ring of polygon) {
24245 numVertices += ring.length;
24246 }
24247 const triangleSegment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray);
24248 const triangleIndex = triangleSegment.vertexLength;
24249 const flattened = [];
24250 const holeIndices = [];
24251 for (const ring of polygon) {
24252 if (ring.length === 0) {
24253 continue;
24254 }
24255 if (ring !== polygon[0]) {
24256 holeIndices.push(flattened.length / 2);
24257 }
24258 const lineSegment = this.segments2.prepareSegment(ring.length, this.layoutVertexArray, this.indexArray2);
24259 const lineIndex = lineSegment.vertexLength;
24260 this.layoutVertexArray.emplaceBack(ring[0].x, ring[0].y);
24261 this.indexArray2.emplaceBack(lineIndex + ring.length - 1, lineIndex);
24262 flattened.push(ring[0].x);
24263 flattened.push(ring[0].y);
24264 for (let i = 1; i < ring.length; i++) {
24265 this.layoutVertexArray.emplaceBack(ring[i].x, ring[i].y);
24266 this.indexArray2.emplaceBack(lineIndex + i - 1, lineIndex + i);
24267 flattened.push(ring[i].x);
24268 flattened.push(ring[i].y);
24269 }
24270 lineSegment.vertexLength += ring.length;
24271 lineSegment.primitiveLength += ring.length;
24272 }
24273 const indices = earcut$1(flattened, holeIndices);
24274 assert$1(indices.length % 3 === 0);
24275 for (let i = 0; i < indices.length; i += 3) {
24276 this.indexArray.emplaceBack(triangleIndex + indices[i], triangleIndex + indices[i + 1], triangleIndex + indices[i + 2]);
24277 }
24278 triangleSegment.vertexLength += numVertices;
24279 triangleSegment.primitiveLength += indices.length / 3;
24280 }
24281 this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical);
24282 }
24283}
24284register('FillBucket', FillBucket, { omit: ['layers', 'patternFeatures'] });
24285
24286// This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
24287const layout$3 = new Properties({
24288 "fill-sort-key": new DataDrivenProperty(spec["layout_fill"]["fill-sort-key"]),
24289});
24290const paint$5 = new Properties({
24291 "fill-antialias": new DataConstantProperty(spec["paint_fill"]["fill-antialias"]),
24292 "fill-opacity": new DataDrivenProperty(spec["paint_fill"]["fill-opacity"]),
24293 "fill-color": new DataDrivenProperty(spec["paint_fill"]["fill-color"]),
24294 "fill-outline-color": new DataDrivenProperty(spec["paint_fill"]["fill-outline-color"]),
24295 "fill-translate": new DataConstantProperty(spec["paint_fill"]["fill-translate"]),
24296 "fill-translate-anchor": new DataConstantProperty(spec["paint_fill"]["fill-translate-anchor"]),
24297 "fill-pattern": new CrossFadedDataDrivenProperty(spec["paint_fill"]["fill-pattern"]),
24298});
24299var properties$5 = { paint: paint$5, layout: layout$3 };
24300
24301class FillStyleLayer extends StyleLayer {
24302 constructor(layer) {
24303 super(layer, properties$5);
24304 }
24305 recalculate(parameters, availableImages) {
24306 super.recalculate(parameters, availableImages);
24307 const outlineColor = this.paint._values['fill-outline-color'];
24308 if (outlineColor.value.kind === 'constant' && outlineColor.value.value === undefined) {
24309 this.paint._values['fill-outline-color'] = this.paint._values['fill-color'];
24310 }
24311 }
24312 createBucket(parameters) {
24313 return new FillBucket(parameters);
24314 }
24315 queryRadius() {
24316 return translateDistance(this.paint.get('fill-translate'));
24317 }
24318 queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits) {
24319 const translatedPolygon = translate$4(queryGeometry, this.paint.get('fill-translate'), this.paint.get('fill-translate-anchor'), transform.angle, pixelsToTileUnits);
24320 return polygonIntersectsMultiPolygon(translatedPolygon, geometry);
24321 }
24322 isTileClipped() {
24323 return true;
24324 }
24325}
24326
24327const layout$2 = createLayout([
24328 { name: 'a_pos', components: 2, type: 'Int16' },
24329 { name: 'a_normal_ed', components: 4, type: 'Int16' },
24330], 4);
24331const { members: members$2, size: size$2, alignment: alignment$2 } = layout$2;
24332
24333var vectorTile = {};
24334
24335'use strict';
24336
24337var Point = pointGeometry;
24338
24339var vectortilefeature = VectorTileFeature$2;
24340
24341function VectorTileFeature$2(pbf, end, extent, keys, values) {
24342 // Public
24343 this.properties = {};
24344 this.extent = extent;
24345 this.type = 0;
24346
24347 // Private
24348 this._pbf = pbf;
24349 this._geometry = -1;
24350 this._keys = keys;
24351 this._values = values;
24352
24353 pbf.readFields(readFeature, this, end);
24354}
24355
24356function readFeature(tag, feature, pbf) {
24357 if (tag == 1) feature.id = pbf.readVarint();
24358 else if (tag == 2) readTag(pbf, feature);
24359 else if (tag == 3) feature.type = pbf.readVarint();
24360 else if (tag == 4) feature._geometry = pbf.pos;
24361}
24362
24363function readTag(pbf, feature) {
24364 var end = pbf.readVarint() + pbf.pos;
24365
24366 while (pbf.pos < end) {
24367 var key = feature._keys[pbf.readVarint()],
24368 value = feature._values[pbf.readVarint()];
24369 feature.properties[key] = value;
24370 }
24371}
24372
24373VectorTileFeature$2.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
24374
24375VectorTileFeature$2.prototype.loadGeometry = function() {
24376 var pbf = this._pbf;
24377 pbf.pos = this._geometry;
24378
24379 var end = pbf.readVarint() + pbf.pos,
24380 cmd = 1,
24381 length = 0,
24382 x = 0,
24383 y = 0,
24384 lines = [],
24385 line;
24386
24387 while (pbf.pos < end) {
24388 if (length <= 0) {
24389 var cmdLen = pbf.readVarint();
24390 cmd = cmdLen & 0x7;
24391 length = cmdLen >> 3;
24392 }
24393
24394 length--;
24395
24396 if (cmd === 1 || cmd === 2) {
24397 x += pbf.readSVarint();
24398 y += pbf.readSVarint();
24399
24400 if (cmd === 1) { // moveTo
24401 if (line) lines.push(line);
24402 line = [];
24403 }
24404
24405 line.push(new Point(x, y));
24406
24407 } else if (cmd === 7) {
24408
24409 // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
24410 if (line) {
24411 line.push(line[0].clone()); // closePolygon
24412 }
24413
24414 } else {
24415 throw new Error('unknown command ' + cmd);
24416 }
24417 }
24418
24419 if (line) lines.push(line);
24420
24421 return lines;
24422};
24423
24424VectorTileFeature$2.prototype.bbox = function() {
24425 var pbf = this._pbf;
24426 pbf.pos = this._geometry;
24427
24428 var end = pbf.readVarint() + pbf.pos,
24429 cmd = 1,
24430 length = 0,
24431 x = 0,
24432 y = 0,
24433 x1 = Infinity,
24434 x2 = -Infinity,
24435 y1 = Infinity,
24436 y2 = -Infinity;
24437
24438 while (pbf.pos < end) {
24439 if (length <= 0) {
24440 var cmdLen = pbf.readVarint();
24441 cmd = cmdLen & 0x7;
24442 length = cmdLen >> 3;
24443 }
24444
24445 length--;
24446
24447 if (cmd === 1 || cmd === 2) {
24448 x += pbf.readSVarint();
24449 y += pbf.readSVarint();
24450 if (x < x1) x1 = x;
24451 if (x > x2) x2 = x;
24452 if (y < y1) y1 = y;
24453 if (y > y2) y2 = y;
24454
24455 } else if (cmd !== 7) {
24456 throw new Error('unknown command ' + cmd);
24457 }
24458 }
24459
24460 return [x1, y1, x2, y2];
24461};
24462
24463VectorTileFeature$2.prototype.toGeoJSON = function(x, y, z) {
24464 var size = this.extent * Math.pow(2, z),
24465 x0 = this.extent * x,
24466 y0 = this.extent * y,
24467 coords = this.loadGeometry(),
24468 type = VectorTileFeature$2.types[this.type],
24469 i, j;
24470
24471 function project(line) {
24472 for (var j = 0; j < line.length; j++) {
24473 var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
24474 line[j] = [
24475 (p.x + x0) * 360 / size - 180,
24476 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
24477 ];
24478 }
24479 }
24480
24481 switch (this.type) {
24482 case 1:
24483 var points = [];
24484 for (i = 0; i < coords.length; i++) {
24485 points[i] = coords[i][0];
24486 }
24487 coords = points;
24488 project(coords);
24489 break;
24490
24491 case 2:
24492 for (i = 0; i < coords.length; i++) {
24493 project(coords[i]);
24494 }
24495 break;
24496
24497 case 3:
24498 coords = classifyRings(coords);
24499 for (i = 0; i < coords.length; i++) {
24500 for (j = 0; j < coords[i].length; j++) {
24501 project(coords[i][j]);
24502 }
24503 }
24504 break;
24505 }
24506
24507 if (coords.length === 1) {
24508 coords = coords[0];
24509 } else {
24510 type = 'Multi' + type;
24511 }
24512
24513 var result = {
24514 type: "Feature",
24515 geometry: {
24516 type: type,
24517 coordinates: coords
24518 },
24519 properties: this.properties
24520 };
24521
24522 if ('id' in this) {
24523 result.id = this.id;
24524 }
24525
24526 return result;
24527};
24528
24529// classifies an array of rings into polygons with outer rings and holes
24530
24531function classifyRings(rings) {
24532 var len = rings.length;
24533
24534 if (len <= 1) return [rings];
24535
24536 var polygons = [],
24537 polygon,
24538 ccw;
24539
24540 for (var i = 0; i < len; i++) {
24541 var area = signedArea(rings[i]);
24542 if (area === 0) continue;
24543
24544 if (ccw === undefined) ccw = area < 0;
24545
24546 if (ccw === area < 0) {
24547 if (polygon) polygons.push(polygon);
24548 polygon = [rings[i]];
24549
24550 } else {
24551 polygon.push(rings[i]);
24552 }
24553 }
24554 if (polygon) polygons.push(polygon);
24555
24556 return polygons;
24557}
24558
24559function signedArea(ring) {
24560 var sum = 0;
24561 for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
24562 p1 = ring[i];
24563 p2 = ring[j];
24564 sum += (p2.x - p1.x) * (p1.y + p2.y);
24565 }
24566 return sum;
24567}
24568
24569'use strict';
24570
24571var VectorTileFeature$1 = vectortilefeature;
24572
24573var vectortilelayer = VectorTileLayer$2;
24574
24575function VectorTileLayer$2(pbf, end) {
24576 // Public
24577 this.version = 1;
24578 this.name = null;
24579 this.extent = 4096;
24580 this.length = 0;
24581
24582 // Private
24583 this._pbf = pbf;
24584 this._keys = [];
24585 this._values = [];
24586 this._features = [];
24587
24588 pbf.readFields(readLayer, this, end);
24589
24590 this.length = this._features.length;
24591}
24592
24593function readLayer(tag, layer, pbf) {
24594 if (tag === 15) layer.version = pbf.readVarint();
24595 else if (tag === 1) layer.name = pbf.readString();
24596 else if (tag === 5) layer.extent = pbf.readVarint();
24597 else if (tag === 2) layer._features.push(pbf.pos);
24598 else if (tag === 3) layer._keys.push(pbf.readString());
24599 else if (tag === 4) layer._values.push(readValueMessage(pbf));
24600}
24601
24602function readValueMessage(pbf) {
24603 var value = null,
24604 end = pbf.readVarint() + pbf.pos;
24605
24606 while (pbf.pos < end) {
24607 var tag = pbf.readVarint() >> 3;
24608
24609 value = tag === 1 ? pbf.readString() :
24610 tag === 2 ? pbf.readFloat() :
24611 tag === 3 ? pbf.readDouble() :
24612 tag === 4 ? pbf.readVarint64() :
24613 tag === 5 ? pbf.readVarint() :
24614 tag === 6 ? pbf.readSVarint() :
24615 tag === 7 ? pbf.readBoolean() : null;
24616 }
24617
24618 return value;
24619}
24620
24621// return feature `i` from this layer as a `VectorTileFeature`
24622VectorTileLayer$2.prototype.feature = function(i) {
24623 if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
24624
24625 this._pbf.pos = this._features[i];
24626
24627 var end = this._pbf.readVarint() + this._pbf.pos;
24628 return new VectorTileFeature$1(this._pbf, end, this.extent, this._keys, this._values);
24629};
24630
24631'use strict';
24632
24633var VectorTileLayer$1 = vectortilelayer;
24634
24635var vectortile = VectorTile$1;
24636
24637function VectorTile$1(pbf, end) {
24638 this.layers = pbf.readFields(readTile, {}, end);
24639}
24640
24641function readTile(tag, layers, pbf) {
24642 if (tag === 3) {
24643 var layer = new VectorTileLayer$1(pbf, pbf.readVarint() + pbf.pos);
24644 if (layer.length) layers[layer.name] = layer;
24645 }
24646}
24647
24648var VectorTile = vectorTile.VectorTile = vectortile;
24649var VectorTileFeature = vectorTile.VectorTileFeature = vectortilefeature;
24650var VectorTileLayer = vectorTile.VectorTileLayer = vectortilelayer;
24651
24652const vectorTileFeatureTypes$2 = vectorTile.VectorTileFeature.types;
24653const EARCUT_MAX_RINGS = 500;
24654const FACTOR = Math.pow(2, 13);
24655function addVertex$1(vertexArray, x, y, nx, ny, nz, t, e) {
24656 vertexArray.emplaceBack(
24657 // a_pos
24658 x, y,
24659 // a_normal_ed: 3-component normal and 1-component edgedistance
24660 Math.floor(nx * FACTOR) * 2 + t, ny * FACTOR * 2, nz * FACTOR * 2,
24661 // edgedistance (used for wrapping patterns around extrusion sides)
24662 Math.round(e));
24663}
24664class FillExtrusionBucket {
24665 constructor(options) {
24666 this.zoom = options.zoom;
24667 this.overscaling = options.overscaling;
24668 this.layers = options.layers;
24669 this.layerIds = this.layers.map(layer => layer.id);
24670 this.index = options.index;
24671 this.hasPattern = false;
24672 this.layoutVertexArray = new FillExtrusionLayoutArray();
24673 this.indexArray = new TriangleIndexArray();
24674 this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);
24675 this.segments = new SegmentVector();
24676 this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
24677 }
24678 populate(features, options, canonical) {
24679 this.features = [];
24680 this.hasPattern = hasPattern('fill-extrusion', this.layers, options);
24681 for (const { feature, id, index, sourceLayerIndex } of features) {
24682 const needGeometry = this.layers[0]._featureFilter.needGeometry;
24683 const evaluationFeature = toEvaluationFeature(feature, needGeometry);
24684 if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical))
24685 continue;
24686 const bucketFeature = {
24687 id,
24688 sourceLayerIndex,
24689 index,
24690 geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature),
24691 properties: feature.properties,
24692 type: feature.type,
24693 patterns: {}
24694 };
24695 if (this.hasPattern) {
24696 this.features.push(addPatternDependencies('fill-extrusion', this.layers, bucketFeature, this.zoom, options));
24697 }
24698 else {
24699 this.addFeature(bucketFeature, bucketFeature.geometry, index, canonical, {});
24700 }
24701 options.featureIndex.insert(feature, bucketFeature.geometry, index, sourceLayerIndex, this.index, true);
24702 }
24703 }
24704 addFeatures(options, canonical, imagePositions) {
24705 for (const feature of this.features) {
24706 const { geometry } = feature;
24707 this.addFeature(feature, geometry, feature.index, canonical, imagePositions);
24708 }
24709 }
24710 update(states, vtLayer, imagePositions) {
24711 if (!this.stateDependentLayers.length)
24712 return;
24713 this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
24714 }
24715 isEmpty() {
24716 return this.layoutVertexArray.length === 0;
24717 }
24718 uploadPending() {
24719 return !this.uploaded || this.programConfigurations.needsUpload;
24720 }
24721 upload(context) {
24722 if (!this.uploaded) {
24723 this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$2);
24724 this.indexBuffer = context.createIndexBuffer(this.indexArray);
24725 }
24726 this.programConfigurations.upload(context);
24727 this.uploaded = true;
24728 }
24729 destroy() {
24730 if (!this.layoutVertexBuffer)
24731 return;
24732 this.layoutVertexBuffer.destroy();
24733 this.indexBuffer.destroy();
24734 this.programConfigurations.destroy();
24735 this.segments.destroy();
24736 }
24737 addFeature(feature, geometry, index, canonical, imagePositions) {
24738 for (const polygon of classifyRings$1(geometry, EARCUT_MAX_RINGS)) {
24739 let numVertices = 0;
24740 for (const ring of polygon) {
24741 numVertices += ring.length;
24742 }
24743 let segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray);
24744 for (const ring of polygon) {
24745 if (ring.length === 0) {
24746 continue;
24747 }
24748 if (isEntirelyOutside(ring)) {
24749 continue;
24750 }
24751 let edgeDistance = 0;
24752 for (let p = 0; p < ring.length; p++) {
24753 const p1 = ring[p];
24754 if (p >= 1) {
24755 const p2 = ring[p - 1];
24756 if (!isBoundaryEdge(p1, p2)) {
24757 if (segment.vertexLength + 4 > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) {
24758 segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray);
24759 }
24760 const perp = p1.sub(p2)._perp()._unit();
24761 const dist = p2.dist(p1);
24762 if (edgeDistance + dist > 32768)
24763 edgeDistance = 0;
24764 addVertex$1(this.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 0, edgeDistance);
24765 addVertex$1(this.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 1, edgeDistance);
24766 edgeDistance += dist;
24767 addVertex$1(this.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 0, edgeDistance);
24768 addVertex$1(this.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 1, edgeDistance);
24769 const bottomRight = segment.vertexLength;
24770 // ┌──────┐
24771 // │ 0 1 │ Counter-clockwise winding order.
24772 // │ │ Triangle 1: 0 => 2 => 1
24773 // │ 2 3 │ Triangle 2: 1 => 2 => 3
24774 // └──────┘
24775 this.indexArray.emplaceBack(bottomRight, bottomRight + 2, bottomRight + 1);
24776 this.indexArray.emplaceBack(bottomRight + 1, bottomRight + 2, bottomRight + 3);
24777 segment.vertexLength += 4;
24778 segment.primitiveLength += 2;
24779 }
24780 }
24781 }
24782 }
24783 if (segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) {
24784 segment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray);
24785 }
24786 //Only triangulate and draw the area of the feature if it is a polygon
24787 //Other feature types (e.g. LineString) do not have area, so triangulation is pointless / undefined
24788 if (vectorTileFeatureTypes$2[feature.type] !== 'Polygon')
24789 continue;
24790 const flattened = [];
24791 const holeIndices = [];
24792 const triangleIndex = segment.vertexLength;
24793 for (const ring of polygon) {
24794 if (ring.length === 0) {
24795 continue;
24796 }
24797 if (ring !== polygon[0]) {
24798 holeIndices.push(flattened.length / 2);
24799 }
24800 for (let i = 0; i < ring.length; i++) {
24801 const p = ring[i];
24802 addVertex$1(this.layoutVertexArray, p.x, p.y, 0, 0, 1, 1, 0);
24803 flattened.push(p.x);
24804 flattened.push(p.y);
24805 }
24806 }
24807 const indices = earcut$1(flattened, holeIndices);
24808 assert$1(indices.length % 3 === 0);
24809 for (let j = 0; j < indices.length; j += 3) {
24810 // Counter-clockwise winding order.
24811 this.indexArray.emplaceBack(triangleIndex + indices[j], triangleIndex + indices[j + 2], triangleIndex + indices[j + 1]);
24812 }
24813 segment.primitiveLength += indices.length / 3;
24814 segment.vertexLength += numVertices;
24815 }
24816 this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical);
24817 }
24818}
24819register('FillExtrusionBucket', FillExtrusionBucket, { omit: ['layers', 'features'] });
24820function isBoundaryEdge(p1, p2) {
24821 return (p1.x === p2.x && (p1.x < 0 || p1.x > EXTENT)) ||
24822 (p1.y === p2.y && (p1.y < 0 || p1.y > EXTENT));
24823}
24824function isEntirelyOutside(ring) {
24825 return ring.every(p => p.x < 0) ||
24826 ring.every(p => p.x > EXTENT) ||
24827 ring.every(p => p.y < 0) ||
24828 ring.every(p => p.y > EXTENT);
24829}
24830
24831// This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
24832const paint$4 = new Properties({
24833 "fill-extrusion-opacity": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-opacity"]),
24834 "fill-extrusion-color": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-color"]),
24835 "fill-extrusion-translate": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-translate"]),
24836 "fill-extrusion-translate-anchor": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]),
24837 "fill-extrusion-pattern": new CrossFadedDataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-pattern"]),
24838 "fill-extrusion-height": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-height"]),
24839 "fill-extrusion-base": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-base"]),
24840 "fill-extrusion-vertical-gradient": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-vertical-gradient"]),
24841});
24842var properties$4 = { paint: paint$4 };
24843
24844class Point3D extends pointGeometry {
24845}
24846class FillExtrusionStyleLayer extends StyleLayer {
24847 constructor(layer) {
24848 super(layer, properties$4);
24849 }
24850 createBucket(parameters) {
24851 return new FillExtrusionBucket(parameters);
24852 }
24853 queryRadius() {
24854 return translateDistance(this.paint.get('fill-extrusion-translate'));
24855 }
24856 is3D() {
24857 return true;
24858 }
24859 queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits, pixelPosMatrix) {
24860 const translatedPolygon = translate$4(queryGeometry, this.paint.get('fill-extrusion-translate'), this.paint.get('fill-extrusion-translate-anchor'), transform.angle, pixelsToTileUnits);
24861 const height = this.paint.get('fill-extrusion-height').evaluate(feature, featureState);
24862 const base = this.paint.get('fill-extrusion-base').evaluate(feature, featureState);
24863 const projectedQueryGeometry = projectQueryGeometry(translatedPolygon, pixelPosMatrix, transform, 0);
24864 const projected = projectExtrusion(geometry, base, height, pixelPosMatrix);
24865 const projectedBase = projected[0];
24866 const projectedTop = projected[1];
24867 return checkIntersection(projectedBase, projectedTop, projectedQueryGeometry);
24868 }
24869}
24870function dot(a, b) {
24871 return a.x * b.x + a.y * b.y;
24872}
24873function getIntersectionDistance(projectedQueryGeometry, projectedFace) {
24874 if (projectedQueryGeometry.length === 1) {
24875 // For point queries calculate the z at which the point intersects the face
24876 // using barycentric coordinates.
24877 // Find the barycentric coordinates of the projected point within the first
24878 // triangle of the face, using only the xy plane. It doesn't matter if the
24879 // point is outside the first triangle because all the triangles in the face
24880 // are in the same plane.
24881 //
24882 // Check whether points are coincident and use other points if they are.
24883 let i = 0;
24884 const a = projectedFace[i++];
24885 let b;
24886 while (!b || a.equals(b)) {
24887 b = projectedFace[i++];
24888 if (!b)
24889 return Infinity;
24890 }
24891 // Loop until point `c` is not colinear with points `a` and `b`.
24892 for (; i < projectedFace.length; i++) {
24893 const c = projectedFace[i];
24894 const p = projectedQueryGeometry[0];
24895 const ab = b.sub(a);
24896 const ac = c.sub(a);
24897 const ap = p.sub(a);
24898 const dotABAB = dot(ab, ab);
24899 const dotABAC = dot(ab, ac);
24900 const dotACAC = dot(ac, ac);
24901 const dotAPAB = dot(ap, ab);
24902 const dotAPAC = dot(ap, ac);
24903 const denom = dotABAB * dotACAC - dotABAC * dotABAC;
24904 const v = (dotACAC * dotAPAB - dotABAC * dotAPAC) / denom;
24905 const w = (dotABAB * dotAPAC - dotABAC * dotAPAB) / denom;
24906 const u = 1 - v - w;
24907 // Use the barycentric weighting along with the original triangle z coordinates to get the point of intersection.
24908 const distance = a.z * u + b.z * v + c.z * w;
24909 if (isFinite(distance))
24910 return distance;
24911 }
24912 return Infinity;
24913 }
24914 else {
24915 // The counts as closest is less clear when the query is a box. This
24916 // returns the distance to the nearest point on the face, whether it is
24917 // within the query or not. It could be more correct to return the
24918 // distance to the closest point within the query box but this would be
24919 // more complicated and expensive to calculate with little benefit.
24920 let closestDistance = Infinity;
24921 for (const p of projectedFace) {
24922 closestDistance = Math.min(closestDistance, p.z);
24923 }
24924 return closestDistance;
24925 }
24926}
24927function checkIntersection(projectedBase, projectedTop, projectedQueryGeometry) {
24928 let closestDistance = Infinity;
24929 if (polygonIntersectsMultiPolygon(projectedQueryGeometry, projectedTop)) {
24930 closestDistance = getIntersectionDistance(projectedQueryGeometry, projectedTop[0]);
24931 }
24932 for (let r = 0; r < projectedTop.length; r++) {
24933 const ringTop = projectedTop[r];
24934 const ringBase = projectedBase[r];
24935 for (let p = 0; p < ringTop.length - 1; p++) {
24936 const topA = ringTop[p];
24937 const topB = ringTop[p + 1];
24938 const baseA = ringBase[p];
24939 const baseB = ringBase[p + 1];
24940 const face = [topA, topB, baseB, baseA, topA];
24941 if (polygonIntersectsPolygon(projectedQueryGeometry, face)) {
24942 closestDistance = Math.min(closestDistance, getIntersectionDistance(projectedQueryGeometry, face));
24943 }
24944 }
24945 }
24946 return closestDistance === Infinity ? false : closestDistance;
24947}
24948/*
24949 * Project the geometry using matrix `m`. This is essentially doing
24950 * `vec4.transformMat4([], [p.x, p.y, z, 1], m)` but the multiplication
24951 * is inlined so that parts of the projection that are the same across
24952 * different points can only be done once. This produced a measurable
24953 * performance improvement.
24954 */
24955function projectExtrusion(geometry, zBase, zTop, m) {
24956 const projectedBase = [];
24957 const projectedTop = [];
24958 const baseXZ = m[8] * zBase;
24959 const baseYZ = m[9] * zBase;
24960 const baseZZ = m[10] * zBase;
24961 const baseWZ = m[11] * zBase;
24962 const topXZ = m[8] * zTop;
24963 const topYZ = m[9] * zTop;
24964 const topZZ = m[10] * zTop;
24965 const topWZ = m[11] * zTop;
24966 for (const r of geometry) {
24967 const ringBase = [];
24968 const ringTop = [];
24969 for (const p of r) {
24970 const x = p.x;
24971 const y = p.y;
24972 const sX = m[0] * x + m[4] * y + m[12];
24973 const sY = m[1] * x + m[5] * y + m[13];
24974 const sZ = m[2] * x + m[6] * y + m[14];
24975 const sW = m[3] * x + m[7] * y + m[15];
24976 const baseX = sX + baseXZ;
24977 const baseY = sY + baseYZ;
24978 const baseZ = sZ + baseZZ;
24979 const baseW = sW + baseWZ;
24980 const topX = sX + topXZ;
24981 const topY = sY + topYZ;
24982 const topZ = sZ + topZZ;
24983 const topW = sW + topWZ;
24984 const b = new pointGeometry(baseX / baseW, baseY / baseW);
24985 b.z = baseZ / baseW;
24986 ringBase.push(b);
24987 const t = new pointGeometry(topX / topW, topY / topW);
24988 t.z = topZ / topW;
24989 ringTop.push(t);
24990 }
24991 projectedBase.push(ringBase);
24992 projectedTop.push(ringTop);
24993 }
24994 return [projectedBase, projectedTop];
24995}
24996function projectQueryGeometry(queryGeometry, pixelPosMatrix, transform, z) {
24997 const projectedQueryGeometry = [];
24998 for (const p of queryGeometry) {
24999 const v = [p.x, p.y, z, 1];
25000 transformMat4$1(v, v, pixelPosMatrix);
25001 projectedQueryGeometry.push(new pointGeometry(v[0] / v[3], v[1] / v[3]));
25002 }
25003 return projectedQueryGeometry;
25004}
25005
25006const lineLayoutAttributes = createLayout([
25007 { name: 'a_pos_normal', components: 2, type: 'Int16' },
25008 { name: 'a_data', components: 4, type: 'Uint8' }
25009], 4);
25010const { members: members$1, size: size$1, alignment: alignment$1 } = lineLayoutAttributes;
25011
25012const lineLayoutAttributesExt = createLayout([
25013 { name: 'a_uv_x', components: 1, type: 'Float32' },
25014 { name: 'a_split_index', components: 1, type: 'Float32' },
25015]);
25016const { members, size, alignment } = lineLayoutAttributesExt;
25017
25018const vectorTileFeatureTypes$1 = vectorTile.VectorTileFeature.types;
25019// NOTE ON EXTRUDE SCALE:
25020// scale the extrusion vector so that the normal length is this value.
25021// contains the "texture" normals (-1..1). this is distinct from the extrude
25022// normals for line joins, because the x-value remains 0 for the texture
25023// normal array, while the extrude normal actually moves the vertex to create
25024// the acute/bevelled line join.
25025const EXTRUDE_SCALE = 63;
25026/*
25027 * Sharp corners cause dashed lines to tilt because the distance along the line
25028 * is the same at both the inner and outer corners. To improve the appearance of
25029 * dashed lines we add extra points near sharp corners so that a smaller part
25030 * of the line is tilted.
25031 *
25032 * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an
25033 * extra vertex. The default is 75 degrees.
25034 *
25035 * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.
25036 */
25037const COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));
25038const SHARP_CORNER_OFFSET = 15;
25039// Angle per triangle for approximating round line joins.
25040const DEG_PER_TRIANGLE = 20;
25041// The number of bits that is used to store the line distance in the buffer.
25042const LINE_DISTANCE_BUFFER_BITS = 15;
25043// We don't have enough bits for the line distance as we'd like to have, so
25044// use this value to scale the line distance (in tile units) down to a smaller
25045// value. This lets us store longer distances while sacrificing precision.
25046const LINE_DISTANCE_SCALE = 1 / 2;
25047// The maximum line distance, in tile units, that fits in the buffer.
25048const MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE;
25049/**
25050 * @private
25051 */
25052class LineBucket {
25053 constructor(options) {
25054 this.zoom = options.zoom;
25055 this.overscaling = options.overscaling;
25056 this.layers = options.layers;
25057 this.layerIds = this.layers.map(layer => layer.id);
25058 this.index = options.index;
25059 this.hasPattern = false;
25060 this.patternFeatures = [];
25061 this.lineClipsArray = [];
25062 this.gradients = {};
25063 this.layers.forEach(layer => {
25064 this.gradients[layer.id] = {};
25065 });
25066 this.layoutVertexArray = new LineLayoutArray();
25067 this.layoutVertexArray2 = new LineExtLayoutArray();
25068 this.indexArray = new TriangleIndexArray();
25069 this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);
25070 this.segments = new SegmentVector();
25071 this.maxLineLength = 0;
25072 this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
25073 }
25074 populate(features, options, canonical) {
25075 this.hasPattern = hasPattern('line', this.layers, options);
25076 const lineSortKey = this.layers[0].layout.get('line-sort-key');
25077 const sortFeaturesByKey = !lineSortKey.isConstant();
25078 const bucketFeatures = [];
25079 for (const { feature, id, index, sourceLayerIndex } of features) {
25080 const needGeometry = this.layers[0]._featureFilter.needGeometry;
25081 const evaluationFeature = toEvaluationFeature(feature, needGeometry);
25082 if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical))
25083 continue;
25084 const sortKey = sortFeaturesByKey ?
25085 lineSortKey.evaluate(evaluationFeature, {}, canonical) :
25086 undefined;
25087 const bucketFeature = {
25088 id,
25089 properties: feature.properties,
25090 type: feature.type,
25091 sourceLayerIndex,
25092 index,
25093 geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature),
25094 patterns: {},
25095 sortKey
25096 };
25097 bucketFeatures.push(bucketFeature);
25098 }
25099 if (sortFeaturesByKey) {
25100 bucketFeatures.sort((a, b) => {
25101 return (a.sortKey) - (b.sortKey);
25102 });
25103 }
25104 for (const bucketFeature of bucketFeatures) {
25105 const { geometry, index, sourceLayerIndex } = bucketFeature;
25106 if (this.hasPattern) {
25107 const patternBucketFeature = addPatternDependencies('line', this.layers, bucketFeature, this.zoom, options);
25108 // pattern features are added only once the pattern is loaded into the image atlas
25109 // so are stored during populate until later updated with positions by tile worker in addFeatures
25110 this.patternFeatures.push(patternBucketFeature);
25111 }
25112 else {
25113 this.addFeature(bucketFeature, geometry, index, canonical, {});
25114 }
25115 const feature = features[index].feature;
25116 options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);
25117 }
25118 }
25119 update(states, vtLayer, imagePositions) {
25120 if (!this.stateDependentLayers.length)
25121 return;
25122 this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
25123 }
25124 addFeatures(options, canonical, imagePositions) {
25125 for (const feature of this.patternFeatures) {
25126 this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions);
25127 }
25128 }
25129 isEmpty() {
25130 return this.layoutVertexArray.length === 0;
25131 }
25132 uploadPending() {
25133 return !this.uploaded || this.programConfigurations.needsUpload;
25134 }
25135 upload(context) {
25136 if (!this.uploaded) {
25137 if (this.layoutVertexArray2.length !== 0) {
25138 this.layoutVertexBuffer2 = context.createVertexBuffer(this.layoutVertexArray2, members);
25139 }
25140 this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$1);
25141 this.indexBuffer = context.createIndexBuffer(this.indexArray);
25142 }
25143 this.programConfigurations.upload(context);
25144 this.uploaded = true;
25145 }
25146 destroy() {
25147 if (!this.layoutVertexBuffer)
25148 return;
25149 this.layoutVertexBuffer.destroy();
25150 this.indexBuffer.destroy();
25151 this.programConfigurations.destroy();
25152 this.segments.destroy();
25153 }
25154 lineFeatureClips(feature) {
25155 if (!!feature.properties && Object.prototype.hasOwnProperty.call(feature.properties, 'mapbox_clip_start') && Object.prototype.hasOwnProperty.call(feature.properties, 'mapbox_clip_end')) {
25156 const start = +feature.properties['mapbox_clip_start'];
25157 const end = +feature.properties['mapbox_clip_end'];
25158 return { start, end };
25159 }
25160 }
25161 addFeature(feature, geometry, index, canonical, imagePositions) {
25162 const layout = this.layers[0].layout;
25163 const join = layout.get('line-join').evaluate(feature, {});
25164 const cap = layout.get('line-cap');
25165 const miterLimit = layout.get('line-miter-limit');
25166 const roundLimit = layout.get('line-round-limit');
25167 this.lineClips = this.lineFeatureClips(feature);
25168 for (const line of geometry) {
25169 this.addLine(line, feature, join, cap, miterLimit, roundLimit);
25170 }
25171 this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical);
25172 }
25173 addLine(vertices, feature, join, cap, miterLimit, roundLimit) {
25174 this.distance = 0;
25175 this.scaledDistance = 0;
25176 this.totalDistance = 0;
25177 if (this.lineClips) {
25178 this.lineClipsArray.push(this.lineClips);
25179 // Calculate the total distance, in tile units, of this tiled line feature
25180 for (let i = 0; i < vertices.length - 1; i++) {
25181 this.totalDistance += vertices[i].dist(vertices[i + 1]);
25182 }
25183 this.updateScaledDistance();
25184 this.maxLineLength = Math.max(this.maxLineLength, this.totalDistance);
25185 }
25186 const isPolygon = vectorTileFeatureTypes$1[feature.type] === 'Polygon';
25187 // If the line has duplicate vertices at the ends, adjust start/length to remove them.
25188 let len = vertices.length;
25189 while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) {
25190 len--;
25191 }
25192 let first = 0;
25193 while (first < len - 1 && vertices[first].equals(vertices[first + 1])) {
25194 first++;
25195 }
25196 // Ignore invalid geometry.
25197 if (len < (isPolygon ? 3 : 2))
25198 return;
25199 if (join === 'bevel')
25200 miterLimit = 1.05;
25201 const sharpCornerOffset = this.overscaling <= 16 ?
25202 SHARP_CORNER_OFFSET * EXTENT / (512 * this.overscaling) :
25203 0;
25204 // we could be more precise, but it would only save a negligible amount of space
25205 const segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray);
25206 let currentVertex;
25207 let prevVertex;
25208 let nextVertex;
25209 let prevNormal;
25210 let nextNormal;
25211 // the last two vertices added
25212 this.e1 = this.e2 = -1;
25213 if (isPolygon) {
25214 currentVertex = vertices[len - 2];
25215 nextNormal = vertices[first].sub(currentVertex)._unit()._perp();
25216 }
25217 for (let i = first; i < len; i++) {
25218 nextVertex = i === len - 1 ?
25219 (isPolygon ? vertices[first + 1] : undefined) : // if it's a polygon, treat the last vertex like the first
25220 vertices[i + 1]; // just the next vertex
25221 // if two consecutive vertices exist, skip the current one
25222 if (nextVertex && vertices[i].equals(nextVertex))
25223 continue;
25224 if (nextNormal)
25225 prevNormal = nextNormal;
25226 if (currentVertex)
25227 prevVertex = currentVertex;
25228 currentVertex = vertices[i];
25229 // Calculate the normal towards the next vertex in this line. In case
25230 // there is no next vertex, pretend that the line is continuing straight,
25231 // meaning that we are just using the previous normal.
25232 nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;
25233 // If we still don't have a previous normal, this is the beginning of a
25234 // non-closed line, so we're doing a straight "join".
25235 prevNormal = prevNormal || nextNormal;
25236 // Determine the normal of the join extrusion. It is the angle bisector
25237 // of the segments between the previous line and the next line.
25238 // In the case of 180° angles, the prev and next normals cancel each other out:
25239 // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be
25240 // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle
25241 // below will also become 0 and miterLength will become Infinity.
25242 let joinNormal = prevNormal.add(nextNormal);
25243 if (joinNormal.x !== 0 || joinNormal.y !== 0) {
25244 joinNormal._unit();
25245 }
25246 /* joinNormal prevNormal
25247 * ↖ ↑
25248 * .________. prevVertex
25249 * |
25250 * nextNormal ← | currentVertex
25251 * |
25252 * nextVertex !
25253 *
25254 */
25255 // calculate cosines of the angle (and its half) using dot product
25256 const cosAngle = prevNormal.x * nextNormal.x + prevNormal.y * nextNormal.y;
25257 const cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;
25258 // Calculate the length of the miter (the ratio of the miter to the width)
25259 // as the inverse of cosine of the angle between next and join normals
25260 const miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity;
25261 // approximate angle from cosine
25262 const approxAngle = 2 * Math.sqrt(2 - 2 * cosHalfAngle);
25263 const isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;
25264 const lineTurnsLeft = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0;
25265 if (isSharpCorner && i > first) {
25266 const prevSegmentLength = currentVertex.dist(prevVertex);
25267 if (prevSegmentLength > 2 * sharpCornerOffset) {
25268 const newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());
25269 this.updateDistance(prevVertex, newPrevVertex);
25270 this.addCurrentVertex(newPrevVertex, prevNormal, 0, 0, segment);
25271 prevVertex = newPrevVertex;
25272 }
25273 }
25274 // The join if a middle vertex, otherwise the cap.
25275 const middleVertex = prevVertex && nextVertex;
25276 let currentJoin = middleVertex ? join : isPolygon ? 'butt' : cap;
25277 if (middleVertex && currentJoin === 'round') {
25278 if (miterLength < roundLimit) {
25279 currentJoin = 'miter';
25280 }
25281 else if (miterLength <= 2) {
25282 currentJoin = 'fakeround';
25283 }
25284 }
25285 if (currentJoin === 'miter' && miterLength > miterLimit) {
25286 currentJoin = 'bevel';
25287 }
25288 if (currentJoin === 'bevel') {
25289 // The maximum extrude length is 128 / 63 = 2 times the width of the line
25290 // so if miterLength >= 2 we need to draw a different type of bevel here.
25291 if (miterLength > 2)
25292 currentJoin = 'flipbevel';
25293 // If the miterLength is really small and the line bevel wouldn't be visible,
25294 // just draw a miter join to save a triangle.
25295 if (miterLength < miterLimit)
25296 currentJoin = 'miter';
25297 }
25298 // Calculate how far along the line the currentVertex is
25299 if (prevVertex)
25300 this.updateDistance(prevVertex, currentVertex);
25301 if (currentJoin === 'miter') {
25302 joinNormal._mult(miterLength);
25303 this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);
25304 }
25305 else if (currentJoin === 'flipbevel') {
25306 // miter is too big, flip the direction to make a beveled join
25307 if (miterLength > 100) {
25308 // Almost parallel lines
25309 joinNormal = nextNormal.mult(-1);
25310 }
25311 else {
25312 const bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();
25313 joinNormal._perp()._mult(bevelLength * (lineTurnsLeft ? -1 : 1));
25314 }
25315 this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);
25316 this.addCurrentVertex(currentVertex, joinNormal.mult(-1), 0, 0, segment);
25317 }
25318 else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {
25319 const offset = -Math.sqrt(miterLength * miterLength - 1);
25320 const offsetA = lineTurnsLeft ? offset : 0;
25321 const offsetB = lineTurnsLeft ? 0 : offset;
25322 // Close previous segment with a bevel
25323 if (prevVertex) {
25324 this.addCurrentVertex(currentVertex, prevNormal, offsetA, offsetB, segment);
25325 }
25326 if (currentJoin === 'fakeround') {
25327 // The join angle is sharp enough that a round join would be visible.
25328 // Bevel joins fill the gap between segments with a single pie slice triangle.
25329 // Create a round join by adding multiple pie slices. The join isn't actually round, but
25330 // it looks like it is at the sizes we render lines at.
25331 // pick the number of triangles for approximating round join by based on the angle between normals
25332 const n = Math.round((approxAngle * 180 / Math.PI) / DEG_PER_TRIANGLE);
25333 for (let m = 1; m < n; m++) {
25334 let t = m / n;
25335 if (t !== 0.5) {
25336 // approximate spherical interpolation https://observablehq.com/@mourner/approximating-geometric-slerp
25337 const t2 = t - 0.5;
25338 const A = 1.0904 + cosAngle * (-3.2452 + cosAngle * (3.55645 - cosAngle * 1.43519));
25339 const B = 0.848013 + cosAngle * (-1.06021 + cosAngle * 0.215638);
25340 t = t + t * t2 * (t - 1) * (A * t2 * t2 + B);
25341 }
25342 const extrude = nextNormal.sub(prevNormal)._mult(t)._add(prevNormal)._unit()._mult(lineTurnsLeft ? -1 : 1);
25343 this.addHalfVertex(currentVertex, extrude.x, extrude.y, false, lineTurnsLeft, 0, segment);
25344 }
25345 }
25346 if (nextVertex) {
25347 // Start next segment
25348 this.addCurrentVertex(currentVertex, nextNormal, -offsetA, -offsetB, segment);
25349 }
25350 }
25351 else if (currentJoin === 'butt') {
25352 this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); // butt cap
25353 }
25354 else if (currentJoin === 'square') {
25355 const offset = prevVertex ? 1 : -1; // closing or starting square cap
25356 this.addCurrentVertex(currentVertex, joinNormal, offset, offset, segment);
25357 }
25358 else if (currentJoin === 'round') {
25359 if (prevVertex) {
25360 // Close previous segment with butt
25361 this.addCurrentVertex(currentVertex, prevNormal, 0, 0, segment);
25362 // Add round cap or linejoin at end of segment
25363 this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment, true);
25364 }
25365 if (nextVertex) {
25366 // Add round cap before first segment
25367 this.addCurrentVertex(currentVertex, nextNormal, -1, -1, segment, true);
25368 // Start next segment with a butt
25369 this.addCurrentVertex(currentVertex, nextNormal, 0, 0, segment);
25370 }
25371 }
25372 if (isSharpCorner && i < len - 1) {
25373 const nextSegmentLength = currentVertex.dist(nextVertex);
25374 if (nextSegmentLength > 2 * sharpCornerOffset) {
25375 const newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());
25376 this.updateDistance(currentVertex, newCurrentVertex);
25377 this.addCurrentVertex(newCurrentVertex, nextNormal, 0, 0, segment);
25378 currentVertex = newCurrentVertex;
25379 }
25380 }
25381 }
25382 }
25383 /**
25384 * Add two vertices to the buffers.
25385 *
25386 * @param p the line vertex to add buffer vertices for
25387 * @param normal vertex normal
25388 * @param endLeft extrude to shift the left vertex along the line
25389 * @param endRight extrude to shift the left vertex along the line
25390 * @param segment the segment object to add the vertex to
25391 * @param round whether this is a round cap
25392 * @private
25393 */
25394 addCurrentVertex(p, normal, endLeft, endRight, segment, round = false) {
25395 // left and right extrude vectors, perpendicularly shifted by endLeft/endRight
25396 const leftX = normal.x + normal.y * endLeft;
25397 const leftY = normal.y - normal.x * endLeft;
25398 const rightX = -normal.x + normal.y * endRight;
25399 const rightY = -normal.y - normal.x * endRight;
25400 this.addHalfVertex(p, leftX, leftY, round, false, endLeft, segment);
25401 this.addHalfVertex(p, rightX, rightY, round, true, -endRight, segment);
25402 // There is a maximum "distance along the line" that we can store in the buffers.
25403 // When we get close to the distance, reset it to zero and add the vertex again with
25404 // a distance of zero. The max distance is determined by the number of bits we allocate
25405 // to `linesofar`.
25406 if (this.distance > MAX_LINE_DISTANCE / 2 && this.totalDistance === 0) {
25407 this.distance = 0;
25408 this.addCurrentVertex(p, normal, endLeft, endRight, segment, round);
25409 }
25410 }
25411 addHalfVertex({ x, y }, extrudeX, extrudeY, round, up, dir, segment) {
25412 const totalDistance = this.lineClips ? this.scaledDistance * (MAX_LINE_DISTANCE - 1) : this.scaledDistance;
25413 // scale down so that we can store longer distances while sacrificing precision.
25414 const linesofarScaled = totalDistance * LINE_DISTANCE_SCALE;
25415 this.layoutVertexArray.emplaceBack(
25416 // a_pos_normal
25417 // Encode round/up the least significant bits
25418 (x << 1) + (round ? 1 : 0), (y << 1) + (up ? 1 : 0),
25419 // a_data
25420 // add 128 to store a byte in an unsigned byte
25421 Math.round(EXTRUDE_SCALE * extrudeX) + 128, Math.round(EXTRUDE_SCALE * extrudeY) + 128,
25422 // Encode the -1/0/1 direction value into the first two bits of .z of a_data.
25423 // Combine it with the lower 6 bits of `linesofarScaled` (shifted by 2 bits to make
25424 // room for the direction value). The upper 8 bits of `linesofarScaled` are placed in
25425 // the `w` component.
25426 ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofarScaled & 0x3F) << 2), linesofarScaled >> 6);
25427 // Constructs a second vertex buffer with higher precision line progress
25428 if (this.lineClips) {
25429 const progressRealigned = this.scaledDistance - this.lineClips.start;
25430 const endClipRealigned = this.lineClips.end - this.lineClips.start;
25431 const uvX = progressRealigned / endClipRealigned;
25432 this.layoutVertexArray2.emplaceBack(uvX, this.lineClipsArray.length);
25433 }
25434 const e = segment.vertexLength++;
25435 if (this.e1 >= 0 && this.e2 >= 0) {
25436 this.indexArray.emplaceBack(this.e1, this.e2, e);
25437 segment.primitiveLength++;
25438 }
25439 if (up) {
25440 this.e2 = e;
25441 }
25442 else {
25443 this.e1 = e;
25444 }
25445 }
25446 updateScaledDistance() {
25447 // Knowing the ratio of the full linestring covered by this tiled feature, as well
25448 // as the total distance (in tile units) of this tiled feature, and the distance
25449 // (in tile units) of the current vertex, we can determine the relative distance
25450 // of this vertex along the full linestring feature and scale it to [0, 2^15)
25451 this.scaledDistance = this.lineClips ?
25452 this.lineClips.start + (this.lineClips.end - this.lineClips.start) * this.distance / this.totalDistance :
25453 this.distance;
25454 }
25455 updateDistance(prev, next) {
25456 this.distance += prev.dist(next);
25457 this.updateScaledDistance();
25458 }
25459}
25460register('LineBucket', LineBucket, { omit: ['layers', 'patternFeatures'] });
25461
25462// This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
25463const layout$1 = new Properties({
25464 "line-cap": new DataConstantProperty(spec["layout_line"]["line-cap"]),
25465 "line-join": new DataDrivenProperty(spec["layout_line"]["line-join"]),
25466 "line-miter-limit": new DataConstantProperty(spec["layout_line"]["line-miter-limit"]),
25467 "line-round-limit": new DataConstantProperty(spec["layout_line"]["line-round-limit"]),
25468 "line-sort-key": new DataDrivenProperty(spec["layout_line"]["line-sort-key"]),
25469});
25470const paint$3 = new Properties({
25471 "line-opacity": new DataDrivenProperty(spec["paint_line"]["line-opacity"]),
25472 "line-color": new DataDrivenProperty(spec["paint_line"]["line-color"]),
25473 "line-translate": new DataConstantProperty(spec["paint_line"]["line-translate"]),
25474 "line-translate-anchor": new DataConstantProperty(spec["paint_line"]["line-translate-anchor"]),
25475 "line-width": new DataDrivenProperty(spec["paint_line"]["line-width"]),
25476 "line-gap-width": new DataDrivenProperty(spec["paint_line"]["line-gap-width"]),
25477 "line-offset": new DataDrivenProperty(spec["paint_line"]["line-offset"]),
25478 "line-blur": new DataDrivenProperty(spec["paint_line"]["line-blur"]),
25479 "line-dasharray": new CrossFadedProperty(spec["paint_line"]["line-dasharray"]),
25480 "line-pattern": new CrossFadedDataDrivenProperty(spec["paint_line"]["line-pattern"]),
25481 "line-gradient": new ColorRampProperty(spec["paint_line"]["line-gradient"]),
25482});
25483var properties$3 = { paint: paint$3, layout: layout$1 };
25484
25485class LineFloorwidthProperty extends DataDrivenProperty {
25486 possiblyEvaluate(value, parameters) {
25487 parameters = new EvaluationParameters(Math.floor(parameters.zoom), {
25488 now: parameters.now,
25489 fadeDuration: parameters.fadeDuration,
25490 zoomHistory: parameters.zoomHistory,
25491 transition: parameters.transition
25492 });
25493 return super.possiblyEvaluate(value, parameters);
25494 }
25495 evaluate(value, globals, feature, featureState) {
25496 globals = extend$1({}, globals, { zoom: Math.floor(globals.zoom) });
25497 return super.evaluate(value, globals, feature, featureState);
25498 }
25499}
25500const lineFloorwidthProperty = new LineFloorwidthProperty(properties$3.paint.properties['line-width'].specification);
25501lineFloorwidthProperty.useIntegerZoom = true;
25502class LineStyleLayer extends StyleLayer {
25503 constructor(layer) {
25504 super(layer, properties$3);
25505 this.gradientVersion = 0;
25506 }
25507 _handleSpecialPaintPropertyUpdate(name) {
25508 if (name === 'line-gradient') {
25509 const expression = this._transitionablePaint._values['line-gradient'].value.expression;
25510 this.stepInterpolant = expression._styleExpression.expression instanceof Step;
25511 this.gradientVersion = (this.gradientVersion + 1) % Number.MAX_SAFE_INTEGER;
25512 }
25513 }
25514 gradientExpression() {
25515 return this._transitionablePaint._values['line-gradient'].value.expression;
25516 }
25517 recalculate(parameters, availableImages) {
25518 super.recalculate(parameters, availableImages);
25519 this.paint._values['line-floorwidth'] =
25520 lineFloorwidthProperty.possiblyEvaluate(this._transitioningPaint._values['line-width'].value, parameters);
25521 }
25522 createBucket(parameters) {
25523 return new LineBucket(parameters);
25524 }
25525 queryRadius(bucket) {
25526 const lineBucket = bucket;
25527 const width = getLineWidth(getMaximumPaintValue('line-width', this, lineBucket), getMaximumPaintValue('line-gap-width', this, lineBucket));
25528 const offset = getMaximumPaintValue('line-offset', this, lineBucket);
25529 return width / 2 + Math.abs(offset) + translateDistance(this.paint.get('line-translate'));
25530 }
25531 queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits) {
25532 const translatedPolygon = translate$4(queryGeometry, this.paint.get('line-translate'), this.paint.get('line-translate-anchor'), transform.angle, pixelsToTileUnits);
25533 const halfWidth = pixelsToTileUnits / 2 * getLineWidth(this.paint.get('line-width').evaluate(feature, featureState), this.paint.get('line-gap-width').evaluate(feature, featureState));
25534 const lineOffset = this.paint.get('line-offset').evaluate(feature, featureState);
25535 if (lineOffset) {
25536 geometry = offsetLine(geometry, lineOffset * pixelsToTileUnits);
25537 }
25538 return polygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth);
25539 }
25540 isTileClipped() {
25541 return true;
25542 }
25543}
25544function getLineWidth(lineWidth, lineGapWidth) {
25545 if (lineGapWidth > 0) {
25546 return lineGapWidth + 2 * lineWidth;
25547 }
25548 else {
25549 return lineWidth;
25550 }
25551}
25552
25553const symbolLayoutAttributes = createLayout([
25554 { name: 'a_pos_offset', components: 4, type: 'Int16' },
25555 { name: 'a_data', components: 4, type: 'Uint16' },
25556 { name: 'a_pixeloffset', components: 4, type: 'Int16' }
25557], 4);
25558const dynamicLayoutAttributes = createLayout([
25559 { name: 'a_projected_pos', components: 3, type: 'Float32' }
25560], 4);
25561const placementOpacityAttributes = createLayout([
25562 { name: 'a_fade_opacity', components: 1, type: 'Uint32' }
25563], 4);
25564const collisionVertexAttributes = createLayout([
25565 { name: 'a_placed', components: 2, type: 'Uint8' },
25566 { name: 'a_shift', components: 2, type: 'Float32' }
25567]);
25568const collisionBox = createLayout([
25569 // the box is centered around the anchor point
25570 { type: 'Int16', name: 'anchorPointX' },
25571 { type: 'Int16', name: 'anchorPointY' },
25572 // distances to the edges from the anchor
25573 { type: 'Int16', name: 'x1' },
25574 { type: 'Int16', name: 'y1' },
25575 { type: 'Int16', name: 'x2' },
25576 { type: 'Int16', name: 'y2' },
25577 // the index of the feature in the original vectortile
25578 { type: 'Uint32', name: 'featureIndex' },
25579 // the source layer the feature appears in
25580 { type: 'Uint16', name: 'sourceLayerIndex' },
25581 // the bucket the feature appears in
25582 { type: 'Uint16', name: 'bucketIndex' },
25583]);
25584const collisionBoxLayout = createLayout([
25585 { name: 'a_pos', components: 2, type: 'Int16' },
25586 { name: 'a_anchor_pos', components: 2, type: 'Int16' },
25587 { name: 'a_extrude', components: 2, type: 'Int16' }
25588], 4);
25589const collisionCircleLayout = createLayout([
25590 { name: 'a_pos', components: 2, type: 'Float32' },
25591 { name: 'a_radius', components: 1, type: 'Float32' },
25592 { name: 'a_flags', components: 2, type: 'Int16' }
25593], 4);
25594const quadTriangle = createLayout([
25595 { name: 'triangle', components: 3, type: 'Uint16' },
25596]);
25597const placement = createLayout([
25598 { type: 'Int16', name: 'anchorX' },
25599 { type: 'Int16', name: 'anchorY' },
25600 { type: 'Uint16', name: 'glyphStartIndex' },
25601 { type: 'Uint16', name: 'numGlyphs' },
25602 { type: 'Uint32', name: 'vertexStartIndex' },
25603 { type: 'Uint32', name: 'lineStartIndex' },
25604 { type: 'Uint32', name: 'lineLength' },
25605 { type: 'Uint16', name: 'segment' },
25606 { type: 'Uint16', name: 'lowerSize' },
25607 { type: 'Uint16', name: 'upperSize' },
25608 { type: 'Float32', name: 'lineOffsetX' },
25609 { type: 'Float32', name: 'lineOffsetY' },
25610 { type: 'Uint8', name: 'writingMode' },
25611 { type: 'Uint8', name: 'placedOrientation' },
25612 { type: 'Uint8', name: 'hidden' },
25613 { type: 'Uint32', name: 'crossTileID' },
25614 { type: 'Int16', name: 'associatedIconIndex' }
25615]);
25616const symbolInstance = createLayout([
25617 { type: 'Int16', name: 'anchorX' },
25618 { type: 'Int16', name: 'anchorY' },
25619 { type: 'Int16', name: 'rightJustifiedTextSymbolIndex' },
25620 { type: 'Int16', name: 'centerJustifiedTextSymbolIndex' },
25621 { type: 'Int16', name: 'leftJustifiedTextSymbolIndex' },
25622 { type: 'Int16', name: 'verticalPlacedTextSymbolIndex' },
25623 { type: 'Int16', name: 'placedIconSymbolIndex' },
25624 { type: 'Int16', name: 'verticalPlacedIconSymbolIndex' },
25625 { type: 'Uint16', name: 'key' },
25626 { type: 'Uint16', name: 'textBoxStartIndex' },
25627 { type: 'Uint16', name: 'textBoxEndIndex' },
25628 { type: 'Uint16', name: 'verticalTextBoxStartIndex' },
25629 { type: 'Uint16', name: 'verticalTextBoxEndIndex' },
25630 { type: 'Uint16', name: 'iconBoxStartIndex' },
25631 { type: 'Uint16', name: 'iconBoxEndIndex' },
25632 { type: 'Uint16', name: 'verticalIconBoxStartIndex' },
25633 { type: 'Uint16', name: 'verticalIconBoxEndIndex' },
25634 { type: 'Uint16', name: 'featureIndex' },
25635 { type: 'Uint16', name: 'numHorizontalGlyphVertices' },
25636 { type: 'Uint16', name: 'numVerticalGlyphVertices' },
25637 { type: 'Uint16', name: 'numIconVertices' },
25638 { type: 'Uint16', name: 'numVerticalIconVertices' },
25639 { type: 'Uint16', name: 'useRuntimeCollisionCircles' },
25640 { type: 'Uint32', name: 'crossTileID' },
25641 { type: 'Float32', name: 'textBoxScale' },
25642 { type: 'Float32', components: 2, name: 'textOffset' },
25643 { type: 'Float32', name: 'collisionCircleDiameter' },
25644]);
25645const glyphOffset = createLayout([
25646 { type: 'Float32', name: 'offsetX' }
25647]);
25648const lineVertex = createLayout([
25649 { type: 'Int16', name: 'x' },
25650 { type: 'Int16', name: 'y' },
25651 { type: 'Int16', name: 'tileUnitDistanceFromAnchor' }
25652]);
25653
25654function transformText(text, layer, feature) {
25655 const transform = layer.layout.get('text-transform').evaluate(feature, {});
25656 if (transform === 'uppercase') {
25657 text = text.toLocaleUpperCase();
25658 }
25659 else if (transform === 'lowercase') {
25660 text = text.toLocaleLowerCase();
25661 }
25662 if (plugin.applyArabicShaping) {
25663 text = plugin.applyArabicShaping(text);
25664 }
25665 return text;
25666}
25667function transformText$1 (text, layer, feature) {
25668 text.sections.forEach(section => {
25669 section.text = transformText(section.text, layer, feature);
25670 });
25671 return text;
25672}
25673
25674function mergeLines (features) {
25675 const leftIndex = {};
25676 const rightIndex = {};
25677 const mergedFeatures = [];
25678 let mergedIndex = 0;
25679 function add(k) {
25680 mergedFeatures.push(features[k]);
25681 mergedIndex++;
25682 }
25683 function mergeFromRight(leftKey, rightKey, geom) {
25684 const i = rightIndex[leftKey];
25685 delete rightIndex[leftKey];
25686 rightIndex[rightKey] = i;
25687 mergedFeatures[i].geometry[0].pop();
25688 mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]);
25689 return i;
25690 }
25691 function mergeFromLeft(leftKey, rightKey, geom) {
25692 const i = leftIndex[rightKey];
25693 delete leftIndex[rightKey];
25694 leftIndex[leftKey] = i;
25695 mergedFeatures[i].geometry[0].shift();
25696 mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]);
25697 return i;
25698 }
25699 function getKey(text, geom, onRight) {
25700 const point = onRight ? geom[0][geom[0].length - 1] : geom[0][0];
25701 return `${text}:${point.x}:${point.y}`;
25702 }
25703 for (let k = 0; k < features.length; k++) {
25704 const feature = features[k];
25705 const geom = feature.geometry;
25706 const text = feature.text ? feature.text.toString() : null;
25707 if (!text) {
25708 add(k);
25709 continue;
25710 }
25711 const leftKey = getKey(text, geom), rightKey = getKey(text, geom, true);
25712 if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) {
25713 // found lines with the same text adjacent to both ends of the current line, merge all three
25714 const j = mergeFromLeft(leftKey, rightKey, geom);
25715 const i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry);
25716 delete leftIndex[leftKey];
25717 delete rightIndex[rightKey];
25718 rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i;
25719 mergedFeatures[j].geometry = null;
25720 }
25721 else if (leftKey in rightIndex) {
25722 // found mergeable line adjacent to the start of the current line, merge
25723 mergeFromRight(leftKey, rightKey, geom);
25724 }
25725 else if (rightKey in leftIndex) {
25726 // found mergeable line adjacent to the end of the current line, merge
25727 mergeFromLeft(leftKey, rightKey, geom);
25728 }
25729 else {
25730 // no adjacent lines, add as a new item
25731 add(k);
25732 leftIndex[leftKey] = mergedIndex - 1;
25733 rightIndex[rightKey] = mergedIndex - 1;
25734 }
25735 }
25736 return mergedFeatures.filter((f) => f.geometry);
25737}
25738
25739const verticalizedCharacterMap = {
25740 '!': '︕',
25741 '#': '#',
25742 '$': '$',
25743 '%': '%',
25744 '&': '&',
25745 '(': '︵',
25746 ')': '︶',
25747 '*': '*',
25748 '+': '+',
25749 ',': '︐',
25750 '-': '︲',
25751 '.': '・',
25752 '/': '/',
25753 ':': '︓',
25754 ';': '︔',
25755 '<': '︿',
25756 '=': '=',
25757 '>': '﹀',
25758 '?': '︖',
25759 '@': '@',
25760 '[': '﹇',
25761 '\\': '\',
25762 ']': '﹈',
25763 '^': '^',
25764 '_': '︳',
25765 '`': '`',
25766 '{': '︷',
25767 '|': '―',
25768 '}': '︸',
25769 '~': '~',
25770 '¢': '¢',
25771 '£': '£',
25772 '¥': '¥',
25773 '¦': '¦',
25774 '¬': '¬',
25775 '¯': ' ̄',
25776 '–': '︲',
25777 '—': '︱',
25778 '‘': '﹃',
25779 '’': '﹄',
25780 '“': '﹁',
25781 '”': '﹂',
25782 '…': '︙',
25783 '‧': '・',
25784 '₩': '₩',
25785 '、': '︑',
25786 '。': '︒',
25787 '〈': '︿',
25788 '〉': '﹀',
25789 '《': '︽',
25790 '》': '︾',
25791 '「': '﹁',
25792 '」': '﹂',
25793 '『': '﹃',
25794 '』': '﹄',
25795 '【': '︻',
25796 '】': '︼',
25797 '〔': '︹',
25798 '〕': '︺',
25799 '〖': '︗',
25800 '〗': '︘',
25801 '!': '︕',
25802 '(': '︵',
25803 ')': '︶',
25804 ',': '︐',
25805 '-': '︲',
25806 '.': '・',
25807 ':': '︓',
25808 ';': '︔',
25809 '<': '︿',
25810 '>': '﹀',
25811 '?': '︖',
25812 '[': '﹇',
25813 ']': '﹈',
25814 '_': '︳',
25815 '{': '︷',
25816 '|': '―',
25817 '}': '︸',
25818 '⦅': '︵',
25819 '⦆': '︶',
25820 '。': '︒',
25821 '「': '﹁',
25822 '」': '﹂'
25823};
25824function verticalizePunctuation(input) {
25825 let output = '';
25826 for (let i = 0; i < input.length; i++) {
25827 const nextCharCode = input.charCodeAt(i + 1) || null;
25828 const prevCharCode = input.charCodeAt(i - 1) || null;
25829 const canReplacePunctuation = ((!nextCharCode || !charHasRotatedVerticalOrientation(nextCharCode) || verticalizedCharacterMap[input[i + 1]]) &&
25830 (!prevCharCode || !charHasRotatedVerticalOrientation(prevCharCode) || verticalizedCharacterMap[input[i - 1]]));
25831 if (canReplacePunctuation && verticalizedCharacterMap[input[i]]) {
25832 output += verticalizedCharacterMap[input[i]];
25833 }
25834 else {
25835 output += input[i];
25836 }
25837 }
25838 return output;
25839}
25840
25841// ONE_EM constant used to go between "em" units used in style spec and "points" used internally for layout
25842var ONE_EM = 24;
25843
25844var ieee754$1 = {};
25845
25846/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
25847
25848var read = ieee754$1.read = function (buffer, offset, isLE, mLen, nBytes) {
25849 var e, m;
25850 var eLen = (nBytes * 8) - mLen - 1;
25851 var eMax = (1 << eLen) - 1;
25852 var eBias = eMax >> 1;
25853 var nBits = -7;
25854 var i = isLE ? (nBytes - 1) : 0;
25855 var d = isLE ? -1 : 1;
25856 var s = buffer[offset + i];
25857
25858 i += d;
25859
25860 e = s & ((1 << (-nBits)) - 1);
25861 s >>= (-nBits);
25862 nBits += eLen;
25863 for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
25864
25865 m = e & ((1 << (-nBits)) - 1);
25866 e >>= (-nBits);
25867 nBits += mLen;
25868 for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
25869
25870 if (e === 0) {
25871 e = 1 - eBias;
25872 } else if (e === eMax) {
25873 return m ? NaN : ((s ? -1 : 1) * Infinity)
25874 } else {
25875 m = m + Math.pow(2, mLen);
25876 e = e - eBias;
25877 }
25878 return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
25879};
25880
25881var write = ieee754$1.write = function (buffer, value, offset, isLE, mLen, nBytes) {
25882 var e, m, c;
25883 var eLen = (nBytes * 8) - mLen - 1;
25884 var eMax = (1 << eLen) - 1;
25885 var eBias = eMax >> 1;
25886 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
25887 var i = isLE ? 0 : (nBytes - 1);
25888 var d = isLE ? 1 : -1;
25889 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
25890
25891 value = Math.abs(value);
25892
25893 if (isNaN(value) || value === Infinity) {
25894 m = isNaN(value) ? 1 : 0;
25895 e = eMax;
25896 } else {
25897 e = Math.floor(Math.log(value) / Math.LN2);
25898 if (value * (c = Math.pow(2, -e)) < 1) {
25899 e--;
25900 c *= 2;
25901 }
25902 if (e + eBias >= 1) {
25903 value += rt / c;
25904 } else {
25905 value += rt * Math.pow(2, 1 - eBias);
25906 }
25907 if (value * c >= 2) {
25908 e++;
25909 c /= 2;
25910 }
25911
25912 if (e + eBias >= eMax) {
25913 m = 0;
25914 e = eMax;
25915 } else if (e + eBias >= 1) {
25916 m = ((value * c) - 1) * Math.pow(2, mLen);
25917 e = e + eBias;
25918 } else {
25919 m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
25920 e = 0;
25921 }
25922 }
25923
25924 for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
25925
25926 e = (e << mLen) | m;
25927 eLen += mLen;
25928 for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
25929
25930 buffer[offset + i - d] |= s * 128;
25931};
25932
25933'use strict';
25934
25935var pbf = Pbf;
25936
25937var ieee754 = ieee754$1;
25938
25939function Pbf(buf) {
25940 this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
25941 this.pos = 0;
25942 this.type = 0;
25943 this.length = this.buf.length;
25944}
25945
25946Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
25947Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
25948Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
25949Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
25950
25951var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
25952 SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
25953
25954// Threshold chosen based on both benchmarking and knowledge about browser string
25955// data structures (which currently switch structure types at 12 bytes or more)
25956var TEXT_DECODER_MIN_LENGTH = 12;
25957var utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8');
25958
25959Pbf.prototype = {
25960
25961 destroy: function() {
25962 this.buf = null;
25963 },
25964
25965 // === READING =================================================================
25966
25967 readFields: function(readField, result, end) {
25968 end = end || this.length;
25969
25970 while (this.pos < end) {
25971 var val = this.readVarint(),
25972 tag = val >> 3,
25973 startPos = this.pos;
25974
25975 this.type = val & 0x7;
25976 readField(tag, result, this);
25977
25978 if (this.pos === startPos) this.skip(val);
25979 }
25980 return result;
25981 },
25982
25983 readMessage: function(readField, result) {
25984 return this.readFields(readField, result, this.readVarint() + this.pos);
25985 },
25986
25987 readFixed32: function() {
25988 var val = readUInt32(this.buf, this.pos);
25989 this.pos += 4;
25990 return val;
25991 },
25992
25993 readSFixed32: function() {
25994 var val = readInt32(this.buf, this.pos);
25995 this.pos += 4;
25996 return val;
25997 },
25998
25999 // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
26000
26001 readFixed64: function() {
26002 var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
26003 this.pos += 8;
26004 return val;
26005 },
26006
26007 readSFixed64: function() {
26008 var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
26009 this.pos += 8;
26010 return val;
26011 },
26012
26013 readFloat: function() {
26014 var val = ieee754.read(this.buf, this.pos, true, 23, 4);
26015 this.pos += 4;
26016 return val;
26017 },
26018
26019 readDouble: function() {
26020 var val = ieee754.read(this.buf, this.pos, true, 52, 8);
26021 this.pos += 8;
26022 return val;
26023 },
26024
26025 readVarint: function(isSigned) {
26026 var buf = this.buf,
26027 val, b;
26028
26029 b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) return val;
26030 b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) return val;
26031 b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
26032 b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
26033 b = buf[this.pos]; val |= (b & 0x0f) << 28;
26034
26035 return readVarintRemainder(val, isSigned, this);
26036 },
26037
26038 readVarint64: function() { // for compatibility with v2.0.1
26039 return this.readVarint(true);
26040 },
26041
26042 readSVarint: function() {
26043 var num = this.readVarint();
26044 return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
26045 },
26046
26047 readBoolean: function() {
26048 return Boolean(this.readVarint());
26049 },
26050
26051 readString: function() {
26052 var end = this.readVarint() + this.pos;
26053 var pos = this.pos;
26054 this.pos = end;
26055
26056 if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {
26057 // longer strings are fast with the built-in browser TextDecoder API
26058 return readUtf8TextDecoder(this.buf, pos, end);
26059 }
26060 // short strings are fast with our custom implementation
26061 return readUtf8(this.buf, pos, end);
26062 },
26063
26064 readBytes: function() {
26065 var end = this.readVarint() + this.pos,
26066 buffer = this.buf.subarray(this.pos, end);
26067 this.pos = end;
26068 return buffer;
26069 },
26070
26071 // verbose for performance reasons; doesn't affect gzipped size
26072
26073 readPackedVarint: function(arr, isSigned) {
26074 if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
26075 var end = readPackedEnd(this);
26076 arr = arr || [];
26077 while (this.pos < end) arr.push(this.readVarint(isSigned));
26078 return arr;
26079 },
26080 readPackedSVarint: function(arr) {
26081 if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
26082 var end = readPackedEnd(this);
26083 arr = arr || [];
26084 while (this.pos < end) arr.push(this.readSVarint());
26085 return arr;
26086 },
26087 readPackedBoolean: function(arr) {
26088 if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
26089 var end = readPackedEnd(this);
26090 arr = arr || [];
26091 while (this.pos < end) arr.push(this.readBoolean());
26092 return arr;
26093 },
26094 readPackedFloat: function(arr) {
26095 if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
26096 var end = readPackedEnd(this);
26097 arr = arr || [];
26098 while (this.pos < end) arr.push(this.readFloat());
26099 return arr;
26100 },
26101 readPackedDouble: function(arr) {
26102 if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
26103 var end = readPackedEnd(this);
26104 arr = arr || [];
26105 while (this.pos < end) arr.push(this.readDouble());
26106 return arr;
26107 },
26108 readPackedFixed32: function(arr) {
26109 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
26110 var end = readPackedEnd(this);
26111 arr = arr || [];
26112 while (this.pos < end) arr.push(this.readFixed32());
26113 return arr;
26114 },
26115 readPackedSFixed32: function(arr) {
26116 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
26117 var end = readPackedEnd(this);
26118 arr = arr || [];
26119 while (this.pos < end) arr.push(this.readSFixed32());
26120 return arr;
26121 },
26122 readPackedFixed64: function(arr) {
26123 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
26124 var end = readPackedEnd(this);
26125 arr = arr || [];
26126 while (this.pos < end) arr.push(this.readFixed64());
26127 return arr;
26128 },
26129 readPackedSFixed64: function(arr) {
26130 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
26131 var end = readPackedEnd(this);
26132 arr = arr || [];
26133 while (this.pos < end) arr.push(this.readSFixed64());
26134 return arr;
26135 },
26136
26137 skip: function(val) {
26138 var type = val & 0x7;
26139 if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
26140 else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
26141 else if (type === Pbf.Fixed32) this.pos += 4;
26142 else if (type === Pbf.Fixed64) this.pos += 8;
26143 else throw new Error('Unimplemented type: ' + type);
26144 },
26145
26146 // === WRITING =================================================================
26147
26148 writeTag: function(tag, type) {
26149 this.writeVarint((tag << 3) | type);
26150 },
26151
26152 realloc: function(min) {
26153 var length = this.length || 16;
26154
26155 while (length < this.pos + min) length *= 2;
26156
26157 if (length !== this.length) {
26158 var buf = new Uint8Array(length);
26159 buf.set(this.buf);
26160 this.buf = buf;
26161 this.length = length;
26162 }
26163 },
26164
26165 finish: function() {
26166 this.length = this.pos;
26167 this.pos = 0;
26168 return this.buf.subarray(0, this.length);
26169 },
26170
26171 writeFixed32: function(val) {
26172 this.realloc(4);
26173 writeInt32(this.buf, val, this.pos);
26174 this.pos += 4;
26175 },
26176
26177 writeSFixed32: function(val) {
26178 this.realloc(4);
26179 writeInt32(this.buf, val, this.pos);
26180 this.pos += 4;
26181 },
26182
26183 writeFixed64: function(val) {
26184 this.realloc(8);
26185 writeInt32(this.buf, val & -1, this.pos);
26186 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
26187 this.pos += 8;
26188 },
26189
26190 writeSFixed64: function(val) {
26191 this.realloc(8);
26192 writeInt32(this.buf, val & -1, this.pos);
26193 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
26194 this.pos += 8;
26195 },
26196
26197 writeVarint: function(val) {
26198 val = +val || 0;
26199
26200 if (val > 0xfffffff || val < 0) {
26201 writeBigVarint(val, this);
26202 return;
26203 }
26204
26205 this.realloc(4);
26206
26207 this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
26208 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
26209 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
26210 this.buf[this.pos++] = (val >>> 7) & 0x7f;
26211 },
26212
26213 writeSVarint: function(val) {
26214 this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
26215 },
26216
26217 writeBoolean: function(val) {
26218 this.writeVarint(Boolean(val));
26219 },
26220
26221 writeString: function(str) {
26222 str = String(str);
26223 this.realloc(str.length * 4);
26224
26225 this.pos++; // reserve 1 byte for short string length
26226
26227 var startPos = this.pos;
26228 // write the string directly to the buffer and see how much was written
26229 this.pos = writeUtf8(this.buf, str, this.pos);
26230 var len = this.pos - startPos;
26231
26232 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
26233
26234 // finally, write the message length in the reserved place and restore the position
26235 this.pos = startPos - 1;
26236 this.writeVarint(len);
26237 this.pos += len;
26238 },
26239
26240 writeFloat: function(val) {
26241 this.realloc(4);
26242 ieee754.write(this.buf, val, this.pos, true, 23, 4);
26243 this.pos += 4;
26244 },
26245
26246 writeDouble: function(val) {
26247 this.realloc(8);
26248 ieee754.write(this.buf, val, this.pos, true, 52, 8);
26249 this.pos += 8;
26250 },
26251
26252 writeBytes: function(buffer) {
26253 var len = buffer.length;
26254 this.writeVarint(len);
26255 this.realloc(len);
26256 for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
26257 },
26258
26259 writeRawMessage: function(fn, obj) {
26260 this.pos++; // reserve 1 byte for short message length
26261
26262 // write the message directly to the buffer and see how much was written
26263 var startPos = this.pos;
26264 fn(obj, this);
26265 var len = this.pos - startPos;
26266
26267 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
26268
26269 // finally, write the message length in the reserved place and restore the position
26270 this.pos = startPos - 1;
26271 this.writeVarint(len);
26272 this.pos += len;
26273 },
26274
26275 writeMessage: function(tag, fn, obj) {
26276 this.writeTag(tag, Pbf.Bytes);
26277 this.writeRawMessage(fn, obj);
26278 },
26279
26280 writePackedVarint: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr); },
26281 writePackedSVarint: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr); },
26282 writePackedBoolean: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr); },
26283 writePackedFloat: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr); },
26284 writePackedDouble: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr); },
26285 writePackedFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr); },
26286 writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
26287 writePackedFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr); },
26288 writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
26289
26290 writeBytesField: function(tag, buffer) {
26291 this.writeTag(tag, Pbf.Bytes);
26292 this.writeBytes(buffer);
26293 },
26294 writeFixed32Field: function(tag, val) {
26295 this.writeTag(tag, Pbf.Fixed32);
26296 this.writeFixed32(val);
26297 },
26298 writeSFixed32Field: function(tag, val) {
26299 this.writeTag(tag, Pbf.Fixed32);
26300 this.writeSFixed32(val);
26301 },
26302 writeFixed64Field: function(tag, val) {
26303 this.writeTag(tag, Pbf.Fixed64);
26304 this.writeFixed64(val);
26305 },
26306 writeSFixed64Field: function(tag, val) {
26307 this.writeTag(tag, Pbf.Fixed64);
26308 this.writeSFixed64(val);
26309 },
26310 writeVarintField: function(tag, val) {
26311 this.writeTag(tag, Pbf.Varint);
26312 this.writeVarint(val);
26313 },
26314 writeSVarintField: function(tag, val) {
26315 this.writeTag(tag, Pbf.Varint);
26316 this.writeSVarint(val);
26317 },
26318 writeStringField: function(tag, str) {
26319 this.writeTag(tag, Pbf.Bytes);
26320 this.writeString(str);
26321 },
26322 writeFloatField: function(tag, val) {
26323 this.writeTag(tag, Pbf.Fixed32);
26324 this.writeFloat(val);
26325 },
26326 writeDoubleField: function(tag, val) {
26327 this.writeTag(tag, Pbf.Fixed64);
26328 this.writeDouble(val);
26329 },
26330 writeBooleanField: function(tag, val) {
26331 this.writeVarintField(tag, Boolean(val));
26332 }
26333};
26334
26335function readVarintRemainder(l, s, p) {
26336 var buf = p.buf,
26337 h, b;
26338
26339 b = buf[p.pos++]; h = (b & 0x70) >> 4; if (b < 0x80) return toNum(l, h, s);
26340 b = buf[p.pos++]; h |= (b & 0x7f) << 3; if (b < 0x80) return toNum(l, h, s);
26341 b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
26342 b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
26343 b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
26344 b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
26345
26346 throw new Error('Expected varint not more than 10 bytes');
26347}
26348
26349function readPackedEnd(pbf) {
26350 return pbf.type === Pbf.Bytes ?
26351 pbf.readVarint() + pbf.pos : pbf.pos + 1;
26352}
26353
26354function toNum(low, high, isSigned) {
26355 if (isSigned) {
26356 return high * 0x100000000 + (low >>> 0);
26357 }
26358
26359 return ((high >>> 0) * 0x100000000) + (low >>> 0);
26360}
26361
26362function writeBigVarint(val, pbf) {
26363 var low, high;
26364
26365 if (val >= 0) {
26366 low = (val % 0x100000000) | 0;
26367 high = (val / 0x100000000) | 0;
26368 } else {
26369 low = ~(-val % 0x100000000);
26370 high = ~(-val / 0x100000000);
26371
26372 if (low ^ 0xffffffff) {
26373 low = (low + 1) | 0;
26374 } else {
26375 low = 0;
26376 high = (high + 1) | 0;
26377 }
26378 }
26379
26380 if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
26381 throw new Error('Given varint doesn\'t fit into 10 bytes');
26382 }
26383
26384 pbf.realloc(10);
26385
26386 writeBigVarintLow(low, high, pbf);
26387 writeBigVarintHigh(high, pbf);
26388}
26389
26390function writeBigVarintLow(low, high, pbf) {
26391 pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
26392 pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
26393 pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
26394 pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
26395 pbf.buf[pbf.pos] = low & 0x7f;
26396}
26397
26398function writeBigVarintHigh(high, pbf) {
26399 var lsb = (high & 0x07) << 4;
26400
26401 pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
26402 pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
26403 pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
26404 pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
26405 pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
26406 pbf.buf[pbf.pos++] = high & 0x7f;
26407}
26408
26409function makeRoomForExtraLength(startPos, len, pbf) {
26410 var extraLen =
26411 len <= 0x3fff ? 1 :
26412 len <= 0x1fffff ? 2 :
26413 len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
26414
26415 // if 1 byte isn't enough for encoding message length, shift the data to the right
26416 pbf.realloc(extraLen);
26417 for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
26418}
26419
26420function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); }
26421function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); }
26422function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); }
26423function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); }
26424function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); }
26425function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); }
26426function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
26427function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); }
26428function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
26429
26430// Buffer code below from https://github.com/feross/buffer, MIT-licensed
26431
26432function readUInt32(buf, pos) {
26433 return ((buf[pos]) |
26434 (buf[pos + 1] << 8) |
26435 (buf[pos + 2] << 16)) +
26436 (buf[pos + 3] * 0x1000000);
26437}
26438
26439function writeInt32(buf, val, pos) {
26440 buf[pos] = val;
26441 buf[pos + 1] = (val >>> 8);
26442 buf[pos + 2] = (val >>> 16);
26443 buf[pos + 3] = (val >>> 24);
26444}
26445
26446function readInt32(buf, pos) {
26447 return ((buf[pos]) |
26448 (buf[pos + 1] << 8) |
26449 (buf[pos + 2] << 16)) +
26450 (buf[pos + 3] << 24);
26451}
26452
26453function readUtf8(buf, pos, end) {
26454 var str = '';
26455 var i = pos;
26456
26457 while (i < end) {
26458 var b0 = buf[i];
26459 var c = null; // codepoint
26460 var bytesPerSequence =
26461 b0 > 0xEF ? 4 :
26462 b0 > 0xDF ? 3 :
26463 b0 > 0xBF ? 2 : 1;
26464
26465 if (i + bytesPerSequence > end) break;
26466
26467 var b1, b2, b3;
26468
26469 if (bytesPerSequence === 1) {
26470 if (b0 < 0x80) {
26471 c = b0;
26472 }
26473 } else if (bytesPerSequence === 2) {
26474 b1 = buf[i + 1];
26475 if ((b1 & 0xC0) === 0x80) {
26476 c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
26477 if (c <= 0x7F) {
26478 c = null;
26479 }
26480 }
26481 } else if (bytesPerSequence === 3) {
26482 b1 = buf[i + 1];
26483 b2 = buf[i + 2];
26484 if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
26485 c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
26486 if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
26487 c = null;
26488 }
26489 }
26490 } else if (bytesPerSequence === 4) {
26491 b1 = buf[i + 1];
26492 b2 = buf[i + 2];
26493 b3 = buf[i + 3];
26494 if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
26495 c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
26496 if (c <= 0xFFFF || c >= 0x110000) {
26497 c = null;
26498 }
26499 }
26500 }
26501
26502 if (c === null) {
26503 c = 0xFFFD;
26504 bytesPerSequence = 1;
26505
26506 } else if (c > 0xFFFF) {
26507 c -= 0x10000;
26508 str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
26509 c = 0xDC00 | c & 0x3FF;
26510 }
26511
26512 str += String.fromCharCode(c);
26513 i += bytesPerSequence;
26514 }
26515
26516 return str;
26517}
26518
26519function readUtf8TextDecoder(buf, pos, end) {
26520 return utf8TextDecoder.decode(buf.subarray(pos, end));
26521}
26522
26523function writeUtf8(buf, str, pos) {
26524 for (var i = 0, c, lead; i < str.length; i++) {
26525 c = str.charCodeAt(i); // code point
26526
26527 if (c > 0xD7FF && c < 0xE000) {
26528 if (lead) {
26529 if (c < 0xDC00) {
26530 buf[pos++] = 0xEF;
26531 buf[pos++] = 0xBF;
26532 buf[pos++] = 0xBD;
26533 lead = c;
26534 continue;
26535 } else {
26536 c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
26537 lead = null;
26538 }
26539 } else {
26540 if (c > 0xDBFF || (i + 1 === str.length)) {
26541 buf[pos++] = 0xEF;
26542 buf[pos++] = 0xBF;
26543 buf[pos++] = 0xBD;
26544 } else {
26545 lead = c;
26546 }
26547 continue;
26548 }
26549 } else if (lead) {
26550 buf[pos++] = 0xEF;
26551 buf[pos++] = 0xBF;
26552 buf[pos++] = 0xBD;
26553 lead = null;
26554 }
26555
26556 if (c < 0x80) {
26557 buf[pos++] = c;
26558 } else {
26559 if (c < 0x800) {
26560 buf[pos++] = c >> 0x6 | 0xC0;
26561 } else {
26562 if (c < 0x10000) {
26563 buf[pos++] = c >> 0xC | 0xE0;
26564 } else {
26565 buf[pos++] = c >> 0x12 | 0xF0;
26566 buf[pos++] = c >> 0xC & 0x3F | 0x80;
26567 }
26568 buf[pos++] = c >> 0x6 & 0x3F | 0x80;
26569 }
26570 buf[pos++] = c & 0x3F | 0x80;
26571 }
26572 }
26573 return pos;
26574}
26575
26576const border$1 = 3;
26577function readFontstacks(tag, glyphs, pbf) {
26578 if (tag === 1) {
26579 pbf.readMessage(readFontstack, glyphs);
26580 }
26581}
26582function readFontstack(tag, glyphs, pbf) {
26583 if (tag === 3) {
26584 const { id, bitmap, width, height, left, top, advance } = pbf.readMessage(readGlyph, {});
26585 glyphs.push({
26586 id,
26587 bitmap: new AlphaImage({
26588 width: width + 2 * border$1,
26589 height: height + 2 * border$1
26590 }, bitmap),
26591 metrics: { width, height, left, top, advance }
26592 });
26593 }
26594}
26595function readGlyph(tag, glyph, pbf) {
26596 if (tag === 1)
26597 glyph.id = pbf.readVarint();
26598 else if (tag === 2)
26599 glyph.bitmap = pbf.readBytes();
26600 else if (tag === 3)
26601 glyph.width = pbf.readVarint();
26602 else if (tag === 4)
26603 glyph.height = pbf.readVarint();
26604 else if (tag === 5)
26605 glyph.left = pbf.readSVarint();
26606 else if (tag === 6)
26607 glyph.top = pbf.readSVarint();
26608 else if (tag === 7)
26609 glyph.advance = pbf.readVarint();
26610}
26611function parseGlyphPBF (data) {
26612 return new pbf(data).readFields(readFontstacks, []);
26613}
26614const GLYPH_PBF_BORDER = border$1;
26615
26616function potpack(boxes) {
26617
26618 // calculate total box area and maximum box width
26619 let area = 0;
26620 let maxWidth = 0;
26621
26622 for (const box of boxes) {
26623 area += box.w * box.h;
26624 maxWidth = Math.max(maxWidth, box.w);
26625 }
26626
26627 // sort the boxes for insertion by height, descending
26628 boxes.sort((a, b) => b.h - a.h);
26629
26630 // aim for a squarish resulting container,
26631 // slightly adjusted for sub-100% space utilization
26632 const startWidth = Math.max(Math.ceil(Math.sqrt(area / 0.95)), maxWidth);
26633
26634 // start with a single empty space, unbounded at the bottom
26635 const spaces = [{x: 0, y: 0, w: startWidth, h: Infinity}];
26636
26637 let width = 0;
26638 let height = 0;
26639
26640 for (const box of boxes) {
26641 // look through spaces backwards so that we check smaller spaces first
26642 for (let i = spaces.length - 1; i >= 0; i--) {
26643 const space = spaces[i];
26644
26645 // look for empty spaces that can accommodate the current box
26646 if (box.w > space.w || box.h > space.h) continue;
26647
26648 // found the space; add the box to its top-left corner
26649 // |-------|-------|
26650 // | box | |
26651 // |_______| |
26652 // | space |
26653 // |_______________|
26654 box.x = space.x;
26655 box.y = space.y;
26656
26657 height = Math.max(height, box.y + box.h);
26658 width = Math.max(width, box.x + box.w);
26659
26660 if (box.w === space.w && box.h === space.h) {
26661 // space matches the box exactly; remove it
26662 const last = spaces.pop();
26663 if (i < spaces.length) spaces[i] = last;
26664
26665 } else if (box.h === space.h) {
26666 // space matches the box height; update it accordingly
26667 // |-------|---------------|
26668 // | box | updated space |
26669 // |_______|_______________|
26670 space.x += box.w;
26671 space.w -= box.w;
26672
26673 } else if (box.w === space.w) {
26674 // space matches the box width; update it accordingly
26675 // |---------------|
26676 // | box |
26677 // |_______________|
26678 // | updated space |
26679 // |_______________|
26680 space.y += box.h;
26681 space.h -= box.h;
26682
26683 } else {
26684 // otherwise the box splits the space into two spaces
26685 // |-------|-----------|
26686 // | box | new space |
26687 // |_______|___________|
26688 // | updated space |
26689 // |___________________|
26690 spaces.push({
26691 x: space.x + box.w,
26692 y: space.y,
26693 w: space.w - box.w,
26694 h: box.h
26695 });
26696 space.y += box.h;
26697 space.h -= box.h;
26698 }
26699 break;
26700 }
26701 }
26702
26703 return {
26704 w: width, // container width
26705 h: height, // container height
26706 fill: (area / (width * height)) || 0 // space utilization
26707 };
26708}
26709
26710const IMAGE_PADDING = 1;
26711class ImagePosition {
26712 constructor(paddedRect, { pixelRatio, version, stretchX, stretchY, content }) {
26713 this.paddedRect = paddedRect;
26714 this.pixelRatio = pixelRatio;
26715 this.stretchX = stretchX;
26716 this.stretchY = stretchY;
26717 this.content = content;
26718 this.version = version;
26719 }
26720 get tl() {
26721 return [
26722 this.paddedRect.x + IMAGE_PADDING,
26723 this.paddedRect.y + IMAGE_PADDING
26724 ];
26725 }
26726 get br() {
26727 return [
26728 this.paddedRect.x + this.paddedRect.w - IMAGE_PADDING,
26729 this.paddedRect.y + this.paddedRect.h - IMAGE_PADDING
26730 ];
26731 }
26732 get tlbr() {
26733 return this.tl.concat(this.br);
26734 }
26735 get displaySize() {
26736 return [
26737 (this.paddedRect.w - IMAGE_PADDING * 2) / this.pixelRatio,
26738 (this.paddedRect.h - IMAGE_PADDING * 2) / this.pixelRatio
26739 ];
26740 }
26741}
26742class ImageAtlas {
26743 constructor(icons, patterns) {
26744 const iconPositions = {}, patternPositions = {};
26745 this.haveRenderCallbacks = [];
26746 const bins = [];
26747 this.addImages(icons, iconPositions, bins);
26748 this.addImages(patterns, patternPositions, bins);
26749 const { w, h } = potpack(bins);
26750 const image = new RGBAImage({ width: w || 1, height: h || 1 });
26751 for (const id in icons) {
26752 const src = icons[id];
26753 const bin = iconPositions[id].paddedRect;
26754 RGBAImage.copy(src.data, image, { x: 0, y: 0 }, { x: bin.x + IMAGE_PADDING, y: bin.y + IMAGE_PADDING }, src.data);
26755 }
26756 for (const id in patterns) {
26757 const src = patterns[id];
26758 const bin = patternPositions[id].paddedRect;
26759 const x = bin.x + IMAGE_PADDING, y = bin.y + IMAGE_PADDING, w = src.data.width, h = src.data.height;
26760 RGBAImage.copy(src.data, image, { x: 0, y: 0 }, { x, y }, src.data);
26761 // Add 1 pixel wrapped padding on each side of the image.
26762 RGBAImage.copy(src.data, image, { x: 0, y: h - 1 }, { x, y: y - 1 }, { width: w, height: 1 }); // T
26763 RGBAImage.copy(src.data, image, { x: 0, y: 0 }, { x, y: y + h }, { width: w, height: 1 }); // B
26764 RGBAImage.copy(src.data, image, { x: w - 1, y: 0 }, { x: x - 1, y }, { width: 1, height: h }); // L
26765 RGBAImage.copy(src.data, image, { x: 0, y: 0 }, { x: x + w, y }, { width: 1, height: h }); // R
26766 }
26767 this.image = image;
26768 this.iconPositions = iconPositions;
26769 this.patternPositions = patternPositions;
26770 }
26771 addImages(images, positions, bins) {
26772 for (const id in images) {
26773 const src = images[id];
26774 const bin = {
26775 x: 0,
26776 y: 0,
26777 w: src.data.width + 2 * IMAGE_PADDING,
26778 h: src.data.height + 2 * IMAGE_PADDING,
26779 };
26780 bins.push(bin);
26781 positions[id] = new ImagePosition(bin, src);
26782 if (src.hasRenderCallback) {
26783 this.haveRenderCallbacks.push(id);
26784 }
26785 }
26786 }
26787 patchUpdatedImages(imageManager, texture) {
26788 imageManager.dispatchRenderCallbacks(this.haveRenderCallbacks);
26789 for (const name in imageManager.updatedImages) {
26790 this.patchUpdatedImage(this.iconPositions[name], imageManager.getImage(name), texture);
26791 this.patchUpdatedImage(this.patternPositions[name], imageManager.getImage(name), texture);
26792 }
26793 }
26794 patchUpdatedImage(position, image, texture) {
26795 if (!position || !image)
26796 return;
26797 if (position.version === image.version)
26798 return;
26799 position.version = image.version;
26800 const [x, y] = position.tl;
26801 texture.update(image.data, undefined, { x, y });
26802 }
26803}
26804register('ImagePosition', ImagePosition);
26805register('ImageAtlas', ImageAtlas);
26806
26807exports.WritingMode = void 0;
26808(function (WritingMode) {
26809 WritingMode[WritingMode["none"] = 0] = "none";
26810 WritingMode[WritingMode["horizontal"] = 1] = "horizontal";
26811 WritingMode[WritingMode["vertical"] = 2] = "vertical";
26812 WritingMode[WritingMode["horizontalOnly"] = 3] = "horizontalOnly";
26813})(exports.WritingMode || (exports.WritingMode = {}));
26814const SHAPING_DEFAULT_OFFSET = -17;
26815function isEmpty(positionedLines) {
26816 for (const line of positionedLines) {
26817 if (line.positionedGlyphs.length !== 0) {
26818 return false;
26819 }
26820 }
26821 return true;
26822}
26823// Max number of images in label is 6401 U+E000–U+F8FF that covers
26824// Basic Multilingual Plane Unicode Private Use Area (PUA).
26825const PUAbegin = 0xE000;
26826const PUAend = 0xF8FF;
26827class SectionOptions {
26828 constructor() {
26829 this.scale = 1.0;
26830 this.fontStack = '';
26831 this.imageName = null;
26832 }
26833 static forText(scale, fontStack) {
26834 const textOptions = new SectionOptions();
26835 textOptions.scale = scale || 1;
26836 textOptions.fontStack = fontStack;
26837 return textOptions;
26838 }
26839 static forImage(imageName) {
26840 const imageOptions = new SectionOptions();
26841 imageOptions.imageName = imageName;
26842 return imageOptions;
26843 }
26844}
26845class TaggedString {
26846 constructor() {
26847 this.text = '';
26848 this.sectionIndex = [];
26849 this.sections = [];
26850 this.imageSectionID = null;
26851 }
26852 static fromFeature(text, defaultFontStack) {
26853 const result = new TaggedString();
26854 for (let i = 0; i < text.sections.length; i++) {
26855 const section = text.sections[i];
26856 if (!section.image) {
26857 result.addTextSection(section, defaultFontStack);
26858 }
26859 else {
26860 result.addImageSection(section);
26861 }
26862 }
26863 return result;
26864 }
26865 length() {
26866 return this.text.length;
26867 }
26868 getSection(index) {
26869 return this.sections[this.sectionIndex[index]];
26870 }
26871 getSectionIndex(index) {
26872 return this.sectionIndex[index];
26873 }
26874 getCharCode(index) {
26875 return this.text.charCodeAt(index);
26876 }
26877 verticalizePunctuation() {
26878 this.text = verticalizePunctuation(this.text);
26879 }
26880 trim() {
26881 let beginningWhitespace = 0;
26882 for (let i = 0; i < this.text.length && whitespace[this.text.charCodeAt(i)]; i++) {
26883 beginningWhitespace++;
26884 }
26885 let trailingWhitespace = this.text.length;
26886 for (let i = this.text.length - 1; i >= 0 && i >= beginningWhitespace && whitespace[this.text.charCodeAt(i)]; i--) {
26887 trailingWhitespace--;
26888 }
26889 this.text = this.text.substring(beginningWhitespace, trailingWhitespace);
26890 this.sectionIndex = this.sectionIndex.slice(beginningWhitespace, trailingWhitespace);
26891 }
26892 substring(start, end) {
26893 const substring = new TaggedString();
26894 substring.text = this.text.substring(start, end);
26895 substring.sectionIndex = this.sectionIndex.slice(start, end);
26896 substring.sections = this.sections;
26897 return substring;
26898 }
26899 toString() {
26900 return this.text;
26901 }
26902 getMaxScale() {
26903 return this.sectionIndex.reduce((max, index) => Math.max(max, this.sections[index].scale), 0);
26904 }
26905 addTextSection(section, defaultFontStack) {
26906 this.text += section.text;
26907 this.sections.push(SectionOptions.forText(section.scale, section.fontStack || defaultFontStack));
26908 const index = this.sections.length - 1;
26909 for (let i = 0; i < section.text.length; ++i) {
26910 this.sectionIndex.push(index);
26911 }
26912 }
26913 addImageSection(section) {
26914 const imageName = section.image ? section.image.name : '';
26915 if (imageName.length === 0) {
26916 warnOnce('Can\'t add FormattedSection with an empty image.');
26917 return;
26918 }
26919 const nextImageSectionCharCode = this.getNextImageSectionCharCode();
26920 if (!nextImageSectionCharCode) {
26921 warnOnce(`Reached maximum number of images ${PUAend - PUAbegin + 2}`);
26922 return;
26923 }
26924 this.text += String.fromCharCode(nextImageSectionCharCode);
26925 this.sections.push(SectionOptions.forImage(imageName));
26926 this.sectionIndex.push(this.sections.length - 1);
26927 }
26928 getNextImageSectionCharCode() {
26929 if (!this.imageSectionID) {
26930 this.imageSectionID = PUAbegin;
26931 return this.imageSectionID;
26932 }
26933 if (this.imageSectionID >= PUAend)
26934 return null;
26935 return ++this.imageSectionID;
26936 }
26937}
26938function breakLines(input, lineBreakPoints) {
26939 const lines = [];
26940 const text = input.text;
26941 let start = 0;
26942 for (const lineBreak of lineBreakPoints) {
26943 lines.push(input.substring(start, lineBreak));
26944 start = lineBreak;
26945 }
26946 if (start < text.length) {
26947 lines.push(input.substring(start, text.length));
26948 }
26949 return lines;
26950}
26951function shapeText(text, glyphMap, glyphPositions, imagePositions, defaultFontStack, maxWidth, lineHeight, textAnchor, textJustify, spacing, translate, writingMode, allowVerticalPlacement, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom) {
26952 const logicalInput = TaggedString.fromFeature(text, defaultFontStack);
26953 if (writingMode === exports.WritingMode.vertical) {
26954 logicalInput.verticalizePunctuation();
26955 }
26956 let lines;
26957 const { processBidirectionalText, processStyledBidirectionalText } = plugin;
26958 if (processBidirectionalText && logicalInput.sections.length === 1) {
26959 // Bidi doesn't have to be style-aware
26960 lines = [];
26961 const untaggedLines = processBidirectionalText(logicalInput.toString(), determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize));
26962 for (const line of untaggedLines) {
26963 const taggedLine = new TaggedString();
26964 taggedLine.text = line;
26965 taggedLine.sections = logicalInput.sections;
26966 for (let i = 0; i < line.length; i++) {
26967 taggedLine.sectionIndex.push(0);
26968 }
26969 lines.push(taggedLine);
26970 }
26971 }
26972 else if (processStyledBidirectionalText) {
26973 // Need version of mapbox-gl-rtl-text with style support for combining RTL text
26974 // with formatting
26975 lines = [];
26976 const processedLines = processStyledBidirectionalText(logicalInput.text, logicalInput.sectionIndex, determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize));
26977 for (const line of processedLines) {
26978 const taggedLine = new TaggedString();
26979 taggedLine.text = line[0];
26980 taggedLine.sectionIndex = line[1];
26981 taggedLine.sections = logicalInput.sections;
26982 lines.push(taggedLine);
26983 }
26984 }
26985 else {
26986 lines = breakLines(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize));
26987 }
26988 const positionedLines = [];
26989 const shaping = {
26990 positionedLines,
26991 text: logicalInput.toString(),
26992 top: translate[1],
26993 bottom: translate[1],
26994 left: translate[0],
26995 right: translate[0],
26996 writingMode,
26997 iconsInText: false,
26998 verticalizable: false
26999 };
27000 shapeLines(shaping, glyphMap, glyphPositions, imagePositions, lines, lineHeight, textAnchor, textJustify, writingMode, spacing, allowVerticalPlacement, layoutTextSizeThisZoom);
27001 if (isEmpty(positionedLines))
27002 return false;
27003 return shaping;
27004}
27005// using computed properties due to https://github.com/facebook/flow/issues/380
27006/* eslint no-useless-computed-key: 0 */
27007const whitespace = {
27008 [0x09]: true,
27009 [0x0a]: true,
27010 [0x0b]: true,
27011 [0x0c]: true,
27012 [0x0d]: true,
27013 [0x20]: true, // space
27014};
27015const breakable = {
27016 [0x0a]: true,
27017 [0x20]: true,
27018 [0x26]: true,
27019 [0x28]: true,
27020 [0x29]: true,
27021 [0x2b]: true,
27022 [0x2d]: true,
27023 [0x2f]: true,
27024 [0xad]: true,
27025 [0xb7]: true,
27026 [0x200b]: true,
27027 [0x2010]: true,
27028 [0x2013]: true,
27029 [0x2027]: true // interpunct
27030 // Many other characters may be reasonable breakpoints
27031 // Consider "neutral orientation" characters at scriptDetection.charHasNeutralVerticalOrientation
27032 // See https://github.com/mapbox/mapbox-gl-js/issues/3658
27033};
27034function getGlyphAdvance(codePoint, section, glyphMap, imagePositions, spacing, layoutTextSize) {
27035 if (!section.imageName) {
27036 const positions = glyphMap[section.fontStack];
27037 const glyph = positions && positions[codePoint];
27038 if (!glyph)
27039 return 0;
27040 return glyph.metrics.advance * section.scale + spacing;
27041 }
27042 else {
27043 const imagePosition = imagePositions[section.imageName];
27044 if (!imagePosition)
27045 return 0;
27046 return imagePosition.displaySize[0] * section.scale * ONE_EM / layoutTextSize + spacing;
27047 }
27048}
27049function determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize) {
27050 let totalWidth = 0;
27051 for (let index = 0; index < logicalInput.length(); index++) {
27052 const section = logicalInput.getSection(index);
27053 totalWidth += getGlyphAdvance(logicalInput.getCharCode(index), section, glyphMap, imagePositions, spacing, layoutTextSize);
27054 }
27055 const lineCount = Math.max(1, Math.ceil(totalWidth / maxWidth));
27056 return totalWidth / lineCount;
27057}
27058function calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) {
27059 const raggedness = Math.pow(lineWidth - targetWidth, 2);
27060 if (isLastBreak) {
27061 // Favor finals lines shorter than average over longer than average
27062 if (lineWidth < targetWidth) {
27063 return raggedness / 2;
27064 }
27065 else {
27066 return raggedness * 2;
27067 }
27068 }
27069 return raggedness + Math.abs(penalty) * penalty;
27070}
27071function calculatePenalty(codePoint, nextCodePoint, penalizableIdeographicBreak) {
27072 let penalty = 0;
27073 // Force break on newline
27074 if (codePoint === 0x0a) {
27075 penalty -= 10000;
27076 }
27077 // Penalize breaks between characters that allow ideographic breaking because
27078 // they are less preferable than breaks at spaces (or zero width spaces).
27079 if (penalizableIdeographicBreak) {
27080 penalty += 150;
27081 }
27082 // Penalize open parenthesis at end of line
27083 if (codePoint === 0x28 || codePoint === 0xff08) {
27084 penalty += 50;
27085 }
27086 // Penalize close parenthesis at beginning of line
27087 if (nextCodePoint === 0x29 || nextCodePoint === 0xff09) {
27088 penalty += 50;
27089 }
27090 return penalty;
27091}
27092function evaluateBreak(breakIndex, breakX, targetWidth, potentialBreaks, penalty, isLastBreak) {
27093 // We could skip evaluating breaks where the line length (breakX - priorBreak.x) > maxWidth
27094 // ...but in fact we allow lines longer than maxWidth (if there's no break points)
27095 // ...and when targetWidth and maxWidth are close, strictly enforcing maxWidth can give
27096 // more lopsided results.
27097 let bestPriorBreak = null;
27098 let bestBreakBadness = calculateBadness(breakX, targetWidth, penalty, isLastBreak);
27099 for (const potentialBreak of potentialBreaks) {
27100 const lineWidth = breakX - potentialBreak.x;
27101 const breakBadness = calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) + potentialBreak.badness;
27102 if (breakBadness <= bestBreakBadness) {
27103 bestPriorBreak = potentialBreak;
27104 bestBreakBadness = breakBadness;
27105 }
27106 }
27107 return {
27108 index: breakIndex,
27109 x: breakX,
27110 priorBreak: bestPriorBreak,
27111 badness: bestBreakBadness
27112 };
27113}
27114function leastBadBreaks(lastLineBreak) {
27115 if (!lastLineBreak) {
27116 return [];
27117 }
27118 return leastBadBreaks(lastLineBreak.priorBreak).concat(lastLineBreak.index);
27119}
27120function determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize) {
27121 if (symbolPlacement !== 'point')
27122 return [];
27123 if (!logicalInput)
27124 return [];
27125 const potentialLineBreaks = [];
27126 const targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize);
27127 const hasServerSuggestedBreakpoints = logicalInput.text.indexOf('\u200b') >= 0;
27128 let currentX = 0;
27129 for (let i = 0; i < logicalInput.length(); i++) {
27130 const section = logicalInput.getSection(i);
27131 const codePoint = logicalInput.getCharCode(i);
27132 if (!whitespace[codePoint])
27133 currentX += getGlyphAdvance(codePoint, section, glyphMap, imagePositions, spacing, layoutTextSize);
27134 // Ideographic characters, spaces, and word-breaking punctuation that often appear without
27135 // surrounding spaces.
27136 if ((i < logicalInput.length() - 1)) {
27137 const ideographicBreak = charAllowsIdeographicBreaking(codePoint);
27138 if (breakable[codePoint] || ideographicBreak || section.imageName) {
27139 potentialLineBreaks.push(evaluateBreak(i + 1, currentX, targetWidth, potentialLineBreaks, calculatePenalty(codePoint, logicalInput.getCharCode(i + 1), ideographicBreak && hasServerSuggestedBreakpoints), false));
27140 }
27141 }
27142 }
27143 return leastBadBreaks(evaluateBreak(logicalInput.length(), currentX, targetWidth, potentialLineBreaks, 0, true));
27144}
27145function getAnchorAlignment(anchor) {
27146 let horizontalAlign = 0.5, verticalAlign = 0.5;
27147 switch (anchor) {
27148 case 'right':
27149 case 'top-right':
27150 case 'bottom-right':
27151 horizontalAlign = 1;
27152 break;
27153 case 'left':
27154 case 'top-left':
27155 case 'bottom-left':
27156 horizontalAlign = 0;
27157 break;
27158 }
27159 switch (anchor) {
27160 case 'bottom':
27161 case 'bottom-right':
27162 case 'bottom-left':
27163 verticalAlign = 1;
27164 break;
27165 case 'top':
27166 case 'top-right':
27167 case 'top-left':
27168 verticalAlign = 0;
27169 break;
27170 }
27171 return { horizontalAlign, verticalAlign };
27172}
27173function shapeLines(shaping, glyphMap, glyphPositions, imagePositions, lines, lineHeight, textAnchor, textJustify, writingMode, spacing, allowVerticalPlacement, layoutTextSizeThisZoom) {
27174 let x = 0;
27175 let y = SHAPING_DEFAULT_OFFSET;
27176 let maxLineLength = 0;
27177 let maxLineHeight = 0;
27178 const justify = textJustify === 'right' ? 1 :
27179 textJustify === 'left' ? 0 : 0.5;
27180 let lineIndex = 0;
27181 for (const line of lines) {
27182 line.trim();
27183 const lineMaxScale = line.getMaxScale();
27184 const maxLineOffset = (lineMaxScale - 1) * ONE_EM;
27185 const positionedLine = { positionedGlyphs: [], lineOffset: 0 };
27186 shaping.positionedLines[lineIndex] = positionedLine;
27187 const positionedGlyphs = positionedLine.positionedGlyphs;
27188 let lineOffset = 0.0;
27189 if (!line.length()) {
27190 y += lineHeight; // Still need a line feed after empty line
27191 ++lineIndex;
27192 continue;
27193 }
27194 for (let i = 0; i < line.length(); i++) {
27195 const section = line.getSection(i);
27196 const sectionIndex = line.getSectionIndex(i);
27197 const codePoint = line.getCharCode(i);
27198 let baselineOffset = 0.0;
27199 let metrics = null;
27200 let rect = null;
27201 let imageName = null;
27202 let verticalAdvance = ONE_EM;
27203 const vertical = !(writingMode === exports.WritingMode.horizontal ||
27204 // Don't verticalize glyphs that have no upright orientation if vertical placement is disabled.
27205 (!allowVerticalPlacement && !charHasUprightVerticalOrientation(codePoint)) ||
27206 // If vertical placement is enabled, don't verticalize glyphs that
27207 // are from complex text layout script, or whitespaces.
27208 (allowVerticalPlacement && (whitespace[codePoint] || charInComplexShapingScript(codePoint))));
27209 if (!section.imageName) {
27210 const positions = glyphPositions[section.fontStack];
27211 const glyphPosition = positions && positions[codePoint];
27212 if (glyphPosition && glyphPosition.rect) {
27213 rect = glyphPosition.rect;
27214 metrics = glyphPosition.metrics;
27215 }
27216 else {
27217 const glyphs = glyphMap[section.fontStack];
27218 const glyph = glyphs && glyphs[codePoint];
27219 if (!glyph)
27220 continue;
27221 metrics = glyph.metrics;
27222 }
27223 // We don't know the baseline, but since we're laying out
27224 // at 24 points, we can calculate how much it will move when
27225 // we scale up or down.
27226 baselineOffset = (lineMaxScale - section.scale) * ONE_EM;
27227 }
27228 else {
27229 const imagePosition = imagePositions[section.imageName];
27230 if (!imagePosition)
27231 continue;
27232 imageName = section.imageName;
27233 shaping.iconsInText = shaping.iconsInText || true;
27234 rect = imagePosition.paddedRect;
27235 const size = imagePosition.displaySize;
27236 // If needed, allow to set scale factor for an image using
27237 // alias "image-scale" that could be alias for "font-scale"
27238 // when FormattedSection is an image section.
27239 section.scale = section.scale * ONE_EM / layoutTextSizeThisZoom;
27240 metrics = { width: size[0],
27241 height: size[1],
27242 left: IMAGE_PADDING,
27243 top: -GLYPH_PBF_BORDER,
27244 advance: vertical ? size[1] : size[0] };
27245 // Difference between one EM and an image size.
27246 // Aligns bottom of an image to a baseline level.
27247 const imageOffset = ONE_EM - size[1] * section.scale;
27248 baselineOffset = maxLineOffset + imageOffset;
27249 verticalAdvance = metrics.advance;
27250 // Difference between height of an image and one EM at max line scale.
27251 // Pushes current line down if an image size is over 1 EM at max line scale.
27252 const offset = vertical ? size[0] * section.scale - ONE_EM * lineMaxScale :
27253 size[1] * section.scale - ONE_EM * lineMaxScale;
27254 if (offset > 0 && offset > lineOffset) {
27255 lineOffset = offset;
27256 }
27257 }
27258 if (!vertical) {
27259 positionedGlyphs.push({ glyph: codePoint, imageName, x, y: y + baselineOffset, vertical, scale: section.scale, fontStack: section.fontStack, sectionIndex, metrics, rect });
27260 x += metrics.advance * section.scale + spacing;
27261 }
27262 else {
27263 shaping.verticalizable = true;
27264 positionedGlyphs.push({ glyph: codePoint, imageName, x, y: y + baselineOffset, vertical, scale: section.scale, fontStack: section.fontStack, sectionIndex, metrics, rect });
27265 x += verticalAdvance * section.scale + spacing;
27266 }
27267 }
27268 // Only justify if we placed at least one glyph
27269 if (positionedGlyphs.length !== 0) {
27270 const lineLength = x - spacing;
27271 maxLineLength = Math.max(lineLength, maxLineLength);
27272 justifyLine(positionedGlyphs, 0, positionedGlyphs.length - 1, justify, lineOffset);
27273 }
27274 x = 0;
27275 const currentLineHeight = lineHeight * lineMaxScale + lineOffset;
27276 positionedLine.lineOffset = Math.max(lineOffset, maxLineOffset);
27277 y += currentLineHeight;
27278 maxLineHeight = Math.max(currentLineHeight, maxLineHeight);
27279 ++lineIndex;
27280 }
27281 // Calculate the bounding box and justify / align text block.
27282 const height = y - SHAPING_DEFAULT_OFFSET;
27283 const { horizontalAlign, verticalAlign } = getAnchorAlignment(textAnchor);
27284 align(shaping.positionedLines, justify, horizontalAlign, verticalAlign, maxLineLength, maxLineHeight, lineHeight, height, lines.length);
27285 shaping.top += -verticalAlign * height;
27286 shaping.bottom = shaping.top + height;
27287 shaping.left += -horizontalAlign * maxLineLength;
27288 shaping.right = shaping.left + maxLineLength;
27289}
27290// justify right = 1, left = 0, center = 0.5
27291function justifyLine(positionedGlyphs, start, end, justify, lineOffset) {
27292 if (!justify && !lineOffset)
27293 return;
27294 const lastPositionedGlyph = positionedGlyphs[end];
27295 const lastAdvance = lastPositionedGlyph.metrics.advance * lastPositionedGlyph.scale;
27296 const lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify;
27297 for (let j = start; j <= end; j++) {
27298 positionedGlyphs[j].x -= lineIndent;
27299 positionedGlyphs[j].y += lineOffset;
27300 }
27301}
27302function align(positionedLines, justify, horizontalAlign, verticalAlign, maxLineLength, maxLineHeight, lineHeight, blockHeight, lineCount) {
27303 const shiftX = (justify - horizontalAlign) * maxLineLength;
27304 let shiftY = 0;
27305 if (maxLineHeight !== lineHeight) {
27306 shiftY = -blockHeight * verticalAlign - SHAPING_DEFAULT_OFFSET;
27307 }
27308 else {
27309 shiftY = (-verticalAlign * lineCount + 0.5) * lineHeight;
27310 }
27311 for (const line of positionedLines) {
27312 for (const positionedGlyph of line.positionedGlyphs) {
27313 positionedGlyph.x += shiftX;
27314 positionedGlyph.y += shiftY;
27315 }
27316 }
27317}
27318function shapeIcon(image, iconOffset, iconAnchor) {
27319 const { horizontalAlign, verticalAlign } = getAnchorAlignment(iconAnchor);
27320 const dx = iconOffset[0];
27321 const dy = iconOffset[1];
27322 const x1 = dx - image.displaySize[0] * horizontalAlign;
27323 const x2 = x1 + image.displaySize[0];
27324 const y1 = dy - image.displaySize[1] * verticalAlign;
27325 const y2 = y1 + image.displaySize[1];
27326 return { image, top: y1, bottom: y2, left: x1, right: x2 };
27327}
27328function fitIconToText(shapedIcon, shapedText, textFit, padding, iconOffset, fontScale) {
27329 assert$1(textFit !== 'none');
27330 assert$1(Array.isArray(padding) && padding.length === 4);
27331 assert$1(Array.isArray(iconOffset) && iconOffset.length === 2);
27332 const image = shapedIcon.image;
27333 let collisionPadding;
27334 if (image.content) {
27335 const content = image.content;
27336 const pixelRatio = image.pixelRatio || 1;
27337 collisionPadding = [
27338 content[0] / pixelRatio,
27339 content[1] / pixelRatio,
27340 image.displaySize[0] - content[2] / pixelRatio,
27341 image.displaySize[1] - content[3] / pixelRatio
27342 ];
27343 }
27344 // We don't respect the icon-anchor, because icon-text-fit is set. Instead,
27345 // the icon will be centered on the text, then stretched in the given
27346 // dimensions.
27347 const textLeft = shapedText.left * fontScale;
27348 const textRight = shapedText.right * fontScale;
27349 let top, right, bottom, left;
27350 if (textFit === 'width' || textFit === 'both') {
27351 // Stretched horizontally to the text width
27352 left = iconOffset[0] + textLeft - padding[3];
27353 right = iconOffset[0] + textRight + padding[1];
27354 }
27355 else {
27356 // Centered on the text
27357 left = iconOffset[0] + (textLeft + textRight - image.displaySize[0]) / 2;
27358 right = left + image.displaySize[0];
27359 }
27360 const textTop = shapedText.top * fontScale;
27361 const textBottom = shapedText.bottom * fontScale;
27362 if (textFit === 'height' || textFit === 'both') {
27363 // Stretched vertically to the text height
27364 top = iconOffset[1] + textTop - padding[0];
27365 bottom = iconOffset[1] + textBottom + padding[2];
27366 }
27367 else {
27368 // Centered on the text
27369 top = iconOffset[1] + (textTop + textBottom - image.displaySize[1]) / 2;
27370 bottom = top + image.displaySize[1];
27371 }
27372 return { image, top, right, bottom, left, collisionPadding };
27373}
27374
27375const SIZE_PACK_FACTOR = 128;
27376// For {text,icon}-size, get the bucket-level data that will be needed by
27377// the painter to set symbol-size-related uniforms
27378function getSizeData(tileZoom, value) {
27379 const { expression } = value;
27380 if (expression.kind === 'constant') {
27381 const layoutSize = expression.evaluate(new EvaluationParameters(tileZoom + 1));
27382 return { kind: 'constant', layoutSize };
27383 }
27384 else if (expression.kind === 'source') {
27385 return { kind: 'source' };
27386 }
27387 else {
27388 const { zoomStops, interpolationType } = expression;
27389 // calculate covering zoom stops for zoom-dependent values
27390 let lower = 0;
27391 while (lower < zoomStops.length && zoomStops[lower] <= tileZoom)
27392 lower++;
27393 lower = Math.max(0, lower - 1);
27394 let upper = lower;
27395 while (upper < zoomStops.length && zoomStops[upper] < tileZoom + 1)
27396 upper++;
27397 upper = Math.min(zoomStops.length - 1, upper);
27398 const minZoom = zoomStops[lower];
27399 const maxZoom = zoomStops[upper];
27400 // We'd like to be able to use CameraExpression or CompositeExpression in these
27401 // return types rather than ExpressionSpecification, but the former are not
27402 // transferrable across Web Worker boundaries.
27403 if (expression.kind === 'composite') {
27404 return { kind: 'composite', minZoom, maxZoom, interpolationType };
27405 }
27406 // for camera functions, also save off the function values
27407 // evaluated at the covering zoom levels
27408 const minSize = expression.evaluate(new EvaluationParameters(minZoom));
27409 const maxSize = expression.evaluate(new EvaluationParameters(maxZoom));
27410 return { kind: 'camera', minZoom, maxZoom, minSize, maxSize, interpolationType };
27411 }
27412}
27413function evaluateSizeForFeature(sizeData, { uSize, uSizeT }, { lowerSize, upperSize }) {
27414 if (sizeData.kind === 'source') {
27415 return lowerSize / SIZE_PACK_FACTOR;
27416 }
27417 else if (sizeData.kind === 'composite') {
27418 return number(lowerSize / SIZE_PACK_FACTOR, upperSize / SIZE_PACK_FACTOR, uSizeT);
27419 }
27420 return uSize;
27421}
27422function evaluateSizeForZoom(sizeData, zoom) {
27423 let uSizeT = 0;
27424 let uSize = 0;
27425 if (sizeData.kind === 'constant') {
27426 uSize = sizeData.layoutSize;
27427 }
27428 else if (sizeData.kind !== 'source') {
27429 const { interpolationType, minZoom, maxZoom } = sizeData;
27430 // Even though we could get the exact value of the camera function
27431 // at z = tr.zoom, we intentionally do not: instead, we interpolate
27432 // between the camera function values at a pair of zoom stops covering
27433 // [tileZoom, tileZoom + 1] in order to be consistent with this
27434 // restriction on composite functions
27435 const t = !interpolationType ? 0 : clamp(Interpolate.interpolationFactor(interpolationType, zoom, minZoom, maxZoom), 0, 1);
27436 if (sizeData.kind === 'camera') {
27437 uSize = number(sizeData.minSize, sizeData.maxSize, t);
27438 }
27439 else {
27440 uSizeT = t;
27441 }
27442 }
27443 return { uSizeT, uSize };
27444}
27445
27446class Anchor extends pointGeometry {
27447 constructor(x, y, angle, segment) {
27448 super(x, y);
27449 this.angle = angle;
27450 if (segment !== undefined) {
27451 this.segment = segment;
27452 }
27453 }
27454 clone() {
27455 return new Anchor(this.x, this.y, this.angle, this.segment);
27456 }
27457}
27458register('Anchor', Anchor);
27459
27460/**
27461 * Labels placed around really sharp angles aren't readable. Check if any
27462 * part of the potential label has a combined angle that is too big.
27463 *
27464 * @param line
27465 * @param anchor The point on the line around which the label is anchored.
27466 * @param labelLength The length of the label in geometry units.
27467 * @param windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big.
27468 * @param maxAngle The maximum combined angle that any window along the label is allowed to have.
27469 *
27470 * @returns {boolean} whether the label should be placed
27471 * @private
27472 */
27473function checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) {
27474 // horizontal labels always pass
27475 if (anchor.segment === undefined)
27476 return true;
27477 let p = anchor;
27478 let index = anchor.segment + 1;
27479 let anchorDistance = 0;
27480 // move backwards along the line to the first segment the label appears on
27481 while (anchorDistance > -labelLength / 2) {
27482 index--;
27483 // there isn't enough room for the label after the beginning of the line
27484 if (index < 0)
27485 return false;
27486 anchorDistance -= line[index].dist(p);
27487 p = line[index];
27488 }
27489 anchorDistance += line[index].dist(line[index + 1]);
27490 index++;
27491 // store recent corners and their total angle difference
27492 const recentCorners = [];
27493 let recentAngleDelta = 0;
27494 // move forwards by the length of the label and check angles along the way
27495 while (anchorDistance < labelLength / 2) {
27496 const prev = line[index - 1];
27497 const current = line[index];
27498 const next = line[index + 1];
27499 // there isn't enough room for the label before the end of the line
27500 if (!next)
27501 return false;
27502 let angleDelta = prev.angleTo(current) - current.angleTo(next);
27503 // restrict angle to -pi..pi range
27504 angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI);
27505 recentCorners.push({
27506 distance: anchorDistance,
27507 angleDelta
27508 });
27509 recentAngleDelta += angleDelta;
27510 // remove corners that are far enough away from the list of recent anchors
27511 while (anchorDistance - recentCorners[0].distance > windowSize) {
27512 recentAngleDelta -= recentCorners.shift().angleDelta;
27513 }
27514 // the sum of angles within the window area exceeds the maximum allowed value. check fails.
27515 if (recentAngleDelta > maxAngle)
27516 return false;
27517 index++;
27518 anchorDistance += current.dist(next);
27519 }
27520 // no part of the line had an angle greater than the maximum allowed. check passes.
27521 return true;
27522}
27523
27524function getLineLength(line) {
27525 let lineLength = 0;
27526 for (let k = 0; k < line.length - 1; k++) {
27527 lineLength += line[k].dist(line[k + 1]);
27528 }
27529 return lineLength;
27530}
27531function getAngleWindowSize(shapedText, glyphSize, boxScale) {
27532 return shapedText ?
27533 3 / 5 * glyphSize * boxScale :
27534 0;
27535}
27536function getShapedLabelLength(shapedText, shapedIcon) {
27537 return Math.max(shapedText ? shapedText.right - shapedText.left : 0, shapedIcon ? shapedIcon.right - shapedIcon.left : 0);
27538}
27539function getCenterAnchor(line, maxAngle, shapedText, shapedIcon, glyphSize, boxScale) {
27540 const angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale);
27541 const labelLength = getShapedLabelLength(shapedText, shapedIcon) * boxScale;
27542 let prevDistance = 0;
27543 const centerDistance = getLineLength(line) / 2;
27544 for (let i = 0; i < line.length - 1; i++) {
27545 const a = line[i], b = line[i + 1];
27546 const segmentDistance = a.dist(b);
27547 if (prevDistance + segmentDistance > centerDistance) {
27548 // The center is on this segment
27549 const t = (centerDistance - prevDistance) / segmentDistance, x = number(a.x, b.x, t), y = number(a.y, b.y, t);
27550 const anchor = new Anchor(x, y, b.angleTo(a), i);
27551 anchor._round();
27552 if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {
27553 return anchor;
27554 }
27555 else {
27556 return;
27557 }
27558 }
27559 prevDistance += segmentDistance;
27560 }
27561}
27562function getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling, tileExtent) {
27563 // Resample a line to get anchor points for labels and check that each
27564 // potential label passes text-max-angle check and has enough froom to fit
27565 // on the line.
27566 const angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale);
27567 const shapedLabelLength = getShapedLabelLength(shapedText, shapedIcon);
27568 const labelLength = shapedLabelLength * boxScale;
27569 // Is the line continued from outside the tile boundary?
27570 const isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent;
27571 // Is the label long, relative to the spacing?
27572 // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges.
27573 if (spacing - labelLength < spacing / 4) {
27574 spacing = labelLength + spacing / 4;
27575 }
27576 // Offset the first anchor by:
27577 // Either half the label length plus a fixed extra offset if the line is not continued
27578 // Or half the spacing if the line is continued.
27579 // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections.
27580 const fixedExtraOffset = glyphSize * 2;
27581 const offset = !isLineContinued ?
27582 ((shapedLabelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing :
27583 (spacing / 2 * overscaling) % spacing;
27584 return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, false, tileExtent);
27585}
27586function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) {
27587 const halfLabelLength = labelLength / 2;
27588 const lineLength = getLineLength(line);
27589 let distance = 0, markedDistance = offset - spacing;
27590 let anchors = [];
27591 for (let i = 0; i < line.length - 1; i++) {
27592 const a = line[i], b = line[i + 1];
27593 const segmentDist = a.dist(b), angle = b.angleTo(a);
27594 while (markedDistance + spacing < distance + segmentDist) {
27595 markedDistance += spacing;
27596 const t = (markedDistance - distance) / segmentDist, x = number(a.x, b.x, t), y = number(a.y, b.y, t);
27597 // Check that the point is within the tile boundaries and that
27598 // the label would fit before the beginning and end of the line
27599 // if placed at this point.
27600 if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent &&
27601 markedDistance - halfLabelLength >= 0 &&
27602 markedDistance + halfLabelLength <= lineLength) {
27603 const anchor = new Anchor(x, y, angle, i);
27604 anchor._round();
27605 if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {
27606 anchors.push(anchor);
27607 }
27608 }
27609 }
27610 distance += segmentDist;
27611 }
27612 if (!placeAtMiddle && !anchors.length && !isLineContinued) {
27613 // The first attempt at finding anchors at which labels can be placed failed.
27614 // Try again, but this time just try placing one anchor at the middle of the line.
27615 // This has the most effect for short lines in overscaled tiles, since the
27616 // initial offset used in overscaled tiles is calculated to align labels with positions in
27617 // parent tiles instead of placing the label as close to the beginning as possible.
27618 anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent);
27619 }
27620 return anchors;
27621}
27622
27623/**
27624 * Returns the part of a multiline that intersects with the provided rectangular box.
27625 *
27626 * @param lines
27627 * @param x1 the left edge of the box
27628 * @param y1 the top edge of the box
27629 * @param x2 the right edge of the box
27630 * @param y2 the bottom edge of the box
27631 * @returns lines
27632 * @private
27633 */
27634function clipLine(lines, x1, y1, x2, y2) {
27635 const clippedLines = [];
27636 for (let l = 0; l < lines.length; l++) {
27637 const line = lines[l];
27638 let clippedLine;
27639 for (let i = 0; i < line.length - 1; i++) {
27640 let p0 = line[i];
27641 let p1 = line[i + 1];
27642 if (p0.x < x1 && p1.x < x1) {
27643 continue;
27644 }
27645 else if (p0.x < x1) {
27646 p0 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();
27647 }
27648 else if (p1.x < x1) {
27649 p1 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();
27650 }
27651 if (p0.y < y1 && p1.y < y1) {
27652 continue;
27653 }
27654 else if (p0.y < y1) {
27655 p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();
27656 }
27657 else if (p1.y < y1) {
27658 p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();
27659 }
27660 if (p0.x >= x2 && p1.x >= x2) {
27661 continue;
27662 }
27663 else if (p0.x >= x2) {
27664 p0 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();
27665 }
27666 else if (p1.x >= x2) {
27667 p1 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();
27668 }
27669 if (p0.y >= y2 && p1.y >= y2) {
27670 continue;
27671 }
27672 else if (p0.y >= y2) {
27673 p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();
27674 }
27675 else if (p1.y >= y2) {
27676 p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();
27677 }
27678 if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) {
27679 clippedLine = [p0];
27680 clippedLines.push(clippedLine);
27681 }
27682 clippedLine.push(p1);
27683 }
27684 }
27685 return clippedLines;
27686}
27687
27688// If you have a 10px icon that isn't perfectly aligned to the pixel grid it will cover 11 actual
27689// pixels. The quad needs to be padded to account for this, otherwise they'll look slightly clipped
27690// on one edge in some cases.
27691const border = IMAGE_PADDING;
27692/**
27693 * Create the quads used for rendering an icon.
27694 * @private
27695 */
27696function getIconQuads(shapedIcon, iconRotate, isSDFIcon, hasIconTextFit) {
27697 const quads = [];
27698 const image = shapedIcon.image;
27699 const pixelRatio = image.pixelRatio;
27700 const imageWidth = image.paddedRect.w - 2 * border;
27701 const imageHeight = image.paddedRect.h - 2 * border;
27702 const iconWidth = shapedIcon.right - shapedIcon.left;
27703 const iconHeight = shapedIcon.bottom - shapedIcon.top;
27704 const stretchX = image.stretchX || [[0, imageWidth]];
27705 const stretchY = image.stretchY || [[0, imageHeight]];
27706 const reduceRanges = (sum, range) => sum + range[1] - range[0];
27707 const stretchWidth = stretchX.reduce(reduceRanges, 0);
27708 const stretchHeight = stretchY.reduce(reduceRanges, 0);
27709 const fixedWidth = imageWidth - stretchWidth;
27710 const fixedHeight = imageHeight - stretchHeight;
27711 let stretchOffsetX = 0;
27712 let stretchContentWidth = stretchWidth;
27713 let stretchOffsetY = 0;
27714 let stretchContentHeight = stretchHeight;
27715 let fixedOffsetX = 0;
27716 let fixedContentWidth = fixedWidth;
27717 let fixedOffsetY = 0;
27718 let fixedContentHeight = fixedHeight;
27719 if (image.content && hasIconTextFit) {
27720 const content = image.content;
27721 stretchOffsetX = sumWithinRange(stretchX, 0, content[0]);
27722 stretchOffsetY = sumWithinRange(stretchY, 0, content[1]);
27723 stretchContentWidth = sumWithinRange(stretchX, content[0], content[2]);
27724 stretchContentHeight = sumWithinRange(stretchY, content[1], content[3]);
27725 fixedOffsetX = content[0] - stretchOffsetX;
27726 fixedOffsetY = content[1] - stretchOffsetY;
27727 fixedContentWidth = content[2] - content[0] - stretchContentWidth;
27728 fixedContentHeight = content[3] - content[1] - stretchContentHeight;
27729 }
27730 const makeBox = (left, top, right, bottom) => {
27731 const leftEm = getEmOffset(left.stretch - stretchOffsetX, stretchContentWidth, iconWidth, shapedIcon.left);
27732 const leftPx = getPxOffset(left.fixed - fixedOffsetX, fixedContentWidth, left.stretch, stretchWidth);
27733 const topEm = getEmOffset(top.stretch - stretchOffsetY, stretchContentHeight, iconHeight, shapedIcon.top);
27734 const topPx = getPxOffset(top.fixed - fixedOffsetY, fixedContentHeight, top.stretch, stretchHeight);
27735 const rightEm = getEmOffset(right.stretch - stretchOffsetX, stretchContentWidth, iconWidth, shapedIcon.left);
27736 const rightPx = getPxOffset(right.fixed - fixedOffsetX, fixedContentWidth, right.stretch, stretchWidth);
27737 const bottomEm = getEmOffset(bottom.stretch - stretchOffsetY, stretchContentHeight, iconHeight, shapedIcon.top);
27738 const bottomPx = getPxOffset(bottom.fixed - fixedOffsetY, fixedContentHeight, bottom.stretch, stretchHeight);
27739 const tl = new pointGeometry(leftEm, topEm);
27740 const tr = new pointGeometry(rightEm, topEm);
27741 const br = new pointGeometry(rightEm, bottomEm);
27742 const bl = new pointGeometry(leftEm, bottomEm);
27743 const pixelOffsetTL = new pointGeometry(leftPx / pixelRatio, topPx / pixelRatio);
27744 const pixelOffsetBR = new pointGeometry(rightPx / pixelRatio, bottomPx / pixelRatio);
27745 const angle = iconRotate * Math.PI / 180;
27746 if (angle) {
27747 const sin = Math.sin(angle), cos = Math.cos(angle), matrix = [cos, -sin, sin, cos];
27748 tl._matMult(matrix);
27749 tr._matMult(matrix);
27750 bl._matMult(matrix);
27751 br._matMult(matrix);
27752 }
27753 const x1 = left.stretch + left.fixed;
27754 const x2 = right.stretch + right.fixed;
27755 const y1 = top.stretch + top.fixed;
27756 const y2 = bottom.stretch + bottom.fixed;
27757 const subRect = {
27758 x: image.paddedRect.x + border + x1,
27759 y: image.paddedRect.y + border + y1,
27760 w: x2 - x1,
27761 h: y2 - y1
27762 };
27763 const minFontScaleX = fixedContentWidth / pixelRatio / iconWidth;
27764 const minFontScaleY = fixedContentHeight / pixelRatio / iconHeight;
27765 // Icon quad is padded, so texture coordinates also need to be padded.
27766 return { tl, tr, bl, br, tex: subRect, writingMode: undefined, glyphOffset: [0, 0], sectionIndex: 0, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY, isSDF: isSDFIcon };
27767 };
27768 if (!hasIconTextFit || (!image.stretchX && !image.stretchY)) {
27769 quads.push(makeBox({ fixed: 0, stretch: -1 }, { fixed: 0, stretch: -1 }, { fixed: 0, stretch: imageWidth + 1 }, { fixed: 0, stretch: imageHeight + 1 }));
27770 }
27771 else {
27772 const xCuts = stretchZonesToCuts(stretchX, fixedWidth, stretchWidth);
27773 const yCuts = stretchZonesToCuts(stretchY, fixedHeight, stretchHeight);
27774 for (let xi = 0; xi < xCuts.length - 1; xi++) {
27775 const x1 = xCuts[xi];
27776 const x2 = xCuts[xi + 1];
27777 for (let yi = 0; yi < yCuts.length - 1; yi++) {
27778 const y1 = yCuts[yi];
27779 const y2 = yCuts[yi + 1];
27780 quads.push(makeBox(x1, y1, x2, y2));
27781 }
27782 }
27783 }
27784 return quads;
27785}
27786function sumWithinRange(ranges, min, max) {
27787 let sum = 0;
27788 for (const range of ranges) {
27789 sum += Math.max(min, Math.min(max, range[1])) - Math.max(min, Math.min(max, range[0]));
27790 }
27791 return sum;
27792}
27793function stretchZonesToCuts(stretchZones, fixedSize, stretchSize) {
27794 const cuts = [{ fixed: -border, stretch: 0 }];
27795 for (const [c1, c2] of stretchZones) {
27796 const last = cuts[cuts.length - 1];
27797 cuts.push({
27798 fixed: c1 - last.stretch,
27799 stretch: last.stretch
27800 });
27801 cuts.push({
27802 fixed: c1 - last.stretch,
27803 stretch: last.stretch + (c2 - c1)
27804 });
27805 }
27806 cuts.push({
27807 fixed: fixedSize + border,
27808 stretch: stretchSize
27809 });
27810 return cuts;
27811}
27812function getEmOffset(stretchOffset, stretchSize, iconSize, iconOffset) {
27813 return stretchOffset / stretchSize * iconSize + iconOffset;
27814}
27815function getPxOffset(fixedOffset, fixedSize, stretchOffset, stretchSize) {
27816 return fixedOffset - fixedSize * stretchOffset / stretchSize;
27817}
27818/**
27819 * Create the quads used for rendering a text label.
27820 * @private
27821 */
27822function getGlyphQuads(anchor, shaping, textOffset, layer, alongLine, feature, imageMap, allowVerticalPlacement) {
27823 const textRotate = layer.layout.get('text-rotate').evaluate(feature, {}) * Math.PI / 180;
27824 const quads = [];
27825 for (const line of shaping.positionedLines) {
27826 for (const positionedGlyph of line.positionedGlyphs) {
27827 if (!positionedGlyph.rect)
27828 continue;
27829 const textureRect = positionedGlyph.rect || {};
27830 // The rects have an additional buffer that is not included in their size.
27831 const glyphPadding = 1.0;
27832 let rectBuffer = GLYPH_PBF_BORDER + glyphPadding;
27833 let isSDF = true;
27834 let pixelRatio = 1.0;
27835 let lineOffset = 0.0;
27836 const rotateVerticalGlyph = (alongLine || allowVerticalPlacement) && positionedGlyph.vertical;
27837 const halfAdvance = positionedGlyph.metrics.advance * positionedGlyph.scale / 2;
27838 // Align images and scaled glyphs in the middle of a vertical line.
27839 if (allowVerticalPlacement && shaping.verticalizable) {
27840 const scaledGlyphOffset = (positionedGlyph.scale - 1) * ONE_EM;
27841 const imageOffset = (ONE_EM - positionedGlyph.metrics.width * positionedGlyph.scale) / 2;
27842 lineOffset = line.lineOffset / 2 - (positionedGlyph.imageName ? -imageOffset : scaledGlyphOffset);
27843 }
27844 if (positionedGlyph.imageName) {
27845 const image = imageMap[positionedGlyph.imageName];
27846 isSDF = image.sdf;
27847 pixelRatio = image.pixelRatio;
27848 rectBuffer = IMAGE_PADDING / pixelRatio;
27849 }
27850 const glyphOffset = alongLine ?
27851 [positionedGlyph.x + halfAdvance, positionedGlyph.y] :
27852 [0, 0];
27853 let builtInOffset = alongLine ?
27854 [0, 0] :
27855 [positionedGlyph.x + halfAdvance + textOffset[0], positionedGlyph.y + textOffset[1] - lineOffset];
27856 let verticalizedLabelOffset = [0, 0];
27857 if (rotateVerticalGlyph) {
27858 // Vertical POI labels that are rotated 90deg CW and whose glyphs must preserve upright orientation
27859 // need to be rotated 90deg CCW. After a quad is rotated, it is translated to the original built-in offset.
27860 verticalizedLabelOffset = builtInOffset;
27861 builtInOffset = [0, 0];
27862 }
27863 const x1 = (positionedGlyph.metrics.left - rectBuffer) * positionedGlyph.scale - halfAdvance + builtInOffset[0];
27864 const y1 = (-positionedGlyph.metrics.top - rectBuffer) * positionedGlyph.scale + builtInOffset[1];
27865 const x2 = x1 + textureRect.w * positionedGlyph.scale / pixelRatio;
27866 const y2 = y1 + textureRect.h * positionedGlyph.scale / pixelRatio;
27867 const tl = new pointGeometry(x1, y1);
27868 const tr = new pointGeometry(x2, y1);
27869 const bl = new pointGeometry(x1, y2);
27870 const br = new pointGeometry(x2, y2);
27871 if (rotateVerticalGlyph) {
27872 // Vertical-supporting glyphs are laid out in 24x24 point boxes (1 square em)
27873 // In horizontal orientation, the y values for glyphs are below the midline
27874 // and we use a "yOffset" of -17 to pull them up to the middle.
27875 // By rotating counter-clockwise around the point at the center of the left
27876 // edge of a 24x24 layout box centered below the midline, we align the center
27877 // of the glyphs with the horizontal midline, so the yOffset is no longer
27878 // necessary, but we also pull the glyph to the left along the x axis.
27879 // The y coordinate includes baseline yOffset, thus needs to be accounted
27880 // for when glyph is rotated and translated.
27881 const center = new pointGeometry(-halfAdvance, halfAdvance - SHAPING_DEFAULT_OFFSET);
27882 const verticalRotation = -Math.PI / 2;
27883 // xHalfWidthOffsetCorrection is a difference between full-width and half-width
27884 // advance, should be 0 for full-width glyphs and will pull up half-width glyphs.
27885 const xHalfWidthOffsetCorrection = ONE_EM / 2 - halfAdvance;
27886 const yImageOffsetCorrection = positionedGlyph.imageName ? xHalfWidthOffsetCorrection : 0.0;
27887 const halfWidthOffsetCorrection = new pointGeometry(5 - SHAPING_DEFAULT_OFFSET - xHalfWidthOffsetCorrection, -yImageOffsetCorrection);
27888 const verticalOffsetCorrection = new pointGeometry(...verticalizedLabelOffset);
27889 tl._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection);
27890 tr._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection);
27891 bl._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection);
27892 br._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection);
27893 }
27894 if (textRotate) {
27895 const sin = Math.sin(textRotate), cos = Math.cos(textRotate), matrix = [cos, -sin, sin, cos];
27896 tl._matMult(matrix);
27897 tr._matMult(matrix);
27898 bl._matMult(matrix);
27899 br._matMult(matrix);
27900 }
27901 const pixelOffsetTL = new pointGeometry(0, 0);
27902 const pixelOffsetBR = new pointGeometry(0, 0);
27903 const minFontScaleX = 0;
27904 const minFontScaleY = 0;
27905 quads.push({ tl, tr, bl, br, tex: textureRect, writingMode: shaping.writingMode, glyphOffset, sectionIndex: positionedGlyph.sectionIndex, isSDF, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY });
27906 }
27907 }
27908 return quads;
27909}
27910
27911/**
27912 * A CollisionFeature represents the area of the tile covered by a single label.
27913 * It is used with CollisionIndex to check if the label overlaps with any
27914 * previous labels. A CollisionFeature is mostly just a set of CollisionBox
27915 * objects.
27916 *
27917 * @private
27918 */
27919class CollisionFeature {
27920 /**
27921 * Create a CollisionFeature, adding its collision box data to the given collisionBoxArray in the process.
27922 * For line aligned labels a collision circle diameter is computed instead.
27923 *
27924 * @param anchor The point along the line around which the label is anchored.
27925 * @param shaped The text or icon shaping results.
27926 * @param boxScale A magic number used to convert from glyph metrics units to geometry units.
27927 * @param padding The amount of padding to add around the label edges.
27928 * @param alignLine Whether the label is aligned with the line or the viewport.
27929 * @private
27930 */
27931 constructor(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaped, boxScale, padding, alignLine, rotate) {
27932 this.boxStartIndex = collisionBoxArray.length;
27933 if (alignLine) {
27934 // Compute height of the shape in glyph metrics and apply collision padding.
27935 // Note that the pixel based 'text-padding' is applied at runtime
27936 let top = shaped.top;
27937 let bottom = shaped.bottom;
27938 const collisionPadding = shaped.collisionPadding;
27939 if (collisionPadding) {
27940 top -= collisionPadding[1];
27941 bottom += collisionPadding[3];
27942 }
27943 let height = bottom - top;
27944 if (height > 0) {
27945 // set minimum box height to avoid very many small labels
27946 height = Math.max(10, height);
27947 this.circleDiameter = height;
27948 }
27949 }
27950 else {
27951 let y1 = shaped.top * boxScale - padding;
27952 let y2 = shaped.bottom * boxScale + padding;
27953 let x1 = shaped.left * boxScale - padding;
27954 let x2 = shaped.right * boxScale + padding;
27955 const collisionPadding = shaped.collisionPadding;
27956 if (collisionPadding) {
27957 x1 -= collisionPadding[0] * boxScale;
27958 y1 -= collisionPadding[1] * boxScale;
27959 x2 += collisionPadding[2] * boxScale;
27960 y2 += collisionPadding[3] * boxScale;
27961 }
27962 if (rotate) {
27963 // Account for *-rotate in point collision boxes
27964 // See https://github.com/mapbox/mapbox-gl-js/issues/6075
27965 // Doesn't account for icon-text-fit
27966 const tl = new pointGeometry(x1, y1);
27967 const tr = new pointGeometry(x2, y1);
27968 const bl = new pointGeometry(x1, y2);
27969 const br = new pointGeometry(x2, y2);
27970 const rotateRadians = rotate * Math.PI / 180;
27971 tl._rotate(rotateRadians);
27972 tr._rotate(rotateRadians);
27973 bl._rotate(rotateRadians);
27974 br._rotate(rotateRadians);
27975 // Collision features require an "on-axis" geometry,
27976 // so take the envelope of the rotated geometry
27977 // (may be quite large for wide labels rotated 45 degrees)
27978 x1 = Math.min(tl.x, tr.x, bl.x, br.x);
27979 x2 = Math.max(tl.x, tr.x, bl.x, br.x);
27980 y1 = Math.min(tl.y, tr.y, bl.y, br.y);
27981 y2 = Math.max(tl.y, tr.y, bl.y, br.y);
27982 }
27983 collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, featureIndex, sourceLayerIndex, bucketIndex);
27984 }
27985 this.boxEndIndex = collisionBoxArray.length;
27986 }
27987}
27988
27989class TinyQueue {
27990 constructor(data = [], compare = defaultCompare) {
27991 this.data = data;
27992 this.length = this.data.length;
27993 this.compare = compare;
27994
27995 if (this.length > 0) {
27996 for (let i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);
27997 }
27998 }
27999
28000 push(item) {
28001 this.data.push(item);
28002 this.length++;
28003 this._up(this.length - 1);
28004 }
28005
28006 pop() {
28007 if (this.length === 0) return undefined;
28008
28009 const top = this.data[0];
28010 const bottom = this.data.pop();
28011 this.length--;
28012
28013 if (this.length > 0) {
28014 this.data[0] = bottom;
28015 this._down(0);
28016 }
28017
28018 return top;
28019 }
28020
28021 peek() {
28022 return this.data[0];
28023 }
28024
28025 _up(pos) {
28026 const {data, compare} = this;
28027 const item = data[pos];
28028
28029 while (pos > 0) {
28030 const parent = (pos - 1) >> 1;
28031 const current = data[parent];
28032 if (compare(item, current) >= 0) break;
28033 data[pos] = current;
28034 pos = parent;
28035 }
28036
28037 data[pos] = item;
28038 }
28039
28040 _down(pos) {
28041 const {data, compare} = this;
28042 const halfLength = this.length >> 1;
28043 const item = data[pos];
28044
28045 while (pos < halfLength) {
28046 let left = (pos << 1) + 1;
28047 let best = data[left];
28048 const right = left + 1;
28049
28050 if (right < this.length && compare(data[right], best) < 0) {
28051 left = right;
28052 best = data[right];
28053 }
28054 if (compare(best, item) >= 0) break;
28055
28056 data[pos] = best;
28057 pos = left;
28058 }
28059
28060 data[pos] = item;
28061 }
28062}
28063
28064function defaultCompare(a, b) {
28065 return a < b ? -1 : a > b ? 1 : 0;
28066}
28067
28068/**
28069 * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility
28070 * This is a copy of http://github.com/mapbox/polylabel adapted to use Points
28071 *
28072 * @param polygonRings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings
28073 * @param precision Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision
28074 * @param debug Print some statistics to the console during execution
28075 * @returns Pole of Inaccessibiliy.
28076 * @private
28077 */
28078function findPoleOfInaccessibility (polygonRings, precision = 1, debug = false) {
28079 // find the bounding box of the outer ring
28080 let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
28081 const outerRing = polygonRings[0];
28082 for (let i = 0; i < outerRing.length; i++) {
28083 const p = outerRing[i];
28084 if (!i || p.x < minX)
28085 minX = p.x;
28086 if (!i || p.y < minY)
28087 minY = p.y;
28088 if (!i || p.x > maxX)
28089 maxX = p.x;
28090 if (!i || p.y > maxY)
28091 maxY = p.y;
28092 }
28093 const width = maxX - minX;
28094 const height = maxY - minY;
28095 const cellSize = Math.min(width, height);
28096 let h = cellSize / 2;
28097 // a priority queue of cells in order of their "potential" (max distance to polygon)
28098 const cellQueue = new TinyQueue([], compareMax);
28099 if (cellSize === 0)
28100 return new pointGeometry(minX, minY);
28101 // cover polygon with initial cells
28102 for (let x = minX; x < maxX; x += cellSize) {
28103 for (let y = minY; y < maxY; y += cellSize) {
28104 cellQueue.push(new Cell(x + h, y + h, h, polygonRings));
28105 }
28106 }
28107 // take centroid as the first best guess
28108 let bestCell = getCentroidCell(polygonRings);
28109 let numProbes = cellQueue.length;
28110 while (cellQueue.length) {
28111 // pick the most promising cell from the queue
28112 const cell = cellQueue.pop();
28113 // update the best cell if we found a better one
28114 if (cell.d > bestCell.d || !bestCell.d) {
28115 bestCell = cell;
28116 if (debug)
28117 console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);
28118 }
28119 // do not drill down further if there's no chance of a better solution
28120 if (cell.max - bestCell.d <= precision)
28121 continue;
28122 // split the cell into four cells
28123 h = cell.h / 2;
28124 cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings));
28125 cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings));
28126 cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings));
28127 cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings));
28128 numProbes += 4;
28129 }
28130 if (debug) {
28131 console.log(`num probes: ${numProbes}`);
28132 console.log(`best distance: ${bestCell.d}`);
28133 }
28134 return bestCell.p;
28135}
28136function compareMax(a, b) {
28137 return b.max - a.max;
28138}
28139function Cell(x, y, h, polygon) {
28140 this.p = new pointGeometry(x, y);
28141 this.h = h; // half the cell size
28142 this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon
28143 this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell
28144}
28145// signed distance from point to polygon outline (negative if point is outside)
28146function pointToPolygonDist(p, polygon) {
28147 let inside = false;
28148 let minDistSq = Infinity;
28149 for (let k = 0; k < polygon.length; k++) {
28150 const ring = polygon[k];
28151 for (let i = 0, len = ring.length, j = len - 1; i < len; j = i++) {
28152 const a = ring[i];
28153 const b = ring[j];
28154 if ((a.y > p.y !== b.y > p.y) &&
28155 (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x))
28156 inside = !inside;
28157 minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b));
28158 }
28159 }
28160 return (inside ? 1 : -1) * Math.sqrt(minDistSq);
28161}
28162// get polygon centroid
28163function getCentroidCell(polygon) {
28164 let area = 0;
28165 let x = 0;
28166 let y = 0;
28167 const points = polygon[0];
28168 for (let i = 0, len = points.length, j = len - 1; i < len; j = i++) {
28169 const a = points[i];
28170 const b = points[j];
28171 const f = a.x * b.y - b.x * a.y;
28172 x += (a.x + b.x) * f;
28173 y += (a.y + b.y) * f;
28174 area += f * 3;
28175 }
28176 return new Cell(x / area, y / area, 0, polygon);
28177}
28178
28179// The radial offset is to the edge of the text box
28180// In the horizontal direction, the edge of the text box is where glyphs start
28181// But in the vertical direction, the glyphs appear to "start" at the baseline
28182// We don't actually load baseline data, but we assume an offset of ONE_EM - 17
28183// (see "yOffset" in shaping.js)
28184const baselineOffset = 7;
28185const INVALID_TEXT_OFFSET = Number.POSITIVE_INFINITY;
28186function evaluateVariableOffset(anchor, offset) {
28187 function fromRadialOffset(anchor, radialOffset) {
28188 let x = 0, y = 0;
28189 if (radialOffset < 0)
28190 radialOffset = 0; // Ignore negative offset.
28191 // solve for r where r^2 + r^2 = radialOffset^2
28192 const hypotenuse = radialOffset / Math.sqrt(2);
28193 switch (anchor) {
28194 case 'top-right':
28195 case 'top-left':
28196 y = hypotenuse - baselineOffset;
28197 break;
28198 case 'bottom-right':
28199 case 'bottom-left':
28200 y = -hypotenuse + baselineOffset;
28201 break;
28202 case 'bottom':
28203 y = -radialOffset + baselineOffset;
28204 break;
28205 case 'top':
28206 y = radialOffset - baselineOffset;
28207 break;
28208 }
28209 switch (anchor) {
28210 case 'top-right':
28211 case 'bottom-right':
28212 x = -hypotenuse;
28213 break;
28214 case 'top-left':
28215 case 'bottom-left':
28216 x = hypotenuse;
28217 break;
28218 case 'left':
28219 x = radialOffset;
28220 break;
28221 case 'right':
28222 x = -radialOffset;
28223 break;
28224 }
28225 return [x, y];
28226 }
28227 function fromTextOffset(anchor, offsetX, offsetY) {
28228 let x = 0, y = 0;
28229 // Use absolute offset values.
28230 offsetX = Math.abs(offsetX);
28231 offsetY = Math.abs(offsetY);
28232 switch (anchor) {
28233 case 'top-right':
28234 case 'top-left':
28235 case 'top':
28236 y = offsetY - baselineOffset;
28237 break;
28238 case 'bottom-right':
28239 case 'bottom-left':
28240 case 'bottom':
28241 y = -offsetY + baselineOffset;
28242 break;
28243 }
28244 switch (anchor) {
28245 case 'top-right':
28246 case 'bottom-right':
28247 case 'right':
28248 x = -offsetX;
28249 break;
28250 case 'top-left':
28251 case 'bottom-left':
28252 case 'left':
28253 x = offsetX;
28254 break;
28255 }
28256 return [x, y];
28257 }
28258 return (offset[1] !== INVALID_TEXT_OFFSET) ? fromTextOffset(anchor, offset[0], offset[1]) : fromRadialOffset(anchor, offset[0]);
28259}
28260function performSymbolLayout(bucket, glyphMap, glyphPositions, imageMap, imagePositions, showCollisionBoxes, canonical) {
28261 bucket.createArrays();
28262 const tileSize = 512 * bucket.overscaling;
28263 bucket.tilePixelRatio = EXTENT / tileSize;
28264 bucket.compareText = {};
28265 bucket.iconsNeedLinear = false;
28266 const layout = bucket.layers[0].layout;
28267 const unevaluatedLayoutValues = bucket.layers[0]._unevaluatedLayout._values;
28268 const sizes = {
28269 // Filled in below, if *SizeData.kind is 'composite'
28270 // compositeIconSizes: undefined,
28271 // compositeTextSizes: undefined,
28272 layoutIconSize: unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1), canonical),
28273 layoutTextSize: unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1), canonical),
28274 textMaxSize: unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(18))
28275 };
28276 if (bucket.textSizeData.kind === 'composite') {
28277 const { minZoom, maxZoom } = bucket.textSizeData;
28278 sizes.compositeTextSizes = [
28279 unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(minZoom), canonical),
28280 unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(maxZoom), canonical)
28281 ];
28282 }
28283 if (bucket.iconSizeData.kind === 'composite') {
28284 const { minZoom, maxZoom } = bucket.iconSizeData;
28285 sizes.compositeIconSizes = [
28286 unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(minZoom), canonical),
28287 unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(maxZoom), canonical)
28288 ];
28289 }
28290 const lineHeight = layout.get('text-line-height') * ONE_EM;
28291 const textAlongLine = layout.get('text-rotation-alignment') !== 'viewport' && layout.get('symbol-placement') !== 'point';
28292 const keepUpright = layout.get('text-keep-upright');
28293 const textSize = layout.get('text-size');
28294 for (const feature of bucket.features) {
28295 const fontstack = layout.get('text-font').evaluate(feature, {}, canonical).join(',');
28296 const layoutTextSizeThisZoom = textSize.evaluate(feature, {}, canonical);
28297 const layoutTextSize = sizes.layoutTextSize.evaluate(feature, {}, canonical);
28298 const layoutIconSize = sizes.layoutIconSize.evaluate(feature, {}, canonical);
28299 const shapedTextOrientations = {
28300 horizontal: {},
28301 vertical: undefined
28302 };
28303 const text = feature.text;
28304 let textOffset = [0, 0];
28305 if (text) {
28306 const unformattedText = text.toString();
28307 const spacing = layout.get('text-letter-spacing').evaluate(feature, {}, canonical) * ONE_EM;
28308 const spacingIfAllowed = allowsLetterSpacing(unformattedText) ? spacing : 0;
28309 const textAnchor = layout.get('text-anchor').evaluate(feature, {}, canonical);
28310 const variableTextAnchor = layout.get('text-variable-anchor');
28311 if (!variableTextAnchor) {
28312 const radialOffset = layout.get('text-radial-offset').evaluate(feature, {}, canonical);
28313 // Layers with variable anchors use the `text-radial-offset` property and the [x, y] offset vector
28314 // is calculated at placement time instead of layout time
28315 if (radialOffset) {
28316 // The style spec says don't use `text-offset` and `text-radial-offset` together
28317 // but doesn't actually specify what happens if you use both. We go with the radial offset.
28318 textOffset = evaluateVariableOffset(textAnchor, [radialOffset * ONE_EM, INVALID_TEXT_OFFSET]);
28319 }
28320 else {
28321 textOffset = layout.get('text-offset').evaluate(feature, {}, canonical).map(t => t * ONE_EM);
28322 }
28323 }
28324 let textJustify = textAlongLine ?
28325 'center' :
28326 layout.get('text-justify').evaluate(feature, {}, canonical);
28327 const symbolPlacement = layout.get('symbol-placement');
28328 const maxWidth = symbolPlacement === 'point' ?
28329 layout.get('text-max-width').evaluate(feature, {}, canonical) * ONE_EM :
28330 0;
28331 const addVerticalShapingForPointLabelIfNeeded = () => {
28332 if (bucket.allowVerticalPlacement && allowsVerticalWritingMode(unformattedText)) {
28333 // Vertical POI label placement is meant to be used for scripts that support vertical
28334 // writing mode, thus, default left justification is used. If Latin
28335 // scripts would need to be supported, this should take into account other justifications.
28336 shapedTextOrientations.vertical = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, 'left', spacingIfAllowed, textOffset, exports.WritingMode.vertical, true, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom);
28337 }
28338 };
28339 // If this layer uses text-variable-anchor, generate shapings for all justification possibilities.
28340 if (!textAlongLine && variableTextAnchor) {
28341 const justifications = textJustify === 'auto' ?
28342 variableTextAnchor.map(a => getAnchorJustification(a)) :
28343 [textJustify];
28344 let singleLine = false;
28345 for (let i = 0; i < justifications.length; i++) {
28346 const justification = justifications[i];
28347 if (shapedTextOrientations.horizontal[justification])
28348 continue;
28349 if (singleLine) {
28350 // If the shaping for the first justification was only a single line, we
28351 // can re-use it for the other justifications
28352 shapedTextOrientations.horizontal[justification] = shapedTextOrientations.horizontal[0];
28353 }
28354 else {
28355 // If using text-variable-anchor for the layer, we use a center anchor for all shapings and apply
28356 // the offsets for the anchor in the placement step.
28357 const shaping = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, 'center', justification, spacingIfAllowed, textOffset, exports.WritingMode.horizontal, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom);
28358 if (shaping) {
28359 shapedTextOrientations.horizontal[justification] = shaping;
28360 singleLine = shaping.positionedLines.length === 1;
28361 }
28362 }
28363 }
28364 addVerticalShapingForPointLabelIfNeeded();
28365 }
28366 else {
28367 if (textJustify === 'auto') {
28368 textJustify = getAnchorJustification(textAnchor);
28369 }
28370 // Horizontal point or line label.
28371 const shaping = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, exports.WritingMode.horizontal, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom);
28372 if (shaping)
28373 shapedTextOrientations.horizontal[textJustify] = shaping;
28374 // Vertical point label (if allowVerticalPlacement is enabled).
28375 addVerticalShapingForPointLabelIfNeeded();
28376 // Verticalized line label.
28377 if (allowsVerticalWritingMode(unformattedText) && textAlongLine && keepUpright) {
28378 shapedTextOrientations.vertical = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, exports.WritingMode.vertical, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom);
28379 }
28380 }
28381 }
28382 let shapedIcon;
28383 let isSDFIcon = false;
28384 if (feature.icon && feature.icon.name) {
28385 const image = imageMap[feature.icon.name];
28386 if (image) {
28387 shapedIcon = shapeIcon(imagePositions[feature.icon.name], layout.get('icon-offset').evaluate(feature, {}, canonical), layout.get('icon-anchor').evaluate(feature, {}, canonical));
28388 // null/undefined SDF property treated same as default (false)
28389 isSDFIcon = !!image.sdf;
28390 if (bucket.sdfIcons === undefined) {
28391 bucket.sdfIcons = isSDFIcon;
28392 }
28393 else if (bucket.sdfIcons !== isSDFIcon) {
28394 warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer');
28395 }
28396 if (image.pixelRatio !== bucket.pixelRatio) {
28397 bucket.iconsNeedLinear = true;
28398 }
28399 else if (layout.get('icon-rotate').constantOr(1) !== 0) {
28400 bucket.iconsNeedLinear = true;
28401 }
28402 }
28403 }
28404 const shapedText = getDefaultHorizontalShaping(shapedTextOrientations.horizontal) || shapedTextOrientations.vertical;
28405 bucket.iconsInText = shapedText ? shapedText.iconsInText : false;
28406 if (shapedText || shapedIcon) {
28407 addFeature(bucket, feature, shapedTextOrientations, shapedIcon, imageMap, sizes, layoutTextSize, layoutIconSize, textOffset, isSDFIcon, canonical);
28408 }
28409 }
28410 if (showCollisionBoxes) {
28411 bucket.generateCollisionDebugBuffers();
28412 }
28413}
28414// Choose the justification that matches the direction of the TextAnchor
28415function getAnchorJustification(anchor) {
28416 switch (anchor) {
28417 case 'right':
28418 case 'top-right':
28419 case 'bottom-right':
28420 return 'right';
28421 case 'left':
28422 case 'top-left':
28423 case 'bottom-left':
28424 return 'left';
28425 }
28426 return 'center';
28427}
28428/**
28429 * Given a feature and its shaped text and icon data, add a 'symbol
28430 * instance' for each _possible_ placement of the symbol feature.
28431 * (At render timePlaceSymbols#place() selects which of these instances to
28432 * show or hide based on collisions with symbols in other layers.)
28433 * @private
28434 */
28435function addFeature(bucket, feature, shapedTextOrientations, shapedIcon, imageMap, sizes, layoutTextSize, layoutIconSize, textOffset, isSDFIcon, canonical) {
28436 // To reduce the number of labels that jump around when zooming we need
28437 // to use a text-size value that is the same for all zoom levels.
28438 // bucket calculates text-size at a high zoom level so that all tiles can
28439 // use the same value when calculating anchor positions.
28440 let textMaxSize = sizes.textMaxSize.evaluate(feature, {});
28441 if (textMaxSize === undefined) {
28442 textMaxSize = layoutTextSize;
28443 }
28444 const layout = bucket.layers[0].layout;
28445 const iconOffset = layout.get('icon-offset').evaluate(feature, {}, canonical);
28446 const defaultHorizontalShaping = getDefaultHorizontalShaping(shapedTextOrientations.horizontal);
28447 const glyphSize = 24, fontScale = layoutTextSize / glyphSize, textBoxScale = bucket.tilePixelRatio * fontScale, textMaxBoxScale = bucket.tilePixelRatio * textMaxSize / glyphSize, iconBoxScale = bucket.tilePixelRatio * layoutIconSize, symbolMinDistance = bucket.tilePixelRatio * layout.get('symbol-spacing'), textPadding = layout.get('text-padding') * bucket.tilePixelRatio, iconPadding = layout.get('icon-padding') * bucket.tilePixelRatio, textMaxAngle = layout.get('text-max-angle') / 180 * Math.PI, textAlongLine = layout.get('text-rotation-alignment') !== 'viewport' && layout.get('symbol-placement') !== 'point', iconAlongLine = layout.get('icon-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point', symbolPlacement = layout.get('symbol-placement'), textRepeatDistance = symbolMinDistance / 2;
28448 const iconTextFit = layout.get('icon-text-fit');
28449 let verticallyShapedIcon;
28450 // Adjust shaped icon size when icon-text-fit is used.
28451 if (shapedIcon && iconTextFit !== 'none') {
28452 if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) {
28453 verticallyShapedIcon = fitIconToText(shapedIcon, shapedTextOrientations.vertical, iconTextFit, layout.get('icon-text-fit-padding'), iconOffset, fontScale);
28454 }
28455 if (defaultHorizontalShaping) {
28456 shapedIcon = fitIconToText(shapedIcon, defaultHorizontalShaping, iconTextFit, layout.get('icon-text-fit-padding'), iconOffset, fontScale);
28457 }
28458 }
28459 const addSymbolAtAnchor = (line, anchor) => {
28460 if (anchor.x < 0 || anchor.x >= EXTENT || anchor.y < 0 || anchor.y >= EXTENT) {
28461 // Symbol layers are drawn across tile boundaries, We filter out symbols
28462 // outside our tile boundaries (which may be included in vector tile buffers)
28463 // to prevent double-drawing symbols.
28464 return;
28465 }
28466 addSymbol(bucket, anchor, line, shapedTextOrientations, shapedIcon, imageMap, verticallyShapedIcon, bucket.layers[0], bucket.collisionBoxArray, feature.index, feature.sourceLayerIndex, bucket.index, textBoxScale, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, feature, sizes, isSDFIcon, canonical, layoutTextSize);
28467 };
28468 if (symbolPlacement === 'line') {
28469 for (const line of clipLine(feature.geometry, 0, 0, EXTENT, EXTENT)) {
28470 const anchors = getAnchors(line, symbolMinDistance, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale, bucket.overscaling, EXTENT);
28471 for (const anchor of anchors) {
28472 const shapedText = defaultHorizontalShaping;
28473 if (!shapedText || !anchorIsTooClose(bucket, shapedText.text, textRepeatDistance, anchor)) {
28474 addSymbolAtAnchor(line, anchor);
28475 }
28476 }
28477 }
28478 }
28479 else if (symbolPlacement === 'line-center') {
28480 // No clipping, multiple lines per feature are allowed
28481 // "lines" with only one point are ignored as in clipLines
28482 for (const line of feature.geometry) {
28483 if (line.length > 1) {
28484 const anchor = getCenterAnchor(line, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale);
28485 if (anchor) {
28486 addSymbolAtAnchor(line, anchor);
28487 }
28488 }
28489 }
28490 }
28491 else if (feature.type === 'Polygon') {
28492 for (const polygon of classifyRings$1(feature.geometry, 0)) {
28493 // 16 here represents 2 pixels
28494 const poi = findPoleOfInaccessibility(polygon, 16);
28495 addSymbolAtAnchor(polygon[0], new Anchor(poi.x, poi.y, 0));
28496 }
28497 }
28498 else if (feature.type === 'LineString') {
28499 // https://github.com/mapbox/mapbox-gl-js/issues/3808
28500 for (const line of feature.geometry) {
28501 addSymbolAtAnchor(line, new Anchor(line[0].x, line[0].y, 0));
28502 }
28503 }
28504 else if (feature.type === 'Point') {
28505 for (const points of feature.geometry) {
28506 for (const point of points) {
28507 addSymbolAtAnchor([point], new Anchor(point.x, point.y, 0));
28508 }
28509 }
28510 }
28511}
28512const MAX_GLYPH_ICON_SIZE = 255;
28513const MAX_PACKED_SIZE = MAX_GLYPH_ICON_SIZE * SIZE_PACK_FACTOR;
28514function addTextVertices(bucket, anchor, shapedText, imageMap, layer, textAlongLine, feature, textOffset, lineArray, writingMode, placementTypes, placedTextSymbolIndices, placedIconIndex, sizes, canonical) {
28515 const glyphQuads = getGlyphQuads(anchor, shapedText, textOffset, layer, textAlongLine, feature, imageMap, bucket.allowVerticalPlacement);
28516 const sizeData = bucket.textSizeData;
28517 let textSizeData = null;
28518 if (sizeData.kind === 'source') {
28519 textSizeData = [
28520 SIZE_PACK_FACTOR * layer.layout.get('text-size').evaluate(feature, {})
28521 ];
28522 if (textSizeData[0] > MAX_PACKED_SIZE) {
28523 warnOnce(`${bucket.layerIds[0]}: Value for "text-size" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your "text-size".`);
28524 }
28525 }
28526 else if (sizeData.kind === 'composite') {
28527 textSizeData = [
28528 SIZE_PACK_FACTOR * sizes.compositeTextSizes[0].evaluate(feature, {}, canonical),
28529 SIZE_PACK_FACTOR * sizes.compositeTextSizes[1].evaluate(feature, {}, canonical)
28530 ];
28531 if (textSizeData[0] > MAX_PACKED_SIZE || textSizeData[1] > MAX_PACKED_SIZE) {
28532 warnOnce(`${bucket.layerIds[0]}: Value for "text-size" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your "text-size".`);
28533 }
28534 }
28535 bucket.addSymbols(bucket.text, glyphQuads, textSizeData, textOffset, textAlongLine, feature, writingMode, anchor, lineArray.lineStartIndex, lineArray.lineLength, placedIconIndex, canonical);
28536 // The placedSymbolArray is used at render time in drawTileSymbols
28537 // These indices allow access to the array at collision detection time
28538 for (const placementType of placementTypes) {
28539 placedTextSymbolIndices[placementType] = bucket.text.placedSymbolArray.length - 1;
28540 }
28541 return glyphQuads.length * 4;
28542}
28543function getDefaultHorizontalShaping(horizontalShaping) {
28544 // We don't care which shaping we get because this is used for collision purposes
28545 // and all the justifications have the same collision box
28546 for (const justification in horizontalShaping) {
28547 return horizontalShaping[justification];
28548 }
28549 return null;
28550}
28551/**
28552 * Add a single label & icon placement.
28553 *
28554 * @private
28555 */
28556function addSymbol(bucket, anchor, line, shapedTextOrientations, shapedIcon, imageMap, verticallyShapedIcon, layer, collisionBoxArray, featureIndex, sourceLayerIndex, bucketIndex, textBoxScale, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, feature, sizes, isSDFIcon, canonical, layoutTextSize) {
28557 const lineArray = bucket.addToLineVertexArray(anchor, line);
28558 let textCollisionFeature, iconCollisionFeature, verticalTextCollisionFeature, verticalIconCollisionFeature;
28559 let numIconVertices = 0;
28560 let numVerticalIconVertices = 0;
28561 let numHorizontalGlyphVertices = 0;
28562 let numVerticalGlyphVertices = 0;
28563 let placedIconSymbolIndex = -1;
28564 let verticalPlacedIconSymbolIndex = -1;
28565 const placedTextSymbolIndices = {};
28566 let key = murmur3$1('');
28567 let textOffset0 = 0;
28568 let textOffset1 = 0;
28569 if (layer._unevaluatedLayout.getValue('text-radial-offset') === undefined) {
28570 [textOffset0, textOffset1] = layer.layout.get('text-offset').evaluate(feature, {}, canonical).map(t => t * ONE_EM);
28571 }
28572 else {
28573 textOffset0 = layer.layout.get('text-radial-offset').evaluate(feature, {}, canonical) * ONE_EM;
28574 textOffset1 = INVALID_TEXT_OFFSET;
28575 }
28576 if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) {
28577 const textRotation = layer.layout.get('text-rotate').evaluate(feature, {}, canonical);
28578 const verticalTextRotation = textRotation + 90.0;
28579 const verticalShaping = shapedTextOrientations.vertical;
28580 verticalTextCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticalShaping, textBoxScale, textPadding, textAlongLine, verticalTextRotation);
28581 if (verticallyShapedIcon) {
28582 verticalIconCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticallyShapedIcon, iconBoxScale, iconPadding, textAlongLine, verticalTextRotation);
28583 }
28584 }
28585 //Place icon first, so text can have a reference to its index in the placed symbol array.
28586 //Text symbols can lazily shift at render-time because of variable anchor placement.
28587 //If the style specifies an `icon-text-fit` then the icon would have to shift along with it.
28588 // For more info check `updateVariableAnchors` in `draw_symbol.js` .
28589 if (shapedIcon) {
28590 const iconRotate = layer.layout.get('icon-rotate').evaluate(feature, {});
28591 const hasIconTextFit = layer.layout.get('icon-text-fit') !== 'none';
28592 const iconQuads = getIconQuads(shapedIcon, iconRotate, isSDFIcon, hasIconTextFit);
28593 const verticalIconQuads = verticallyShapedIcon ? getIconQuads(verticallyShapedIcon, iconRotate, isSDFIcon, hasIconTextFit) : undefined;
28594 iconCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, /*align boxes to line*/ false, iconRotate);
28595 numIconVertices = iconQuads.length * 4;
28596 const sizeData = bucket.iconSizeData;
28597 let iconSizeData = null;
28598 if (sizeData.kind === 'source') {
28599 iconSizeData = [
28600 SIZE_PACK_FACTOR * layer.layout.get('icon-size').evaluate(feature, {})
28601 ];
28602 if (iconSizeData[0] > MAX_PACKED_SIZE) {
28603 warnOnce(`${bucket.layerIds[0]}: Value for "icon-size" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your "icon-size".`);
28604 }
28605 }
28606 else if (sizeData.kind === 'composite') {
28607 iconSizeData = [
28608 SIZE_PACK_FACTOR * sizes.compositeIconSizes[0].evaluate(feature, {}, canonical),
28609 SIZE_PACK_FACTOR * sizes.compositeIconSizes[1].evaluate(feature, {}, canonical)
28610 ];
28611 if (iconSizeData[0] > MAX_PACKED_SIZE || iconSizeData[1] > MAX_PACKED_SIZE) {
28612 warnOnce(`${bucket.layerIds[0]}: Value for "icon-size" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your "icon-size".`);
28613 }
28614 }
28615 bucket.addSymbols(bucket.icon, iconQuads, iconSizeData, iconOffset, iconAlongLine, feature, exports.WritingMode.none, anchor, lineArray.lineStartIndex, lineArray.lineLength,
28616 // The icon itself does not have an associated symbol since the text isnt placed yet
28617 -1, canonical);
28618 placedIconSymbolIndex = bucket.icon.placedSymbolArray.length - 1;
28619 if (verticalIconQuads) {
28620 numVerticalIconVertices = verticalIconQuads.length * 4;
28621 bucket.addSymbols(bucket.icon, verticalIconQuads, iconSizeData, iconOffset, iconAlongLine, feature, exports.WritingMode.vertical, anchor, lineArray.lineStartIndex, lineArray.lineLength,
28622 // The icon itself does not have an associated symbol since the text isnt placed yet
28623 -1, canonical);
28624 verticalPlacedIconSymbolIndex = bucket.icon.placedSymbolArray.length - 1;
28625 }
28626 }
28627 const justifications = Object.keys(shapedTextOrientations.horizontal);
28628 for (const justification of justifications) {
28629 const shaping = shapedTextOrientations.horizontal[justification];
28630 if (!textCollisionFeature) {
28631 key = murmur3$1(shaping.text);
28632 const textRotate = layer.layout.get('text-rotate').evaluate(feature, {}, canonical);
28633 // As a collision approximation, we can use either the vertical or any of the horizontal versions of the feature
28634 // We're counting on all versions having similar dimensions
28635 textCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaping, textBoxScale, textPadding, textAlongLine, textRotate);
28636 }
28637 const singleLine = shaping.positionedLines.length === 1;
28638 numHorizontalGlyphVertices += addTextVertices(bucket, anchor, shaping, imageMap, layer, textAlongLine, feature, textOffset, lineArray, shapedTextOrientations.vertical ? exports.WritingMode.horizontal : exports.WritingMode.horizontalOnly, singleLine ? justifications : [justification], placedTextSymbolIndices, placedIconSymbolIndex, sizes, canonical);
28639 if (singleLine) {
28640 break;
28641 }
28642 }
28643 if (shapedTextOrientations.vertical) {
28644 numVerticalGlyphVertices += addTextVertices(bucket, anchor, shapedTextOrientations.vertical, imageMap, layer, textAlongLine, feature, textOffset, lineArray, exports.WritingMode.vertical, ['vertical'], placedTextSymbolIndices, verticalPlacedIconSymbolIndex, sizes, canonical);
28645 }
28646 const textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length;
28647 const textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length;
28648 const verticalTextBoxStartIndex = verticalTextCollisionFeature ? verticalTextCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length;
28649 const verticalTextBoxEndIndex = verticalTextCollisionFeature ? verticalTextCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length;
28650 const iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length;
28651 const iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length;
28652 const verticalIconBoxStartIndex = verticalIconCollisionFeature ? verticalIconCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length;
28653 const verticalIconBoxEndIndex = verticalIconCollisionFeature ? verticalIconCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length;
28654 // Check if runtime collision circles should be used for any of the collision features.
28655 // It is enough to choose the tallest feature shape as circles are always placed on a line.
28656 // All measurements are in glyph metrics and later converted into pixels using proper font size "layoutTextSize"
28657 let collisionCircleDiameter = -1;
28658 const getCollisionCircleHeight = (feature, prevHeight) => {
28659 if (feature && feature.circleDiameter)
28660 return Math.max(feature.circleDiameter, prevHeight);
28661 return prevHeight;
28662 };
28663 collisionCircleDiameter = getCollisionCircleHeight(textCollisionFeature, collisionCircleDiameter);
28664 collisionCircleDiameter = getCollisionCircleHeight(verticalTextCollisionFeature, collisionCircleDiameter);
28665 collisionCircleDiameter = getCollisionCircleHeight(iconCollisionFeature, collisionCircleDiameter);
28666 collisionCircleDiameter = getCollisionCircleHeight(verticalIconCollisionFeature, collisionCircleDiameter);
28667 const useRuntimeCollisionCircles = (collisionCircleDiameter > -1) ? 1 : 0;
28668 // Convert circle collision height into pixels
28669 if (useRuntimeCollisionCircles)
28670 collisionCircleDiameter *= layoutTextSize / ONE_EM;
28671 if (bucket.glyphOffsetArray.length >= SymbolBucket$1.MAX_GLYPHS)
28672 warnOnce('Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907');
28673 if (feature.sortKey !== undefined) {
28674 bucket.addToSortKeyRanges(bucket.symbolInstances.length, feature.sortKey);
28675 }
28676 bucket.symbolInstances.emplaceBack(anchor.x, anchor.y, placedTextSymbolIndices.right >= 0 ? placedTextSymbolIndices.right : -1, placedTextSymbolIndices.center >= 0 ? placedTextSymbolIndices.center : -1, placedTextSymbolIndices.left >= 0 ? placedTextSymbolIndices.left : -1, placedTextSymbolIndices.vertical || -1, placedIconSymbolIndex, verticalPlacedIconSymbolIndex, key, textBoxStartIndex, textBoxEndIndex, verticalTextBoxStartIndex, verticalTextBoxEndIndex, iconBoxStartIndex, iconBoxEndIndex, verticalIconBoxStartIndex, verticalIconBoxEndIndex, featureIndex, numHorizontalGlyphVertices, numVerticalGlyphVertices, numIconVertices, numVerticalIconVertices, useRuntimeCollisionCircles, 0, textBoxScale, textOffset0, textOffset1, collisionCircleDiameter);
28677}
28678function anchorIsTooClose(bucket, text, repeatDistance, anchor) {
28679 const compareText = bucket.compareText;
28680 if (!(text in compareText)) {
28681 compareText[text] = [];
28682 }
28683 else {
28684 const otherAnchors = compareText[text];
28685 for (let k = otherAnchors.length - 1; k >= 0; k--) {
28686 if (anchor.dist(otherAnchors[k]) < repeatDistance) {
28687 // If it's within repeatDistance of one anchor, stop looking
28688 return true;
28689 }
28690 }
28691 }
28692 // If anchor is not within repeatDistance of any other anchor, add to array
28693 compareText[text].push(anchor);
28694 return false;
28695}
28696
28697const vectorTileFeatureTypes = vectorTile.VectorTileFeature.types;
28698// Opacity arrays are frequently updated but don't contain a lot of information, so we pack them
28699// tight. Each Uint32 is actually four duplicate Uint8s for the four corners of a glyph
28700// 7 bits are for the current opacity, and the lowest bit is the target opacity
28701// actually defined in symbol_attributes.js
28702// const placementOpacityAttributes = [
28703// { name: 'a_fade_opacity', components: 1, type: 'Uint32' }
28704// ];
28705const shaderOpacityAttributes = [
28706 { name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0 }
28707];
28708function addVertex(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex, isSDF, pixelOffsetX, pixelOffsetY, minFontScaleX, minFontScaleY) {
28709 const aSizeX = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[0])) : 0;
28710 const aSizeY = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[1])) : 0;
28711 array.emplaceBack(
28712 // a_pos_offset
28713 anchorX, anchorY, Math.round(ox * 32), Math.round(oy * 32),
28714 // a_data
28715 tx, // x coordinate of symbol on glyph atlas texture
28716 ty, // y coordinate of symbol on glyph atlas texture
28717 (aSizeX << 1) + (isSDF ? 1 : 0), aSizeY, pixelOffsetX * 16, pixelOffsetY * 16, minFontScaleX * 256, minFontScaleY * 256);
28718}
28719function addDynamicAttributes(dynamicLayoutVertexArray, p, angle) {
28720 dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
28721 dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
28722 dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
28723 dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
28724}
28725function containsRTLText(formattedText) {
28726 for (const section of formattedText.sections) {
28727 if (stringContainsRTLText(section.text)) {
28728 return true;
28729 }
28730 }
28731 return false;
28732}
28733class SymbolBuffers {
28734 constructor(programConfigurations) {
28735 this.layoutVertexArray = new SymbolLayoutArray();
28736 this.indexArray = new TriangleIndexArray();
28737 this.programConfigurations = programConfigurations;
28738 this.segments = new SegmentVector();
28739 this.dynamicLayoutVertexArray = new SymbolDynamicLayoutArray();
28740 this.opacityVertexArray = new SymbolOpacityArray();
28741 this.placedSymbolArray = new PlacedSymbolArray();
28742 }
28743 isEmpty() {
28744 return this.layoutVertexArray.length === 0 &&
28745 this.indexArray.length === 0 &&
28746 this.dynamicLayoutVertexArray.length === 0 &&
28747 this.opacityVertexArray.length === 0;
28748 }
28749 upload(context, dynamicIndexBuffer, upload, update) {
28750 if (this.isEmpty()) {
28751 return;
28752 }
28753 if (upload) {
28754 this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members);
28755 this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer);
28756 this.dynamicLayoutVertexBuffer = context.createVertexBuffer(this.dynamicLayoutVertexArray, dynamicLayoutAttributes.members, true);
28757 this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true);
28758 // This is a performance hack so that we can write to opacityVertexArray with uint32s
28759 // even though the shaders read uint8s
28760 this.opacityVertexBuffer.itemSize = 1;
28761 }
28762 if (upload || update) {
28763 this.programConfigurations.upload(context);
28764 }
28765 }
28766 destroy() {
28767 if (!this.layoutVertexBuffer)
28768 return;
28769 this.layoutVertexBuffer.destroy();
28770 this.indexBuffer.destroy();
28771 this.programConfigurations.destroy();
28772 this.segments.destroy();
28773 this.dynamicLayoutVertexBuffer.destroy();
28774 this.opacityVertexBuffer.destroy();
28775 }
28776}
28777register('SymbolBuffers', SymbolBuffers);
28778class CollisionBuffers {
28779 constructor(LayoutArray, layoutAttributes, IndexArray) {
28780 this.layoutVertexArray = new LayoutArray();
28781 this.layoutAttributes = layoutAttributes;
28782 this.indexArray = new IndexArray();
28783 this.segments = new SegmentVector();
28784 this.collisionVertexArray = new CollisionVertexArray();
28785 }
28786 upload(context) {
28787 this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes);
28788 this.indexBuffer = context.createIndexBuffer(this.indexArray);
28789 this.collisionVertexBuffer = context.createVertexBuffer(this.collisionVertexArray, collisionVertexAttributes.members, true);
28790 }
28791 destroy() {
28792 if (!this.layoutVertexBuffer)
28793 return;
28794 this.layoutVertexBuffer.destroy();
28795 this.indexBuffer.destroy();
28796 this.segments.destroy();
28797 this.collisionVertexBuffer.destroy();
28798 }
28799}
28800register('CollisionBuffers', CollisionBuffers);
28801/**
28802 * Unlike other buckets, which simply implement #addFeature with type-specific
28803 * logic for (essentially) triangulating feature geometries, SymbolBucket
28804 * requires specialized behavior:
28805 *
28806 * 1. WorkerTile#parse(), the logical owner of the bucket creation process,
28807 * calls SymbolBucket#populate(), which resolves text and icon tokens on
28808 * each feature, adds each glyphs and symbols needed to the passed-in
28809 * collections options.glyphDependencies and options.iconDependencies, and
28810 * stores the feature data for use in subsequent step (this.features).
28811 *
28812 * 2. WorkerTile asynchronously requests from the main thread all of the glyphs
28813 * and icons needed (by this bucket and any others). When glyphs and icons
28814 * have been received, the WorkerTile creates a CollisionIndex and invokes:
28815 *
28816 * 3. performSymbolLayout(bucket, stacks, icons) perform texts shaping and
28817 * layout on a Symbol Bucket. This step populates:
28818 * `this.symbolInstances`: metadata on generated symbols
28819 * `this.collisionBoxArray`: collision data for use by foreground
28820 * `this.text`: SymbolBuffers for text symbols
28821 * `this.icons`: SymbolBuffers for icons
28822 * `this.iconCollisionBox`: Debug SymbolBuffers for icon collision boxes
28823 * `this.textCollisionBox`: Debug SymbolBuffers for text collision boxes
28824 * The results are sent to the foreground for rendering
28825 *
28826 * 4. performSymbolPlacement(bucket, collisionIndex) is run on the foreground,
28827 * and uses the CollisionIndex along with current camera settings to determine
28828 * which symbols can actually show on the map. Collided symbols are hidden
28829 * using a dynamic "OpacityVertexArray".
28830 *
28831 * @private
28832 */
28833class SymbolBucket {
28834 constructor(options) {
28835 this.collisionBoxArray = options.collisionBoxArray;
28836 this.zoom = options.zoom;
28837 this.overscaling = options.overscaling;
28838 this.layers = options.layers;
28839 this.layerIds = this.layers.map(layer => layer.id);
28840 this.index = options.index;
28841 this.pixelRatio = options.pixelRatio;
28842 this.sourceLayerIndex = options.sourceLayerIndex;
28843 this.hasPattern = false;
28844 this.hasRTLText = false;
28845 this.sortKeyRanges = [];
28846 this.collisionCircleArray = [];
28847 this.placementInvProjMatrix = identity$2([]);
28848 this.placementViewportMatrix = identity$2([]);
28849 const layer = this.layers[0];
28850 const unevaluatedLayoutValues = layer._unevaluatedLayout._values;
28851 this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']);
28852 this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']);
28853 const layout = this.layers[0].layout;
28854 const sortKey = layout.get('symbol-sort-key');
28855 const zOrder = layout.get('symbol-z-order');
28856 this.canOverlap =
28857 getOverlapMode(layout, 'text-overlap', 'text-allow-overlap') !== 'never' ||
28858 getOverlapMode(layout, 'icon-overlap', 'icon-allow-overlap') !== 'never' ||
28859 layout.get('text-ignore-placement') ||
28860 layout.get('icon-ignore-placement');
28861 this.sortFeaturesByKey = zOrder !== 'viewport-y' && !sortKey.isConstant();
28862 const zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey);
28863 this.sortFeaturesByY = zOrderByViewportY && this.canOverlap;
28864 if (layout.get('symbol-placement') === 'point') {
28865 this.writingModes = layout.get('text-writing-mode').map(wm => exports.WritingMode[wm]);
28866 }
28867 this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
28868 this.sourceID = options.sourceID;
28869 }
28870 createArrays() {
28871 this.text = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, property => /^text/.test(property)));
28872 this.icon = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, property => /^icon/.test(property)));
28873 this.glyphOffsetArray = new GlyphOffsetArray();
28874 this.lineVertexArray = new SymbolLineVertexArray();
28875 this.symbolInstances = new SymbolInstanceArray();
28876 }
28877 calculateGlyphDependencies(text, stack, textAlongLine, allowVerticalPlacement, doesAllowVerticalWritingMode) {
28878 for (let i = 0; i < text.length; i++) {
28879 stack[text.charCodeAt(i)] = true;
28880 if ((textAlongLine || allowVerticalPlacement) && doesAllowVerticalWritingMode) {
28881 const verticalChar = verticalizedCharacterMap[text.charAt(i)];
28882 if (verticalChar) {
28883 stack[verticalChar.charCodeAt(0)] = true;
28884 }
28885 }
28886 }
28887 }
28888 populate(features, options, canonical) {
28889 const layer = this.layers[0];
28890 const layout = layer.layout;
28891 const textFont = layout.get('text-font');
28892 const textField = layout.get('text-field');
28893 const iconImage = layout.get('icon-image');
28894 const hasText = (textField.value.kind !== 'constant' ||
28895 (textField.value.value instanceof Formatted && !textField.value.value.isEmpty()) ||
28896 textField.value.value.toString().length > 0) &&
28897 (textFont.value.kind !== 'constant' || textFont.value.value.length > 0);
28898 // we should always resolve the icon-image value if the property was defined in the style
28899 // this allows us to fire the styleimagemissing event if image evaluation returns null
28900 // the only way to distinguish between null returned from a coalesce statement with no valid images
28901 // and null returned because icon-image wasn't defined is to check whether or not iconImage.parameters is an empty object
28902 const hasIcon = iconImage.value.kind !== 'constant' || !!iconImage.value.value || Object.keys(iconImage.parameters).length > 0;
28903 const symbolSortKey = layout.get('symbol-sort-key');
28904 this.features = [];
28905 if (!hasText && !hasIcon) {
28906 return;
28907 }
28908 const icons = options.iconDependencies;
28909 const stacks = options.glyphDependencies;
28910 const availableImages = options.availableImages;
28911 const globalProperties = new EvaluationParameters(this.zoom);
28912 for (const { feature, id, index, sourceLayerIndex } of features) {
28913 const needGeometry = layer._featureFilter.needGeometry;
28914 const evaluationFeature = toEvaluationFeature(feature, needGeometry);
28915 if (!layer._featureFilter.filter(globalProperties, evaluationFeature, canonical)) {
28916 continue;
28917 }
28918 if (!needGeometry)
28919 evaluationFeature.geometry = loadGeometry(feature);
28920 let text;
28921 if (hasText) {
28922 // Expression evaluation will automatically coerce to Formatted
28923 // but plain string token evaluation skips that pathway so do the
28924 // conversion here.
28925 const resolvedTokens = layer.getValueAndResolveTokens('text-field', evaluationFeature, canonical, availableImages);
28926 const formattedText = Formatted.factory(resolvedTokens);
28927 if (containsRTLText(formattedText)) {
28928 this.hasRTLText = true;
28929 }
28930 if (!this.hasRTLText || // non-rtl text so can proceed safely
28931 getRTLTextPluginStatus() === 'unavailable' || // We don't intend to lazy-load the rtl text plugin, so proceed with incorrect shaping
28932 this.hasRTLText && plugin.isParsed() // Use the rtlText plugin to shape text
28933 ) {
28934 text = transformText$1(formattedText, layer, evaluationFeature);
28935 }
28936 }
28937 let icon;
28938 if (hasIcon) {
28939 // Expression evaluation will automatically coerce to Image
28940 // but plain string token evaluation skips that pathway so do the
28941 // conversion here.
28942 const resolvedTokens = layer.getValueAndResolveTokens('icon-image', evaluationFeature, canonical, availableImages);
28943 if (resolvedTokens instanceof ResolvedImage) {
28944 icon = resolvedTokens;
28945 }
28946 else {
28947 icon = ResolvedImage.fromString(resolvedTokens);
28948 }
28949 }
28950 if (!text && !icon) {
28951 continue;
28952 }
28953 const sortKey = this.sortFeaturesByKey ?
28954 symbolSortKey.evaluate(evaluationFeature, {}, canonical) :
28955 undefined;
28956 const symbolFeature = {
28957 id,
28958 text,
28959 icon,
28960 index,
28961 sourceLayerIndex,
28962 geometry: evaluationFeature.geometry,
28963 properties: feature.properties,
28964 type: vectorTileFeatureTypes[feature.type],
28965 sortKey
28966 };
28967 this.features.push(symbolFeature);
28968 if (icon) {
28969 icons[icon.name] = true;
28970 }
28971 if (text) {
28972 const fontStack = textFont.evaluate(evaluationFeature, {}, canonical).join(',');
28973 const textAlongLine = layout.get('text-rotation-alignment') !== 'viewport' && layout.get('symbol-placement') !== 'point';
28974 this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(exports.WritingMode.vertical) >= 0;
28975 for (const section of text.sections) {
28976 if (!section.image) {
28977 const doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString());
28978 const sectionFont = section.fontStack || fontStack;
28979 const sectionStack = stacks[sectionFont] = stacks[sectionFont] || {};
28980 this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode);
28981 }
28982 else {
28983 // Add section image to the list of dependencies.
28984 icons[section.image.name] = true;
28985 }
28986 }
28987 }
28988 }
28989 if (layout.get('symbol-placement') === 'line') {
28990 // Merge adjacent lines with the same text to improve labelling.
28991 // It's better to place labels on one long line than on many short segments.
28992 this.features = mergeLines(this.features);
28993 }
28994 if (this.sortFeaturesByKey) {
28995 this.features.sort((a, b) => {
28996 // a.sortKey is always a number when sortFeaturesByKey is true
28997 return a.sortKey - b.sortKey;
28998 });
28999 }
29000 }
29001 update(states, vtLayer, imagePositions) {
29002 if (!this.stateDependentLayers.length)
29003 return;
29004 this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions);
29005 this.icon.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions);
29006 }
29007 isEmpty() {
29008 // When the bucket encounters only rtl-text but the plugin isnt loaded, no symbol instances will be created.
29009 // In order for the bucket to be serialized, and not discarded as an empty bucket both checks are necessary.
29010 return this.symbolInstances.length === 0 && !this.hasRTLText;
29011 }
29012 uploadPending() {
29013 return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload;
29014 }
29015 upload(context) {
29016 if (!this.uploaded && this.hasDebugData()) {
29017 this.textCollisionBox.upload(context);
29018 this.iconCollisionBox.upload(context);
29019 }
29020 this.text.upload(context, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload);
29021 this.icon.upload(context, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload);
29022 this.uploaded = true;
29023 }
29024 destroyDebugData() {
29025 this.textCollisionBox.destroy();
29026 this.iconCollisionBox.destroy();
29027 }
29028 destroy() {
29029 this.text.destroy();
29030 this.icon.destroy();
29031 if (this.hasDebugData()) {
29032 this.destroyDebugData();
29033 }
29034 }
29035 addToLineVertexArray(anchor, line) {
29036 const lineStartIndex = this.lineVertexArray.length;
29037 if (anchor.segment !== undefined) {
29038 let sumForwardLength = anchor.dist(line[anchor.segment + 1]);
29039 let sumBackwardLength = anchor.dist(line[anchor.segment]);
29040 const vertices = {};
29041 for (let i = anchor.segment + 1; i < line.length; i++) {
29042 vertices[i] = { x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumForwardLength };
29043 if (i < line.length - 1) {
29044 sumForwardLength += line[i + 1].dist(line[i]);
29045 }
29046 }
29047 for (let i = anchor.segment || 0; i >= 0; i--) {
29048 vertices[i] = { x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumBackwardLength };
29049 if (i > 0) {
29050 sumBackwardLength += line[i - 1].dist(line[i]);
29051 }
29052 }
29053 for (let i = 0; i < line.length; i++) {
29054 const vertex = vertices[i];
29055 this.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor);
29056 }
29057 }
29058 return {
29059 lineStartIndex,
29060 lineLength: this.lineVertexArray.length - lineStartIndex
29061 };
29062 }
29063 addSymbols(arrays, quads, sizeVertex, lineOffset, alongLine, feature, writingMode, labelAnchor, lineStartIndex, lineLength, associatedIconIndex, canonical) {
29064 const indexArray = arrays.indexArray;
29065 const layoutVertexArray = arrays.layoutVertexArray;
29066 const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, this.canOverlap ? feature.sortKey : undefined);
29067 const glyphOffsetArrayStart = this.glyphOffsetArray.length;
29068 const vertexStartIndex = segment.vertexLength;
29069 const angle = (this.allowVerticalPlacement && writingMode === exports.WritingMode.vertical) ? Math.PI / 2 : 0;
29070 const sections = feature.text && feature.text.sections;
29071 for (let i = 0; i < quads.length; i++) {
29072 const { tl, tr, bl, br, tex, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY, glyphOffset, isSDF, sectionIndex } = quads[i];
29073 const index = segment.vertexLength;
29074 const y = glyphOffset[1];
29075 addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY);
29076 addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY);
29077 addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY);
29078 addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY);
29079 addDynamicAttributes(arrays.dynamicLayoutVertexArray, labelAnchor, angle);
29080 indexArray.emplaceBack(index, index + 1, index + 2);
29081 indexArray.emplaceBack(index + 1, index + 2, index + 3);
29082 segment.vertexLength += 4;
29083 segment.primitiveLength += 2;
29084 this.glyphOffsetArray.emplaceBack(glyphOffset[0]);
29085 if (i === quads.length - 1 || sectionIndex !== quads[i + 1].sectionIndex) {
29086 arrays.programConfigurations.populatePaintArrays(layoutVertexArray.length, feature, feature.index, {}, canonical, sections && sections[sectionIndex]);
29087 }
29088 }
29089 arrays.placedSymbolArray.emplaceBack(labelAnchor.x, labelAnchor.y, glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex, lineStartIndex, lineLength, labelAnchor.segment, sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0, lineOffset[0], lineOffset[1], writingMode,
29090 // placedOrientation is null initially; will be updated to horizontal(1)/vertical(2) if placed
29091 0, false,
29092 // The crossTileID is only filled/used on the foreground for dynamic text anchors
29093 0, associatedIconIndex);
29094 }
29095 _addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, point, anchorX, anchorY, extrude) {
29096 collisionVertexArray.emplaceBack(0, 0);
29097 return layoutVertexArray.emplaceBack(
29098 // pos
29099 point.x, point.y,
29100 // a_anchor_pos
29101 anchorX, anchorY,
29102 // extrude
29103 Math.round(extrude.x), Math.round(extrude.y));
29104 }
29105 addCollisionDebugVertices(x1, y1, x2, y2, arrays, boxAnchorPoint, symbolInstance) {
29106 const segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray);
29107 const index = segment.vertexLength;
29108 const layoutVertexArray = arrays.layoutVertexArray;
29109 const collisionVertexArray = arrays.collisionVertexArray;
29110 const anchorX = symbolInstance.anchorX;
29111 const anchorY = symbolInstance.anchorY;
29112 this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y1));
29113 this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y1));
29114 this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y2));
29115 this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y2));
29116 segment.vertexLength += 4;
29117 const indexArray = arrays.indexArray;
29118 indexArray.emplaceBack(index, index + 1);
29119 indexArray.emplaceBack(index + 1, index + 2);
29120 indexArray.emplaceBack(index + 2, index + 3);
29121 indexArray.emplaceBack(index + 3, index);
29122 segment.primitiveLength += 4;
29123 }
29124 addDebugCollisionBoxes(startIndex, endIndex, symbolInstance, isText) {
29125 for (let b = startIndex; b < endIndex; b++) {
29126 const box = this.collisionBoxArray.get(b);
29127 const x1 = box.x1;
29128 const y1 = box.y1;
29129 const x2 = box.x2;
29130 const y2 = box.y2;
29131 this.addCollisionDebugVertices(x1, y1, x2, y2, isText ? this.textCollisionBox : this.iconCollisionBox, box.anchorPoint, symbolInstance);
29132 }
29133 }
29134 generateCollisionDebugBuffers() {
29135 if (this.hasDebugData()) {
29136 this.destroyDebugData();
29137 }
29138 this.textCollisionBox = new CollisionBuffers(CollisionBoxLayoutArray, collisionBoxLayout.members, LineIndexArray);
29139 this.iconCollisionBox = new CollisionBuffers(CollisionBoxLayoutArray, collisionBoxLayout.members, LineIndexArray);
29140 for (let i = 0; i < this.symbolInstances.length; i++) {
29141 const symbolInstance = this.symbolInstances.get(i);
29142 this.addDebugCollisionBoxes(symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance, true);
29143 this.addDebugCollisionBoxes(symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance, true);
29144 this.addDebugCollisionBoxes(symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance, false);
29145 this.addDebugCollisionBoxes(symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex, symbolInstance, false);
29146 }
29147 }
29148 // These flat arrays are meant to be quicker to iterate over than the source
29149 // CollisionBoxArray
29150 _deserializeCollisionBoxesForSymbol(collisionBoxArray, textStartIndex, textEndIndex, verticalTextStartIndex, verticalTextEndIndex, iconStartIndex, iconEndIndex, verticalIconStartIndex, verticalIconEndIndex) {
29151 const collisionArrays = {};
29152 for (let k = textStartIndex; k < textEndIndex; k++) {
29153 const box = collisionBoxArray.get(k);
29154 collisionArrays.textBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY };
29155 collisionArrays.textFeatureIndex = box.featureIndex;
29156 break; // Only one box allowed per instance
29157 }
29158 for (let k = verticalTextStartIndex; k < verticalTextEndIndex; k++) {
29159 const box = collisionBoxArray.get(k);
29160 collisionArrays.verticalTextBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY };
29161 collisionArrays.verticalTextFeatureIndex = box.featureIndex;
29162 break; // Only one box allowed per instance
29163 }
29164 for (let k = iconStartIndex; k < iconEndIndex; k++) {
29165 // An icon can only have one box now, so this indexing is a bit vestigial...
29166 const box = collisionBoxArray.get(k);
29167 collisionArrays.iconBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY };
29168 collisionArrays.iconFeatureIndex = box.featureIndex;
29169 break; // Only one box allowed per instance
29170 }
29171 for (let k = verticalIconStartIndex; k < verticalIconEndIndex; k++) {
29172 // An icon can only have one box now, so this indexing is a bit vestigial...
29173 const box = collisionBoxArray.get(k);
29174 collisionArrays.verticalIconBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY };
29175 collisionArrays.verticalIconFeatureIndex = box.featureIndex;
29176 break; // Only one box allowed per instance
29177 }
29178 return collisionArrays;
29179 }
29180 deserializeCollisionBoxes(collisionBoxArray) {
29181 this.collisionArrays = [];
29182 for (let i = 0; i < this.symbolInstances.length; i++) {
29183 const symbolInstance = this.symbolInstances.get(i);
29184 this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol(collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex));
29185 }
29186 }
29187 hasTextData() {
29188 return this.text.segments.get().length > 0;
29189 }
29190 hasIconData() {
29191 return this.icon.segments.get().length > 0;
29192 }
29193 hasDebugData() {
29194 return this.textCollisionBox && this.iconCollisionBox;
29195 }
29196 hasTextCollisionBoxData() {
29197 return this.hasDebugData() && this.textCollisionBox.segments.get().length > 0;
29198 }
29199 hasIconCollisionBoxData() {
29200 return this.hasDebugData() && this.iconCollisionBox.segments.get().length > 0;
29201 }
29202 addIndicesForPlacedSymbol(iconOrText, placedSymbolIndex) {
29203 const placedSymbol = iconOrText.placedSymbolArray.get(placedSymbolIndex);
29204 const endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4;
29205 for (let vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) {
29206 iconOrText.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2);
29207 iconOrText.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3);
29208 }
29209 }
29210 getSortedSymbolIndexes(angle) {
29211 if (this.sortedAngle === angle && this.symbolInstanceIndexes !== undefined) {
29212 return this.symbolInstanceIndexes;
29213 }
29214 const sin = Math.sin(angle);
29215 const cos = Math.cos(angle);
29216 const rotatedYs = [];
29217 const featureIndexes = [];
29218 const result = [];
29219 for (let i = 0; i < this.symbolInstances.length; ++i) {
29220 result.push(i);
29221 const symbolInstance = this.symbolInstances.get(i);
29222 rotatedYs.push(Math.round(sin * symbolInstance.anchorX + cos * symbolInstance.anchorY) | 0);
29223 featureIndexes.push(symbolInstance.featureIndex);
29224 }
29225 result.sort((aIndex, bIndex) => {
29226 return (rotatedYs[aIndex] - rotatedYs[bIndex]) ||
29227 (featureIndexes[bIndex] - featureIndexes[aIndex]);
29228 });
29229 return result;
29230 }
29231 addToSortKeyRanges(symbolInstanceIndex, sortKey) {
29232 const last = this.sortKeyRanges[this.sortKeyRanges.length - 1];
29233 if (last && last.sortKey === sortKey) {
29234 last.symbolInstanceEnd = symbolInstanceIndex + 1;
29235 }
29236 else {
29237 this.sortKeyRanges.push({
29238 sortKey,
29239 symbolInstanceStart: symbolInstanceIndex,
29240 symbolInstanceEnd: symbolInstanceIndex + 1
29241 });
29242 }
29243 }
29244 sortFeatures(angle) {
29245 if (!this.sortFeaturesByY)
29246 return;
29247 if (this.sortedAngle === angle)
29248 return;
29249 // The current approach to sorting doesn't sort across segments so don't try.
29250 // Sorting within segments separately seemed not to be worth the complexity.
29251 if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1)
29252 return;
29253 // If the symbols are allowed to overlap sort them by their vertical screen position.
29254 // The index array buffer is rewritten to reference the (unchanged) vertices in the
29255 // sorted order.
29256 // To avoid sorting the actual symbolInstance array we sort an array of indexes.
29257 this.symbolInstanceIndexes = this.getSortedSymbolIndexes(angle);
29258 this.sortedAngle = angle;
29259 this.text.indexArray.clear();
29260 this.icon.indexArray.clear();
29261 this.featureSortOrder = [];
29262 for (const i of this.symbolInstanceIndexes) {
29263 const symbolInstance = this.symbolInstances.get(i);
29264 this.featureSortOrder.push(symbolInstance.featureIndex);
29265 [
29266 symbolInstance.rightJustifiedTextSymbolIndex,
29267 symbolInstance.centerJustifiedTextSymbolIndex,
29268 symbolInstance.leftJustifiedTextSymbolIndex
29269 ].forEach((index, i, array) => {
29270 // Only add a given index the first time it shows up,
29271 // to avoid duplicate opacity entries when multiple justifications
29272 // share the same glyphs.
29273 if (index >= 0 && array.indexOf(index) === i) {
29274 this.addIndicesForPlacedSymbol(this.text, index);
29275 }
29276 });
29277 if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) {
29278 this.addIndicesForPlacedSymbol(this.text, symbolInstance.verticalPlacedTextSymbolIndex);
29279 }
29280 if (symbolInstance.placedIconSymbolIndex >= 0) {
29281 this.addIndicesForPlacedSymbol(this.icon, symbolInstance.placedIconSymbolIndex);
29282 }
29283 if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) {
29284 this.addIndicesForPlacedSymbol(this.icon, symbolInstance.verticalPlacedIconSymbolIndex);
29285 }
29286 }
29287 if (this.text.indexBuffer)
29288 this.text.indexBuffer.updateData(this.text.indexArray);
29289 if (this.icon.indexBuffer)
29290 this.icon.indexBuffer.updateData(this.icon.indexArray);
29291 }
29292}
29293register('SymbolBucket', SymbolBucket, {
29294 omit: ['layers', 'collisionBoxArray', 'features', 'compareText']
29295});
29296// this constant is based on the size of StructArray indexes used in a symbol
29297// bucket--namely, glyphOffsetArrayStart
29298// eg the max valid UInt16 is 65,535
29299// See https://github.com/mapbox/mapbox-gl-js/issues/2907 for motivation
29300// lineStartIndex and textBoxStartIndex could potentially be concerns
29301// but we expect there to be many fewer boxes/lines than glyphs
29302SymbolBucket.MAX_GLYPHS = 65535;
29303SymbolBucket.addDynamicAttributes = addDynamicAttributes;
29304var SymbolBucket$1 = SymbolBucket;
29305
29306/**
29307 * Replace tokens in a string template with values in an object
29308 *
29309 * @param properties a key/value relationship between tokens and replacements
29310 * @param text the template string
29311 * @returns the template with tokens replaced
29312 * @private
29313 */
29314function resolveTokens(properties, text) {
29315 return text.replace(/{([^{}]+)}/g, (match, key) => {
29316 return key in properties ? String(properties[key]) : '';
29317 });
29318}
29319
29320// This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
29321const layout = new Properties({
29322 "symbol-placement": new DataConstantProperty(spec["layout_symbol"]["symbol-placement"]),
29323 "symbol-spacing": new DataConstantProperty(spec["layout_symbol"]["symbol-spacing"]),
29324 "symbol-avoid-edges": new DataConstantProperty(spec["layout_symbol"]["symbol-avoid-edges"]),
29325 "symbol-sort-key": new DataDrivenProperty(spec["layout_symbol"]["symbol-sort-key"]),
29326 "symbol-z-order": new DataConstantProperty(spec["layout_symbol"]["symbol-z-order"]),
29327 "icon-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["icon-allow-overlap"]),
29328 "icon-overlap": new DataConstantProperty(spec["layout_symbol"]["icon-overlap"]),
29329 "icon-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["icon-ignore-placement"]),
29330 "icon-optional": new DataConstantProperty(spec["layout_symbol"]["icon-optional"]),
29331 "icon-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-rotation-alignment"]),
29332 "icon-size": new DataDrivenProperty(spec["layout_symbol"]["icon-size"]),
29333 "icon-text-fit": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit"]),
29334 "icon-text-fit-padding": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit-padding"]),
29335 "icon-image": new DataDrivenProperty(spec["layout_symbol"]["icon-image"]),
29336 "icon-rotate": new DataDrivenProperty(spec["layout_symbol"]["icon-rotate"]),
29337 "icon-padding": new DataConstantProperty(spec["layout_symbol"]["icon-padding"]),
29338 "icon-keep-upright": new DataConstantProperty(spec["layout_symbol"]["icon-keep-upright"]),
29339 "icon-offset": new DataDrivenProperty(spec["layout_symbol"]["icon-offset"]),
29340 "icon-anchor": new DataDrivenProperty(spec["layout_symbol"]["icon-anchor"]),
29341 "icon-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-pitch-alignment"]),
29342 "text-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["text-pitch-alignment"]),
29343 "text-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["text-rotation-alignment"]),
29344 "text-field": new DataDrivenProperty(spec["layout_symbol"]["text-field"]),
29345 "text-font": new DataDrivenProperty(spec["layout_symbol"]["text-font"]),
29346 "text-size": new DataDrivenProperty(spec["layout_symbol"]["text-size"]),
29347 "text-max-width": new DataDrivenProperty(spec["layout_symbol"]["text-max-width"]),
29348 "text-line-height": new DataConstantProperty(spec["layout_symbol"]["text-line-height"]),
29349 "text-letter-spacing": new DataDrivenProperty(spec["layout_symbol"]["text-letter-spacing"]),
29350 "text-justify": new DataDrivenProperty(spec["layout_symbol"]["text-justify"]),
29351 "text-radial-offset": new DataDrivenProperty(spec["layout_symbol"]["text-radial-offset"]),
29352 "text-variable-anchor": new DataConstantProperty(spec["layout_symbol"]["text-variable-anchor"]),
29353 "text-anchor": new DataDrivenProperty(spec["layout_symbol"]["text-anchor"]),
29354 "text-max-angle": new DataConstantProperty(spec["layout_symbol"]["text-max-angle"]),
29355 "text-writing-mode": new DataConstantProperty(spec["layout_symbol"]["text-writing-mode"]),
29356 "text-rotate": new DataDrivenProperty(spec["layout_symbol"]["text-rotate"]),
29357 "text-padding": new DataConstantProperty(spec["layout_symbol"]["text-padding"]),
29358 "text-keep-upright": new DataConstantProperty(spec["layout_symbol"]["text-keep-upright"]),
29359 "text-transform": new DataDrivenProperty(spec["layout_symbol"]["text-transform"]),
29360 "text-offset": new DataDrivenProperty(spec["layout_symbol"]["text-offset"]),
29361 "text-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["text-allow-overlap"]),
29362 "text-overlap": new DataConstantProperty(spec["layout_symbol"]["text-overlap"]),
29363 "text-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["text-ignore-placement"]),
29364 "text-optional": new DataConstantProperty(spec["layout_symbol"]["text-optional"]),
29365});
29366const paint$2 = new Properties({
29367 "icon-opacity": new DataDrivenProperty(spec["paint_symbol"]["icon-opacity"]),
29368 "icon-color": new DataDrivenProperty(spec["paint_symbol"]["icon-color"]),
29369 "icon-halo-color": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-color"]),
29370 "icon-halo-width": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-width"]),
29371 "icon-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-blur"]),
29372 "icon-translate": new DataConstantProperty(spec["paint_symbol"]["icon-translate"]),
29373 "icon-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["icon-translate-anchor"]),
29374 "text-opacity": new DataDrivenProperty(spec["paint_symbol"]["text-opacity"]),
29375 "text-color": new DataDrivenProperty(spec["paint_symbol"]["text-color"], { runtimeType: ColorType, getOverride: (o) => o.textColor, hasOverride: (o) => !!o.textColor }),
29376 "text-halo-color": new DataDrivenProperty(spec["paint_symbol"]["text-halo-color"]),
29377 "text-halo-width": new DataDrivenProperty(spec["paint_symbol"]["text-halo-width"]),
29378 "text-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["text-halo-blur"]),
29379 "text-translate": new DataConstantProperty(spec["paint_symbol"]["text-translate"]),
29380 "text-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["text-translate-anchor"]),
29381});
29382var properties$2 = { paint: paint$2, layout };
29383
29384// This is an internal expression class. It is only used in GL JS and
29385// has GL JS dependencies which can break the standalone style-spec module
29386class FormatSectionOverride {
29387 constructor(defaultValue) {
29388 assert$1(defaultValue.property.overrides !== undefined);
29389 this.type = defaultValue.property.overrides ? defaultValue.property.overrides.runtimeType : NullType;
29390 this.defaultValue = defaultValue;
29391 }
29392 evaluate(ctx) {
29393 if (ctx.formattedSection) {
29394 const overrides = this.defaultValue.property.overrides;
29395 if (overrides && overrides.hasOverride(ctx.formattedSection)) {
29396 return overrides.getOverride(ctx.formattedSection);
29397 }
29398 }
29399 if (ctx.feature && ctx.featureState) {
29400 return this.defaultValue.evaluate(ctx.feature, ctx.featureState);
29401 }
29402 return this.defaultValue.property.specification.default;
29403 }
29404 eachChild(fn) {
29405 if (!this.defaultValue.isConstant()) {
29406 const expr = this.defaultValue.value;
29407 fn(expr._styleExpression.expression);
29408 }
29409 }
29410 // Cannot be statically evaluated, as the output depends on the evaluation context.
29411 outputDefined() {
29412 return false;
29413 }
29414 serialize() {
29415 return null;
29416 }
29417}
29418register('FormatSectionOverride', FormatSectionOverride, { omit: ['defaultValue'] });
29419
29420class SymbolStyleLayer extends StyleLayer {
29421 constructor(layer) {
29422 super(layer, properties$2);
29423 }
29424 recalculate(parameters, availableImages) {
29425 super.recalculate(parameters, availableImages);
29426 if (this.layout.get('icon-rotation-alignment') === 'auto') {
29427 if (this.layout.get('symbol-placement') !== 'point') {
29428 this.layout._values['icon-rotation-alignment'] = 'map';
29429 }
29430 else {
29431 this.layout._values['icon-rotation-alignment'] = 'viewport';
29432 }
29433 }
29434 if (this.layout.get('text-rotation-alignment') === 'auto') {
29435 if (this.layout.get('symbol-placement') !== 'point') {
29436 this.layout._values['text-rotation-alignment'] = 'map';
29437 }
29438 else {
29439 this.layout._values['text-rotation-alignment'] = 'viewport';
29440 }
29441 }
29442 // If unspecified, `*-pitch-alignment` inherits `*-rotation-alignment`
29443 if (this.layout.get('text-pitch-alignment') === 'auto') {
29444 this.layout._values['text-pitch-alignment'] = this.layout.get('text-rotation-alignment') === 'map' ? 'map' : 'viewport';
29445 }
29446 if (this.layout.get('icon-pitch-alignment') === 'auto') {
29447 this.layout._values['icon-pitch-alignment'] = this.layout.get('icon-rotation-alignment');
29448 }
29449 if (this.layout.get('symbol-placement') === 'point') {
29450 const writingModes = this.layout.get('text-writing-mode');
29451 if (writingModes) {
29452 // remove duplicates, preserving order
29453 const deduped = [];
29454 for (const m of writingModes) {
29455 if (deduped.indexOf(m) < 0)
29456 deduped.push(m);
29457 }
29458 this.layout._values['text-writing-mode'] = deduped;
29459 }
29460 else {
29461 this.layout._values['text-writing-mode'] = ['horizontal'];
29462 }
29463 }
29464 this._setPaintOverrides();
29465 }
29466 getValueAndResolveTokens(name, feature, canonical, availableImages) {
29467 const value = this.layout.get(name).evaluate(feature, {}, canonical, availableImages);
29468 const unevaluated = this._unevaluatedLayout._values[name];
29469 if (!unevaluated.isDataDriven() && !isExpression(unevaluated.value) && value) {
29470 return resolveTokens(feature.properties, value);
29471 }
29472 return value;
29473 }
29474 createBucket(parameters) {
29475 return new SymbolBucket$1(parameters);
29476 }
29477 queryRadius() {
29478 return 0;
29479 }
29480 queryIntersectsFeature() {
29481 assert$1(false); // Should take a different path in FeatureIndex
29482 return false;
29483 }
29484 _setPaintOverrides() {
29485 for (const overridable of properties$2.paint.overridableProperties) {
29486 if (!SymbolStyleLayer.hasPaintOverride(this.layout, overridable)) {
29487 continue;
29488 }
29489 const overriden = this.paint.get(overridable);
29490 const override = new FormatSectionOverride(overriden);
29491 const styleExpression = new StyleExpression(override, overriden.property.specification);
29492 let expression = null;
29493 if (overriden.value.kind === 'constant' || overriden.value.kind === 'source') {
29494 expression = new ZoomConstantExpression('source', styleExpression);
29495 }
29496 else {
29497 expression = new ZoomDependentExpression('composite', styleExpression, overriden.value.zoomStops, overriden.value._interpolationType);
29498 }
29499 this.paint._values[overridable] = new PossiblyEvaluatedPropertyValue(overriden.property, expression, overriden.parameters);
29500 }
29501 }
29502 _handleOverridablePaintPropertyUpdate(name, oldValue, newValue) {
29503 if (!this.layout || oldValue.isDataDriven() || newValue.isDataDriven()) {
29504 return false;
29505 }
29506 return SymbolStyleLayer.hasPaintOverride(this.layout, name);
29507 }
29508 static hasPaintOverride(layout, propertyName) {
29509 const textField = layout.get('text-field');
29510 const property = properties$2.paint.properties[propertyName];
29511 let hasOverrides = false;
29512 const checkSections = (sections) => {
29513 for (const section of sections) {
29514 if (property.overrides && property.overrides.hasOverride(section)) {
29515 hasOverrides = true;
29516 return;
29517 }
29518 }
29519 };
29520 if (textField.value.kind === 'constant' && textField.value.value instanceof Formatted) {
29521 checkSections(textField.value.value.sections);
29522 }
29523 else if (textField.value.kind === 'source') {
29524 const checkExpression = (expression) => {
29525 if (hasOverrides)
29526 return;
29527 if (expression instanceof Literal && typeOf(expression.value) === FormattedType) {
29528 const formatted = expression.value;
29529 checkSections(formatted.sections);
29530 }
29531 else if (expression instanceof FormatExpression) {
29532 checkSections(expression.sections);
29533 }
29534 else {
29535 expression.eachChild(checkExpression);
29536 }
29537 };
29538 const expr = textField.value;
29539 if (expr._styleExpression) {
29540 checkExpression(expr._styleExpression.expression);
29541 }
29542 }
29543 return hasOverrides;
29544 }
29545}
29546function getOverlapMode(layout, overlapProp, allowOverlapProp) {
29547 let result = 'never';
29548 const overlap = layout.get(overlapProp);
29549 if (overlap) {
29550 // if -overlap is set, use it
29551 result = overlap;
29552 }
29553 else if (layout.get(allowOverlapProp)) {
29554 // fall back to -allow-overlap, with false='never', true='always'
29555 result = 'always';
29556 }
29557 return result;
29558}
29559
29560// This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
29561const paint$1 = new Properties({
29562 "background-color": new DataConstantProperty(spec["paint_background"]["background-color"]),
29563 "background-pattern": new CrossFadedProperty(spec["paint_background"]["background-pattern"]),
29564 "background-opacity": new DataConstantProperty(spec["paint_background"]["background-opacity"]),
29565});
29566var properties$1 = { paint: paint$1 };
29567
29568class BackgroundStyleLayer extends StyleLayer {
29569 constructor(layer) {
29570 super(layer, properties$1);
29571 }
29572}
29573
29574// This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
29575const paint = new Properties({
29576 "raster-opacity": new DataConstantProperty(spec["paint_raster"]["raster-opacity"]),
29577 "raster-hue-rotate": new DataConstantProperty(spec["paint_raster"]["raster-hue-rotate"]),
29578 "raster-brightness-min": new DataConstantProperty(spec["paint_raster"]["raster-brightness-min"]),
29579 "raster-brightness-max": new DataConstantProperty(spec["paint_raster"]["raster-brightness-max"]),
29580 "raster-saturation": new DataConstantProperty(spec["paint_raster"]["raster-saturation"]),
29581 "raster-contrast": new DataConstantProperty(spec["paint_raster"]["raster-contrast"]),
29582 "raster-resampling": new DataConstantProperty(spec["paint_raster"]["raster-resampling"]),
29583 "raster-fade-duration": new DataConstantProperty(spec["paint_raster"]["raster-fade-duration"]),
29584});
29585var properties = { paint };
29586
29587class RasterStyleLayer extends StyleLayer {
29588 constructor(layer) {
29589 super(layer, properties);
29590 }
29591}
29592
29593function validateCustomStyleLayer(layerObject) {
29594 const errors = [];
29595 const id = layerObject.id;
29596 if (id === undefined) {
29597 errors.push({
29598 message: `layers.${id}: missing required property "id"`
29599 });
29600 }
29601 if (layerObject.render === undefined) {
29602 errors.push({
29603 message: `layers.${id}: missing required method "render"`
29604 });
29605 }
29606 if (layerObject.renderingMode &&
29607 layerObject.renderingMode !== '2d' &&
29608 layerObject.renderingMode !== '3d') {
29609 errors.push({
29610 message: `layers.${id}: property "renderingMode" must be either "2d" or "3d"`
29611 });
29612 }
29613 return errors;
29614}
29615class CustomStyleLayer extends StyleLayer {
29616 constructor(implementation) {
29617 super(implementation, {});
29618 this.onAdd = (map) => {
29619 if (this.implementation.onAdd) {
29620 this.implementation.onAdd(map, map.painter.context.gl);
29621 }
29622 };
29623 this.onRemove = (map) => {
29624 if (this.implementation.onRemove) {
29625 this.implementation.onRemove(map, map.painter.context.gl);
29626 }
29627 };
29628 this.implementation = implementation;
29629 }
29630 is3D() {
29631 return this.implementation.renderingMode === '3d';
29632 }
29633 hasOffscreenPass() {
29634 return this.implementation.prerender !== undefined;
29635 }
29636 recalculate() { }
29637 updateTransitions() { }
29638 hasTransition() { return false; }
29639 serialize() {
29640 assert$1(false, 'Custom layers cannot be serialized');
29641 }
29642}
29643
29644const subclasses = {
29645 circle: CircleStyleLayer,
29646 heatmap: HeatmapStyleLayer,
29647 hillshade: HillshadeStyleLayer,
29648 fill: FillStyleLayer,
29649 'fill-extrusion': FillExtrusionStyleLayer,
29650 line: LineStyleLayer,
29651 symbol: SymbolStyleLayer,
29652 background: BackgroundStyleLayer,
29653 raster: RasterStyleLayer
29654};
29655function createStyleLayer(layer) {
29656 if (layer.type === 'custom') {
29657 return new CustomStyleLayer(layer);
29658 }
29659 else {
29660 return new subclasses[layer.type](layer);
29661 }
29662}
29663
29664/**
29665 * Invokes the wrapped function in a non-blocking way when trigger() is called. Invocation requests
29666 * are ignored until the function was actually invoked.
29667 *
29668 * @private
29669 */
29670class ThrottledInvoker {
29671 constructor(callback) {
29672 this._callback = callback;
29673 this._triggered = false;
29674 if (typeof MessageChannel !== 'undefined') {
29675 this._channel = new MessageChannel();
29676 this._channel.port2.onmessage = () => {
29677 this._triggered = false;
29678 this._callback();
29679 };
29680 }
29681 }
29682 trigger() {
29683 if (!this._triggered) {
29684 this._triggered = true;
29685 if (this._channel) {
29686 this._channel.port1.postMessage(true);
29687 }
29688 else {
29689 setTimeout(() => {
29690 this._triggered = false;
29691 this._callback();
29692 }, 0);
29693 }
29694 }
29695 }
29696 remove() {
29697 delete this._channel;
29698 this._callback = () => { };
29699 }
29700}
29701
29702/**
29703 * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model)
29704 * that maintains the relationship between asynchronous tasks and the objects
29705 * that spin them off - in this case, tasks like parsing parts of styles,
29706 * owned by the styles
29707 *
29708 * @param {WebWorker} target
29709 * @param {WebWorker} parent
29710 * @param {string|number} mapId A unique identifier for the Map instance using this Actor.
29711 * @private
29712 */
29713class Actor {
29714 constructor(target, parent, mapId) {
29715 this.target = target;
29716 this.parent = parent;
29717 this.mapId = mapId;
29718 this.callbacks = {};
29719 this.tasks = {};
29720 this.taskQueue = [];
29721 this.cancelCallbacks = {};
29722 bindAll(['receive', 'process'], this);
29723 this.invoker = new ThrottledInvoker(this.process);
29724 this.target.addEventListener('message', this.receive, false);
29725 this.globalScope = isWorker() ? target : window;
29726 }
29727 /**
29728 * Sends a message from a main-thread map to a Worker or from a Worker back to
29729 * a main-thread map instance.
29730 *
29731 * @param type The name of the target method to invoke or '[source-type].[source-name].name' for a method on a WorkerSource.
29732 * @param targetMapId A particular mapId to which to send this message.
29733 * @private
29734 */
29735 send(type, data, callback, targetMapId, mustQueue = false) {
29736 // We're using a string ID instead of numbers because they are being used as object keys
29737 // anyway, and thus stringified implicitly. We use random IDs because an actor may receive
29738 // message from multiple other actors which could run in different execution context. A
29739 // linearly increasing ID could produce collisions.
29740 const id = Math.round((Math.random() * 1e18)).toString(36).substring(0, 10);
29741 if (callback) {
29742 this.callbacks[id] = callback;
29743 }
29744 const buffers = isSafari(this.globalScope) ? undefined : [];
29745 this.target.postMessage({
29746 id,
29747 type,
29748 hasCallback: !!callback,
29749 targetMapId,
29750 mustQueue,
29751 sourceMapId: this.mapId,
29752 data: serialize(data, buffers)
29753 }, buffers);
29754 return {
29755 cancel: () => {
29756 if (callback) {
29757 // Set the callback to null so that it never fires after the request is aborted.
29758 delete this.callbacks[id];
29759 }
29760 this.target.postMessage({
29761 id,
29762 type: '<cancel>',
29763 targetMapId,
29764 sourceMapId: this.mapId
29765 });
29766 }
29767 };
29768 }
29769 receive(message) {
29770 const data = message.data, id = data.id;
29771 if (!id) {
29772 return;
29773 }
29774 if (data.targetMapId && this.mapId !== data.targetMapId) {
29775 return;
29776 }
29777 if (data.type === '<cancel>') {
29778 // Remove the original request from the queue. This is only possible if it
29779 // hasn't been kicked off yet. The id will remain in the queue, but because
29780 // there is no associated task, it will be dropped once it's time to execute it.
29781 delete this.tasks[id];
29782 const cancel = this.cancelCallbacks[id];
29783 delete this.cancelCallbacks[id];
29784 if (cancel) {
29785 cancel();
29786 }
29787 }
29788 else {
29789 if (isWorker() || data.mustQueue) {
29790 // In workers, store the tasks that we need to process before actually processing them. This
29791 // is necessary because we want to keep receiving messages, and in particular,
29792 // <cancel> messages. Some tasks may take a while in the worker thread, so before
29793 // executing the next task in our queue, postMessage preempts this and <cancel>
29794 // messages can be processed. We're using a MessageChannel object to get throttle the
29795 // process() flow to one at a time.
29796 this.tasks[id] = data;
29797 this.taskQueue.push(id);
29798 this.invoker.trigger();
29799 }
29800 else {
29801 // In the main thread, process messages immediately so that other work does not slip in
29802 // between getting partial data back from workers.
29803 this.processTask(id, data);
29804 }
29805 }
29806 }
29807 process() {
29808 if (!this.taskQueue.length) {
29809 return;
29810 }
29811 const id = this.taskQueue.shift();
29812 const task = this.tasks[id];
29813 delete this.tasks[id];
29814 // Schedule another process call if we know there's more to process _before_ invoking the
29815 // current task. This is necessary so that processing continues even if the current task
29816 // doesn't execute successfully.
29817 if (this.taskQueue.length) {
29818 this.invoker.trigger();
29819 }
29820 if (!task) {
29821 // If the task ID doesn't have associated task data anymore, it was canceled.
29822 return;
29823 }
29824 this.processTask(id, task);
29825 }
29826 processTask(id, task) {
29827 if (task.type === '<response>') {
29828 // The done() function in the counterpart has been called, and we are now
29829 // firing the callback in the originating actor, if there is one.
29830 const callback = this.callbacks[id];
29831 delete this.callbacks[id];
29832 if (callback) {
29833 // If we get a response, but don't have a callback, the request was canceled.
29834 if (task.error) {
29835 callback(deserialize(task.error));
29836 }
29837 else {
29838 callback(null, deserialize(task.data));
29839 }
29840 }
29841 }
29842 else {
29843 let completed = false;
29844 const buffers = isSafari(this.globalScope) ? undefined : [];
29845 const done = task.hasCallback ? (err, data) => {
29846 completed = true;
29847 delete this.cancelCallbacks[id];
29848 this.target.postMessage({
29849 id,
29850 type: '<response>',
29851 sourceMapId: this.mapId,
29852 error: err ? serialize(err) : null,
29853 data: serialize(data, buffers)
29854 }, buffers);
29855 } : (_) => {
29856 completed = true;
29857 };
29858 let callback = null;
29859 const params = deserialize(task.data);
29860 if (this.parent[task.type]) {
29861 // task.type == 'loadTile', 'removeTile', etc.
29862 callback = this.parent[task.type](task.sourceMapId, params, done);
29863 }
29864 else if (this.parent.getWorkerSource) {
29865 // task.type == sourcetype.method
29866 const keys = task.type.split('.');
29867 const scope = this.parent.getWorkerSource(task.sourceMapId, keys[0], params.source);
29868 callback = scope[keys[1]](params, done);
29869 }
29870 else {
29871 // No function was found.
29872 done(new Error(`Could not find function ${task.type}`));
29873 }
29874 if (!completed && callback && callback.cancel) {
29875 // Allows canceling the task as long as it hasn't been completed yet.
29876 this.cancelCallbacks[id] = callback.cancel;
29877 }
29878 }
29879 }
29880 remove() {
29881 this.invoker.remove();
29882 this.target.removeEventListener('message', this.receive, false);
29883 }
29884}
29885
29886/*
29887* Approximate radius of the earth in meters.
29888* Uses the WGS-84 approximation. The radius at the equator is ~6378137 and at the poles is ~6356752. https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84
29889* 6371008.8 is one published "average radius" see https://en.wikipedia.org/wiki/Earth_radius#Mean_radius, or ftp://athena.fsv.cvut.cz/ZFG/grs80-Moritz.pdf p.4
29890*/
29891const earthRadius = 6371008.8;
29892/**
29893 * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees.
29894 * These coordinates are based on the [WGS84 (EPSG:4326) standard](https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84).
29895 *
29896 * MapLibre GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match the
29897 * [GeoJSON specification](https://tools.ietf.org/html/rfc7946).
29898 *
29899 * Note that any MapLibre GL method that accepts a `LngLat` object as an argument or option
29900 * can also accept an `Array` of two numbers and will perform an implicit conversion.
29901 * This flexible type is documented as {@link LngLatLike}.
29902 *
29903 * @param {number} lng Longitude, measured in degrees.
29904 * @param {number} lat Latitude, measured in degrees.
29905 * @example
29906 * var ll = new maplibregl.LngLat(-123.9749, 40.7736);
29907 * ll.lng; // = -123.9749
29908 * @see [Get coordinates of the mouse pointer](https://maplibre.org/maplibre-gl-js-docs/example/mouse-position/)
29909 * @see [Display a popup](https://maplibre.org/maplibre-gl-js-docs/example/popup/)
29910 * @see [Create a timeline animation](https://maplibre.org/maplibre-gl-js-docs/example/timeline-animation/)
29911 */
29912class LngLat {
29913 constructor(lng, lat) {
29914 if (isNaN(lng) || isNaN(lat)) {
29915 throw new Error(`Invalid LngLat object: (${lng}, ${lat})`);
29916 }
29917 this.lng = +lng;
29918 this.lat = +lat;
29919 if (this.lat > 90 || this.lat < -90) {
29920 throw new Error('Invalid LngLat latitude value: must be between -90 and 90');
29921 }
29922 }
29923 /**
29924 * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180).
29925 *
29926 * @returns {LngLat} The wrapped `LngLat` object.
29927 * @example
29928 * var ll = new maplibregl.LngLat(286.0251, 40.7736);
29929 * var wrapped = ll.wrap();
29930 * wrapped.lng; // = -73.9749
29931 */
29932 wrap() {
29933 return new LngLat(wrap(this.lng, -180, 180), this.lat);
29934 }
29935 /**
29936 * Returns the coordinates represented as an array of two numbers.
29937 *
29938 * @returns {Array<number>} The coordinates represeted as an array of longitude and latitude.
29939 * @example
29940 * var ll = new maplibregl.LngLat(-73.9749, 40.7736);
29941 * ll.toArray(); // = [-73.9749, 40.7736]
29942 */
29943 toArray() {
29944 return [this.lng, this.lat];
29945 }
29946 /**
29947 * Returns the coordinates represent as a string.
29948 *
29949 * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`.
29950 * @example
29951 * var ll = new maplibregl.LngLat(-73.9749, 40.7736);
29952 * ll.toString(); // = "LngLat(-73.9749, 40.7736)"
29953 */
29954 toString() {
29955 return `LngLat(${this.lng}, ${this.lat})`;
29956 }
29957 /**
29958 * Returns the approximate distance between a pair of coordinates in meters
29959 * Uses the Haversine Formula (from R.W. Sinnott, "Virtues of the Haversine", Sky and Telescope, vol. 68, no. 2, 1984, p. 159)
29960 *
29961 * @param {LngLat} lngLat coordinates to compute the distance to
29962 * @returns {number} Distance in meters between the two coordinates.
29963 * @example
29964 * var new_york = new maplibregl.LngLat(-74.0060, 40.7128);
29965 * var los_angeles = new maplibregl.LngLat(-118.2437, 34.0522);
29966 * new_york.distanceTo(los_angeles); // = 3935751.690893987, "true distance" using a non-spherical approximation is ~3966km
29967 */
29968 distanceTo(lngLat) {
29969 const rad = Math.PI / 180;
29970 const lat1 = this.lat * rad;
29971 const lat2 = lngLat.lat * rad;
29972 const a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((lngLat.lng - this.lng) * rad);
29973 const maxMeters = earthRadius * Math.acos(Math.min(a, 1));
29974 return maxMeters;
29975 }
29976 /**
29977 * Returns a `LngLatBounds` from the coordinates extended by a given `radius`. The returned `LngLatBounds` completely contains the `radius`.
29978 *
29979 * @param {number} [radius=0] Distance in meters from the coordinates to extend the bounds.
29980 * @returns {LngLatBounds} A new `LngLatBounds` object representing the coordinates extended by the `radius`.
29981 * @example
29982 * var ll = new maplibregl.LngLat(-73.9749, 40.7736);
29983 * ll.toBounds(100).toArray(); // = [[-73.97501862141328, 40.77351016847229], [-73.97478137858673, 40.77368983152771]]
29984 */
29985 toBounds(radius = 0) {
29986 const earthCircumferenceInMetersAtEquator = 40075017;
29987 const latAccuracy = 360 * radius / earthCircumferenceInMetersAtEquator, lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);
29988 return new LngLatBounds$1(new LngLat(this.lng - lngAccuracy, this.lat - latAccuracy), new LngLat(this.lng + lngAccuracy, this.lat + latAccuracy));
29989 }
29990 /**
29991 * Converts an array of two numbers or an object with `lng` and `lat` or `lon` and `lat` properties
29992 * to a `LngLat` object.
29993 *
29994 * If a `LngLat` object is passed in, the function returns it unchanged.
29995 *
29996 * @param {LngLatLike} input An array of two numbers or object to convert, or a `LngLat` object to return.
29997 * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object.
29998 * @example
29999 * var arr = [-73.9749, 40.7736];
30000 * var ll = maplibregl.LngLat.convert(arr);
30001 * ll; // = LngLat {lng: -73.9749, lat: 40.7736}
30002 */
30003 static convert(input) {
30004 if (input instanceof LngLat) {
30005 return input;
30006 }
30007 if (Array.isArray(input) && (input.length === 2 || input.length === 3)) {
30008 return new LngLat(Number(input[0]), Number(input[1]));
30009 }
30010 if (!Array.isArray(input) && typeof input === 'object' && input !== null) {
30011 return new LngLat(
30012 // flow can't refine this to have one of lng or lat, so we have to cast to any
30013 Number('lng' in input ? input.lng : input.lon), Number(input.lat));
30014 }
30015 throw new Error('`LngLatLike` argument must be specified as a LngLat instance, an object {lng: <lng>, lat: <lat>}, an object {lon: <lng>, lat: <lat>}, or an array of [<lng>, <lat>]');
30016 }
30017}
30018
30019/**
30020 * A `LngLatBounds` object represents a geographical bounding box,
30021 * defined by its southwest and northeast points in longitude and latitude.
30022 *
30023 * If no arguments are provided to the constructor, a `null` bounding box is created.
30024 *
30025 * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option
30026 * can also accept an `Array` of two {@link LngLatLike} constructs and will perform an implicit conversion.
30027 * This flexible type is documented as {@link LngLatBoundsLike}.
30028 *
30029 * @param {LngLatLike} [sw] The southwest corner of the bounding box.
30030 * @param {LngLatLike} [ne] The northeast corner of the bounding box.
30031 * @example
30032 * var sw = new maplibregl.LngLat(-73.9876, 40.7661);
30033 * var ne = new maplibregl.LngLat(-73.9397, 40.8002);
30034 * var llb = new maplibregl.LngLatBounds(sw, ne);
30035 */
30036class LngLatBounds {
30037 // This constructor is too flexible to type. It should not be so flexible.
30038 constructor(sw, ne) {
30039 if (!sw) {
30040 // noop
30041 }
30042 else if (ne) {
30043 this.setSouthWest(sw).setNorthEast(ne);
30044 }
30045 else if (sw.length === 4) {
30046 this.setSouthWest([sw[0], sw[1]]).setNorthEast([sw[2], sw[3]]);
30047 }
30048 else {
30049 this.setSouthWest(sw[0]).setNorthEast(sw[1]);
30050 }
30051 }
30052 /**
30053 * Set the northeast corner of the bounding box
30054 *
30055 * @param {LngLatLike} ne a {@link LngLatLike} object describing the northeast corner of the bounding box.
30056 * @returns {LngLatBounds} `this`
30057 */
30058 setNorthEast(ne) {
30059 this._ne = ne instanceof LngLat ? new LngLat(ne.lng, ne.lat) : LngLat.convert(ne);
30060 return this;
30061 }
30062 /**
30063 * Set the southwest corner of the bounding box
30064 *
30065 * @param {LngLatLike} sw a {@link LngLatLike} object describing the southwest corner of the bounding box.
30066 * @returns {LngLatBounds} `this`
30067 */
30068 setSouthWest(sw) {
30069 this._sw = sw instanceof LngLat ? new LngLat(sw.lng, sw.lat) : LngLat.convert(sw);
30070 return this;
30071 }
30072 /**
30073 * Extend the bounds to include a given LngLatLike or LngLatBoundsLike.
30074 *
30075 * @param {LngLatLike|LngLatBoundsLike} obj object to extend to
30076 * @returns {LngLatBounds} `this`
30077 */
30078 extend(obj) {
30079 const sw = this._sw, ne = this._ne;
30080 let sw2, ne2;
30081 if (obj instanceof LngLat) {
30082 sw2 = obj;
30083 ne2 = obj;
30084 }
30085 else if (obj instanceof LngLatBounds) {
30086 sw2 = obj._sw;
30087 ne2 = obj._ne;
30088 if (!sw2 || !ne2)
30089 return this;
30090 }
30091 else {
30092 if (Array.isArray(obj)) {
30093 if (obj.length === 4 || obj.every(Array.isArray)) {
30094 const lngLatBoundsObj = obj;
30095 return this.extend(LngLatBounds.convert(lngLatBoundsObj));
30096 }
30097 else {
30098 const lngLatObj = obj;
30099 return this.extend(LngLat.convert(lngLatObj));
30100 }
30101 }
30102 return this;
30103 }
30104 if (!sw && !ne) {
30105 this._sw = new LngLat(sw2.lng, sw2.lat);
30106 this._ne = new LngLat(ne2.lng, ne2.lat);
30107 }
30108 else {
30109 sw.lng = Math.min(sw2.lng, sw.lng);
30110 sw.lat = Math.min(sw2.lat, sw.lat);
30111 ne.lng = Math.max(ne2.lng, ne.lng);
30112 ne.lat = Math.max(ne2.lat, ne.lat);
30113 }
30114 return this;
30115 }
30116 /**
30117 * Returns the geographical coordinate equidistant from the bounding box's corners.
30118 *
30119 * @returns {LngLat} The bounding box's center.
30120 * @example
30121 * var llb = new maplibregl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);
30122 * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315}
30123 */
30124 getCenter() {
30125 return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2);
30126 }
30127 /**
30128 * Returns the southwest corner of the bounding box.
30129 *
30130 * @returns {LngLat} The southwest corner of the bounding box.
30131 */
30132 getSouthWest() { return this._sw; }
30133 /**
30134 * Returns the northeast corner of the bounding box.
30135 *
30136 * @returns {LngLat} The northeast corner of the bounding box.
30137 */
30138 getNorthEast() { return this._ne; }
30139 /**
30140 * Returns the northwest corner of the bounding box.
30141 *
30142 * @returns {LngLat} The northwest corner of the bounding box.
30143 */
30144 getNorthWest() { return new LngLat(this.getWest(), this.getNorth()); }
30145 /**
30146 * Returns the southeast corner of the bounding box.
30147 *
30148 * @returns {LngLat} The southeast corner of the bounding box.
30149 */
30150 getSouthEast() { return new LngLat(this.getEast(), this.getSouth()); }
30151 /**
30152 * Returns the west edge of the bounding box.
30153 *
30154 * @returns {number} The west edge of the bounding box.
30155 */
30156 getWest() { return this._sw.lng; }
30157 /**
30158 * Returns the south edge of the bounding box.
30159 *
30160 * @returns {number} The south edge of the bounding box.
30161 */
30162 getSouth() { return this._sw.lat; }
30163 /**
30164 * Returns the east edge of the bounding box.
30165 *
30166 * @returns {number} The east edge of the bounding box.
30167 */
30168 getEast() { return this._ne.lng; }
30169 /**
30170 * Returns the north edge of the bounding box.
30171 *
30172 * @returns {number} The north edge of the bounding box.
30173 */
30174 getNorth() { return this._ne.lat; }
30175 /**
30176 * Returns the bounding box represented as an array.
30177 *
30178 * @returns {Array<Array<number>>} The bounding box represented as an array, consisting of the
30179 * southwest and northeast coordinates of the bounding represented as arrays of numbers.
30180 * @example
30181 * var llb = new maplibregl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);
30182 * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]]
30183 */
30184 toArray() {
30185 return [this._sw.toArray(), this._ne.toArray()];
30186 }
30187 /**
30188 * Return the bounding box represented as a string.
30189 *
30190 * @returns {string} The bounding box represents as a string of the format
30191 * `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`.
30192 * @example
30193 * var llb = new maplibregl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);
30194 * llb.toString(); // = "LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))"
30195 */
30196 toString() {
30197 return `LngLatBounds(${this._sw.toString()}, ${this._ne.toString()})`;
30198 }
30199 /**
30200 * Check if the bounding box is an empty/`null`-type box.
30201 *
30202 * @returns {boolean} True if bounds have been defined, otherwise false.
30203 */
30204 isEmpty() {
30205 return !(this._sw && this._ne);
30206 }
30207 /**
30208 * Check if the point is within the bounding box.
30209 *
30210 * @param {LngLatLike} lnglat geographic point to check against.
30211 * @returns {boolean} True if the point is within the bounding box.
30212 * @example
30213 * var llb = new maplibregl.LngLatBounds(
30214 * new maplibregl.LngLat(-73.9876, 40.7661),
30215 * new maplibregl.LngLat(-73.9397, 40.8002)
30216 * );
30217 *
30218 * var ll = new maplibregl.LngLat(-73.9567, 40.7789);
30219 *
30220 * console.log(llb.contains(ll)); // = true
30221 */
30222 contains(lnglat) {
30223 const { lng, lat } = LngLat.convert(lnglat);
30224 const containsLatitude = this._sw.lat <= lat && lat <= this._ne.lat;
30225 let containsLongitude = this._sw.lng <= lng && lng <= this._ne.lng;
30226 if (this._sw.lng > this._ne.lng) { // wrapped coordinates
30227 containsLongitude = this._sw.lng >= lng && lng >= this._ne.lng;
30228 }
30229 return containsLatitude && containsLongitude;
30230 }
30231 /**
30232 * Converts an array to a `LngLatBounds` object.
30233 *
30234 * If a `LngLatBounds` object is passed in, the function returns it unchanged.
30235 *
30236 * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values.
30237 *
30238 * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return.
30239 * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object.
30240 * @example
30241 * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]];
30242 * var llb = maplibregl.LngLatBounds.convert(arr);
30243 * llb; // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}}
30244 */
30245 static convert(input) {
30246 if (input instanceof LngLatBounds)
30247 return input;
30248 if (!input)
30249 return input;
30250 return new LngLatBounds(input);
30251 }
30252}
30253var LngLatBounds$1 = LngLatBounds;
30254
30255/*
30256 * The average circumference of the world in meters.
30257 */
30258const earthCircumfrence = 2 * Math.PI * earthRadius; // meters
30259/*
30260 * The circumference at a line of latitude in meters.
30261 */
30262function circumferenceAtLatitude(latitude) {
30263 return earthCircumfrence * Math.cos(latitude * Math.PI / 180);
30264}
30265function mercatorXfromLng(lng) {
30266 return (180 + lng) / 360;
30267}
30268function mercatorYfromLat(lat) {
30269 return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360;
30270}
30271function mercatorZfromAltitude(altitude, lat) {
30272 return altitude / circumferenceAtLatitude(lat);
30273}
30274function lngFromMercatorX(x) {
30275 return x * 360 - 180;
30276}
30277function latFromMercatorY(y) {
30278 const y2 = 180 - y * 360;
30279 return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90;
30280}
30281function altitudeFromMercatorZ(z, y) {
30282 return z * circumferenceAtLatitude(latFromMercatorY(y));
30283}
30284/**
30285 * Determine the Mercator scale factor for a given latitude, see
30286 * https://en.wikipedia.org/wiki/Mercator_projection#Scale_factor
30287 *
30288 * At the equator the scale factor will be 1, which increases at higher latitudes.
30289 *
30290 * @param {number} lat Latitude
30291 * @returns {number} scale factor
30292 * @private
30293 */
30294function mercatorScale(lat) {
30295 return 1 / Math.cos(lat * Math.PI / 180);
30296}
30297/**
30298 * A `MercatorCoordinate` object represents a projected three dimensional position.
30299 *
30300 * `MercatorCoordinate` uses the web mercator projection ([EPSG:3857](https://epsg.io/3857)) with slightly different units:
30301 * - the size of 1 unit is the width of the projected world instead of the "mercator meter"
30302 * - the origin of the coordinate space is at the north-west corner instead of the middle
30303 *
30304 * For example, `MercatorCoordinate(0, 0, 0)` is the north-west corner of the mercator world and
30305 * `MercatorCoordinate(1, 1, 0)` is the south-east corner. If you are familiar with
30306 * [vector tiles](https://github.com/mapbox/vector-tile-spec) it may be helpful to think
30307 * of the coordinate space as the `0/0/0` tile with an extent of `1`.
30308 *
30309 * The `z` dimension of `MercatorCoordinate` is conformal. A cube in the mercator coordinate space would be rendered as a cube.
30310 *
30311 * @param {number} x The x component of the position.
30312 * @param {number} y The y component of the position.
30313 * @param {number} z The z component of the position.
30314 * @example
30315 * var nullIsland = new maplibregl.MercatorCoordinate(0.5, 0.5, 0);
30316 *
30317 * @see [Add a custom style layer](https://maplibre.org/maplibre-gl-js-docs/example/custom-style-layer/)
30318 */
30319class MercatorCoordinate {
30320 constructor(x, y, z = 0) {
30321 this.x = +x;
30322 this.y = +y;
30323 this.z = +z;
30324 }
30325 /**
30326 * Project a `LngLat` to a `MercatorCoordinate`.
30327 *
30328 * @param {LngLatLike} lngLatLike The location to project.
30329 * @param {number} altitude The altitude in meters of the position.
30330 * @returns {MercatorCoordinate} The projected mercator coordinate.
30331 * @example
30332 * var coord = maplibregl.MercatorCoordinate.fromLngLat({ lng: 0, lat: 0}, 0);
30333 * coord; // MercatorCoordinate(0.5, 0.5, 0)
30334 */
30335 static fromLngLat(lngLatLike, altitude = 0) {
30336 const lngLat = LngLat.convert(lngLatLike);
30337 return new MercatorCoordinate(mercatorXfromLng(lngLat.lng), mercatorYfromLat(lngLat.lat), mercatorZfromAltitude(altitude, lngLat.lat));
30338 }
30339 /**
30340 * Returns the `LngLat` for the coordinate.
30341 *
30342 * @returns {LngLat} The `LngLat` object.
30343 * @example
30344 * var coord = new maplibregl.MercatorCoordinate(0.5, 0.5, 0);
30345 * var lngLat = coord.toLngLat(); // LngLat(0, 0)
30346 */
30347 toLngLat() {
30348 return new LngLat(lngFromMercatorX(this.x), latFromMercatorY(this.y));
30349 }
30350 /**
30351 * Returns the altitude in meters of the coordinate.
30352 *
30353 * @returns {number} The altitude in meters.
30354 * @example
30355 * var coord = new maplibregl.MercatorCoordinate(0, 0, 0.02);
30356 * coord.toAltitude(); // 6914.281956295339
30357 */
30358 toAltitude() {
30359 return altitudeFromMercatorZ(this.z, this.y);
30360 }
30361 /**
30362 * Returns the distance of 1 meter in `MercatorCoordinate` units at this latitude.
30363 *
30364 * For coordinates in real world units using meters, this naturally provides the scale
30365 * to transform into `MercatorCoordinate`s.
30366 *
30367 * @returns {number} Distance of 1 meter in `MercatorCoordinate` units.
30368 */
30369 meterInMercatorCoordinateUnits() {
30370 // 1 meter / circumference at equator in meters * Mercator projection scale factor at this latitude
30371 return 1 / earthCircumfrence * mercatorScale(latFromMercatorY(this.y));
30372 }
30373}
30374
30375/**
30376 * getURL
30377 *
30378 * @param {String} baseUrl Base url of the WMS server
30379 * @param {String} layer Layer name
30380 * @param {Number} x Tile coordinate x
30381 * @param {Number} y Tile coordinate y
30382 * @param {Number} z Tile zoom
30383 * @param {Object} [options]
30384 * @param {String} [options.format='image/png']
30385 * @param {String} [options.service='WMS']
30386 * @param {String} [options.version='1.1.1']
30387 * @param {String} [options.request='GetMap']
30388 * @param {String} [options.srs='EPSG:3857']
30389 * @param {Number} [options.width='256']
30390 * @param {Number} [options.height='256']
30391 * @returns {String} url
30392 * @example
30393 * var baseUrl = 'http://geodata.state.nj.us/imagerywms/Natural2015';
30394 * var layer = 'Natural2015';
30395 * var url = whoots.getURL(baseUrl, layer, 154308, 197167, 19);
30396 */
30397function getURL(baseUrl, layer, x, y, z, options) {
30398 options = options || {};
30399
30400 var url = baseUrl + '?' + [
30401 'bbox=' + getTileBBox(x, y, z),
30402 'format=' + (options.format || 'image/png'),
30403 'service=' + (options.service || 'WMS'),
30404 'version=' + (options.version || '1.1.1'),
30405 'request=' + (options.request || 'GetMap'),
30406 'srs=' + (options.srs || 'EPSG:3857'),
30407 'width=' + (options.width || 256),
30408 'height=' + (options.height || 256),
30409 'layers=' + layer
30410 ].join('&');
30411
30412 return url;
30413}
30414
30415
30416/**
30417 * getTileBBox
30418 *
30419 * @param {Number} x Tile coordinate x
30420 * @param {Number} y Tile coordinate y
30421 * @param {Number} z Tile zoom
30422 * @returns {String} String of the bounding box
30423 */
30424function getTileBBox(x, y, z) {
30425 // for Google/OSM tile scheme we need to alter the y
30426 y = (Math.pow(2, z) - y - 1);
30427
30428 var min = getMercCoords(x * 256, y * 256, z),
30429 max = getMercCoords((x + 1) * 256, (y + 1) * 256, z);
30430
30431 return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1];
30432}
30433
30434
30435/**
30436 * getMercCoords
30437 *
30438 * @param {Number} x Pixel coordinate x
30439 * @param {Number} y Pixel coordinate y
30440 * @param {Number} z Tile zoom
30441 * @returns {Array} [x, y]
30442 */
30443function getMercCoords(x, y, z) {
30444 var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z),
30445 merc_x = (x * resolution - 2 * Math.PI * 6378137 / 2.0),
30446 merc_y = (y * resolution - 2 * Math.PI * 6378137 / 2.0);
30447
30448 return [merc_x, merc_y];
30449}
30450
30451class CanonicalTileID {
30452 constructor(z, x, y) {
30453 assert$1(z >= 0 && z <= 25);
30454 assert$1(x >= 0 && x < Math.pow(2, z));
30455 assert$1(y >= 0 && y < Math.pow(2, z));
30456 this.z = z;
30457 this.x = x;
30458 this.y = y;
30459 this.key = calculateKey(0, z, z, x, y);
30460 }
30461 equals(id) {
30462 return this.z === id.z && this.x === id.x && this.y === id.y;
30463 }
30464 // given a list of urls, choose a url template and return a tile URL
30465 url(urls, pixelRatio, scheme) {
30466 const bbox = getTileBBox(this.x, this.y, this.z);
30467 const quadkey = getQuadkey(this.z, this.x, this.y);
30468 return urls[(this.x + this.y) % urls.length]
30469 .replace(/{prefix}/g, (this.x % 16).toString(16) + (this.y % 16).toString(16))
30470 .replace(/{z}/g, String(this.z))
30471 .replace(/{x}/g, String(this.x))
30472 .replace(/{y}/g, String(scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y))
30473 .replace(/{ratio}/g, pixelRatio > 1 ? '@2x' : '')
30474 .replace(/{quadkey}/g, quadkey)
30475 .replace(/{bbox-epsg-3857}/g, bbox);
30476 }
30477 getTilePoint(coord) {
30478 const tilesAtZoom = Math.pow(2, this.z);
30479 return new pointGeometry((coord.x * tilesAtZoom - this.x) * EXTENT, (coord.y * tilesAtZoom - this.y) * EXTENT);
30480 }
30481 toString() {
30482 return `${this.z}/${this.x}/${this.y}`;
30483 }
30484}
30485class UnwrappedTileID {
30486 constructor(wrap, canonical) {
30487 this.wrap = wrap;
30488 this.canonical = canonical;
30489 this.key = calculateKey(wrap, canonical.z, canonical.z, canonical.x, canonical.y);
30490 }
30491}
30492class OverscaledTileID {
30493 constructor(overscaledZ, wrap, z, x, y) {
30494 assert$1(overscaledZ >= z);
30495 this.overscaledZ = overscaledZ;
30496 this.wrap = wrap;
30497 this.canonical = new CanonicalTileID(z, +x, +y);
30498 this.key = calculateKey(wrap, overscaledZ, z, x, y);
30499 }
30500 equals(id) {
30501 return this.overscaledZ === id.overscaledZ && this.wrap === id.wrap && this.canonical.equals(id.canonical);
30502 }
30503 scaledTo(targetZ) {
30504 assert$1(targetZ <= this.overscaledZ);
30505 const zDifference = this.canonical.z - targetZ;
30506 if (targetZ > this.canonical.z) {
30507 return new OverscaledTileID(targetZ, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y);
30508 }
30509 else {
30510 return new OverscaledTileID(targetZ, this.wrap, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference);
30511 }
30512 }
30513 /*
30514 * calculateScaledKey is an optimization:
30515 * when withWrap == true, implements the same as this.scaledTo(z).key,
30516 * when withWrap == false, implements the same as this.scaledTo(z).wrapped().key.
30517 */
30518 calculateScaledKey(targetZ, withWrap) {
30519 assert$1(targetZ <= this.overscaledZ);
30520 const zDifference = this.canonical.z - targetZ;
30521 if (targetZ > this.canonical.z) {
30522 return calculateKey(this.wrap * +withWrap, targetZ, this.canonical.z, this.canonical.x, this.canonical.y);
30523 }
30524 else {
30525 return calculateKey(this.wrap * +withWrap, targetZ, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference);
30526 }
30527 }
30528 isChildOf(parent) {
30529 if (parent.wrap !== this.wrap) {
30530 // We can't be a child if we're in a different world copy
30531 return false;
30532 }
30533 const zDifference = this.canonical.z - parent.canonical.z;
30534 // We're first testing for z == 0, to avoid a 32 bit shift, which is undefined.
30535 return parent.overscaledZ === 0 || (parent.overscaledZ < this.overscaledZ &&
30536 parent.canonical.x === (this.canonical.x >> zDifference) &&
30537 parent.canonical.y === (this.canonical.y >> zDifference));
30538 }
30539 children(sourceMaxZoom) {
30540 if (this.overscaledZ >= sourceMaxZoom) {
30541 // return a single tile coord representing a an overscaled tile
30542 return [new OverscaledTileID(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y)];
30543 }
30544 const z = this.canonical.z + 1;
30545 const x = this.canonical.x * 2;
30546 const y = this.canonical.y * 2;
30547 return [
30548 new OverscaledTileID(z, this.wrap, z, x, y),
30549 new OverscaledTileID(z, this.wrap, z, x + 1, y),
30550 new OverscaledTileID(z, this.wrap, z, x, y + 1),
30551 new OverscaledTileID(z, this.wrap, z, x + 1, y + 1)
30552 ];
30553 }
30554 isLessThan(rhs) {
30555 if (this.wrap < rhs.wrap)
30556 return true;
30557 if (this.wrap > rhs.wrap)
30558 return false;
30559 if (this.overscaledZ < rhs.overscaledZ)
30560 return true;
30561 if (this.overscaledZ > rhs.overscaledZ)
30562 return false;
30563 if (this.canonical.x < rhs.canonical.x)
30564 return true;
30565 if (this.canonical.x > rhs.canonical.x)
30566 return false;
30567 if (this.canonical.y < rhs.canonical.y)
30568 return true;
30569 return false;
30570 }
30571 wrapped() {
30572 return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y);
30573 }
30574 unwrapTo(wrap) {
30575 return new OverscaledTileID(this.overscaledZ, wrap, this.canonical.z, this.canonical.x, this.canonical.y);
30576 }
30577 overscaleFactor() {
30578 return Math.pow(2, this.overscaledZ - this.canonical.z);
30579 }
30580 toUnwrapped() {
30581 return new UnwrappedTileID(this.wrap, this.canonical);
30582 }
30583 toString() {
30584 return `${this.overscaledZ}/${this.canonical.x}/${this.canonical.y}`;
30585 }
30586 getTilePoint(coord) {
30587 return this.canonical.getTilePoint(new MercatorCoordinate(coord.x - this.wrap, coord.y));
30588 }
30589}
30590function calculateKey(wrap, overscaledZ, z, x, y) {
30591 wrap *= 2;
30592 if (wrap < 0)
30593 wrap = wrap * -1 - 1;
30594 const dim = 1 << z;
30595 return (dim * dim * wrap + dim * y + x).toString(36) + z.toString(36) + overscaledZ.toString(36);
30596}
30597function getQuadkey(z, x, y) {
30598 let quadkey = '', mask;
30599 for (let i = z; i > 0; i--) {
30600 mask = 1 << (i - 1);
30601 quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0));
30602 }
30603 return quadkey;
30604}
30605register('CanonicalTileID', CanonicalTileID);
30606register('OverscaledTileID', OverscaledTileID, { omit: ['posMatrix'] });
30607
30608// DEMData is a data structure for decoding, backfilling, and storing elevation data for processing in the hillshade shaders
30609// data can be populated either from a pngraw image tile or from serliazed data sent back from a worker. When data is initially
30610// loaded from a image tile, we decode the pixel values using the appropriate decoding formula, but we store the
30611// elevation data as an Int32 value. we add 65536 (2^16) to eliminate negative values and enable the use of
30612// integer overflow when creating the texture used in the hillshadePrepare step.
30613// DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8
30614// surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a
30615// tile's edge without backfilling from neighboring tiles.
30616class DEMData {
30617 // RGBAImage data has uniform 1px padding on all sides: square tile edge size defines stride
30618 // and dim is calculated as stride - 2.
30619 constructor(uid, data, encoding) {
30620 this.uid = uid;
30621 if (data.height !== data.width)
30622 throw new RangeError('DEM tiles must be square');
30623 if (encoding && encoding !== 'mapbox' && encoding !== 'terrarium') {
30624 warnOnce(`"${encoding}" is not a valid encoding type. Valid types include "mapbox" and "terrarium".`);
30625 return;
30626 }
30627 this.stride = data.height;
30628 const dim = this.dim = data.height - 2;
30629 this.data = new Uint32Array(data.data.buffer);
30630 this.encoding = encoding || 'mapbox';
30631 // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image
30632 // with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring
30633 // tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder
30634 for (let x = 0; x < dim; x++) {
30635 // left vertical border
30636 this.data[this._idx(-1, x)] = this.data[this._idx(0, x)];
30637 // right vertical border
30638 this.data[this._idx(dim, x)] = this.data[this._idx(dim - 1, x)];
30639 // left horizontal border
30640 this.data[this._idx(x, -1)] = this.data[this._idx(x, 0)];
30641 // right horizontal border
30642 this.data[this._idx(x, dim)] = this.data[this._idx(x, dim - 1)];
30643 }
30644 // corners
30645 this.data[this._idx(-1, -1)] = this.data[this._idx(0, 0)];
30646 this.data[this._idx(dim, -1)] = this.data[this._idx(dim - 1, 0)];
30647 this.data[this._idx(-1, dim)] = this.data[this._idx(0, dim - 1)];
30648 this.data[this._idx(dim, dim)] = this.data[this._idx(dim - 1, dim - 1)];
30649 }
30650 get(x, y) {
30651 const pixels = new Uint8Array(this.data.buffer);
30652 const index = this._idx(x, y) * 4;
30653 const unpack = this.encoding === 'terrarium' ? this._unpackTerrarium : this._unpackMapbox;
30654 return unpack(pixels[index], pixels[index + 1], pixels[index + 2]);
30655 }
30656 getUnpackVector() {
30657 return this.encoding === 'terrarium' ? [256.0, 1.0, 1.0 / 256.0, 32768.0] : [6553.6, 25.6, 0.1, 10000.0];
30658 }
30659 _idx(x, y) {
30660 if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1)
30661 throw new RangeError('out of range source coordinates for DEM data');
30662 return (y + 1) * this.stride + (x + 1);
30663 }
30664 _unpackMapbox(r, g, b) {
30665 // unpacking formula for mapbox.terrain-rgb:
30666 // https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb
30667 return ((r * 256 * 256 + g * 256.0 + b) / 10.0 - 10000.0);
30668 }
30669 _unpackTerrarium(r, g, b) {
30670 // unpacking formula for mapzen terrarium:
30671 // https://aws.amazon.com/public-datasets/terrain/
30672 return ((r * 256 + g + b / 256) - 32768.0);
30673 }
30674 getPixels() {
30675 return new RGBAImage({ width: this.stride, height: this.stride }, new Uint8Array(this.data.buffer));
30676 }
30677 backfillBorder(borderTile, dx, dy) {
30678 if (this.dim !== borderTile.dim)
30679 throw new Error('dem dimension mismatch');
30680 let xMin = dx * this.dim, xMax = dx * this.dim + this.dim, yMin = dy * this.dim, yMax = dy * this.dim + this.dim;
30681 switch (dx) {
30682 case -1:
30683 xMin = xMax - 1;
30684 break;
30685 case 1:
30686 xMax = xMin + 1;
30687 break;
30688 }
30689 switch (dy) {
30690 case -1:
30691 yMin = yMax - 1;
30692 break;
30693 case 1:
30694 yMax = yMin + 1;
30695 break;
30696 }
30697 const ox = -dx * this.dim;
30698 const oy = -dy * this.dim;
30699 for (let y = yMin; y < yMax; y++) {
30700 for (let x = xMin; x < xMax; x++) {
30701 this.data[this._idx(x, y)] = borderTile.data[this._idx(x + ox, y + oy)];
30702 }
30703 }
30704 }
30705}
30706register('DEMData', DEMData);
30707
30708class DictionaryCoder {
30709 constructor(strings) {
30710 this._stringToNumber = {};
30711 this._numberToString = [];
30712 for (let i = 0; i < strings.length; i++) {
30713 const string = strings[i];
30714 this._stringToNumber[string] = i;
30715 this._numberToString[i] = string;
30716 }
30717 }
30718 encode(string) {
30719 assert$1(string in this._stringToNumber);
30720 return this._stringToNumber[string];
30721 }
30722 decode(n) {
30723 assert$1(n < this._numberToString.length);
30724 return this._numberToString[n];
30725 }
30726}
30727
30728class GeoJSONFeature {
30729 constructor(vectorTileFeature, z, x, y, id) {
30730 this.type = 'Feature';
30731 this._vectorTileFeature = vectorTileFeature;
30732 vectorTileFeature._z = z;
30733 vectorTileFeature._x = x;
30734 vectorTileFeature._y = y;
30735 this.properties = vectorTileFeature.properties;
30736 this.id = id;
30737 }
30738 get geometry() {
30739 if (this._geometry === undefined) {
30740 this._geometry = this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x, this._vectorTileFeature._y, this._vectorTileFeature._z).geometry;
30741 }
30742 return this._geometry;
30743 }
30744 set geometry(g) {
30745 this._geometry = g;
30746 }
30747 toJSON() {
30748 const json = {
30749 geometry: this.geometry
30750 };
30751 for (const i in this) {
30752 if (i === '_geometry' || i === '_vectorTileFeature')
30753 continue;
30754 json[i] = (this)[i];
30755 }
30756 return json;
30757 }
30758}
30759
30760class FeatureIndex {
30761 constructor(tileID, promoteId) {
30762 this.tileID = tileID;
30763 this.x = tileID.canonical.x;
30764 this.y = tileID.canonical.y;
30765 this.z = tileID.canonical.z;
30766 this.grid = new TransferableGridIndex(EXTENT, 16, 0);
30767 this.grid3D = new TransferableGridIndex(EXTENT, 16, 0);
30768 this.featureIndexArray = new FeatureIndexArray();
30769 this.promoteId = promoteId;
30770 }
30771 insert(feature, geometry, featureIndex, sourceLayerIndex, bucketIndex, is3D) {
30772 const key = this.featureIndexArray.length;
30773 this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex);
30774 const grid = is3D ? this.grid3D : this.grid;
30775 for (let r = 0; r < geometry.length; r++) {
30776 const ring = geometry[r];
30777 const bbox = [Infinity, Infinity, -Infinity, -Infinity];
30778 for (let i = 0; i < ring.length; i++) {
30779 const p = ring[i];
30780 bbox[0] = Math.min(bbox[0], p.x);
30781 bbox[1] = Math.min(bbox[1], p.y);
30782 bbox[2] = Math.max(bbox[2], p.x);
30783 bbox[3] = Math.max(bbox[3], p.y);
30784 }
30785 if (bbox[0] < EXTENT &&
30786 bbox[1] < EXTENT &&
30787 bbox[2] >= 0 &&
30788 bbox[3] >= 0) {
30789 grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]);
30790 }
30791 }
30792 }
30793 loadVTLayers() {
30794 if (!this.vtLayers) {
30795 this.vtLayers = new vectorTile.VectorTile(new pbf(this.rawTileData)).layers;
30796 this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']);
30797 }
30798 return this.vtLayers;
30799 }
30800 // Finds non-symbol features in this tile at a particular position.
30801 query(args, styleLayers, serializedLayers, sourceFeatureState) {
30802 this.loadVTLayers();
30803 const params = args.params || {}, pixelsToTileUnits = EXTENT / args.tileSize / args.scale, filter = createFilter(params.filter);
30804 const queryGeometry = args.queryGeometry;
30805 const queryPadding = args.queryPadding * pixelsToTileUnits;
30806 const bounds = getBounds(queryGeometry);
30807 const matching = this.grid.query(bounds.minX - queryPadding, bounds.minY - queryPadding, bounds.maxX + queryPadding, bounds.maxY + queryPadding);
30808 const cameraBounds = getBounds(args.cameraQueryGeometry);
30809 const matching3D = this.grid3D.query(cameraBounds.minX - queryPadding, cameraBounds.minY - queryPadding, cameraBounds.maxX + queryPadding, cameraBounds.maxY + queryPadding, (bx1, by1, bx2, by2) => {
30810 return polygonIntersectsBox(args.cameraQueryGeometry, bx1 - queryPadding, by1 - queryPadding, bx2 + queryPadding, by2 + queryPadding);
30811 });
30812 for (const key of matching3D) {
30813 matching.push(key);
30814 }
30815 matching.sort(topDownFeatureComparator);
30816 const result = {};
30817 let previousIndex;
30818 for (let k = 0; k < matching.length; k++) {
30819 const index = matching[k];
30820 // don't check the same feature more than once
30821 if (index === previousIndex)
30822 continue;
30823 previousIndex = index;
30824 const match = this.featureIndexArray.get(index);
30825 let featureGeometry = null;
30826 this.loadMatchingFeature(result, match.bucketIndex, match.sourceLayerIndex, match.featureIndex, filter, params.layers, params.availableImages, styleLayers, serializedLayers, sourceFeatureState, (feature, styleLayer, featureState) => {
30827 if (!featureGeometry) {
30828 featureGeometry = loadGeometry(feature);
30829 }
30830 return styleLayer.queryIntersectsFeature(queryGeometry, feature, featureState, featureGeometry, this.z, args.transform, pixelsToTileUnits, args.pixelPosMatrix);
30831 });
30832 }
30833 return result;
30834 }
30835 loadMatchingFeature(result, bucketIndex, sourceLayerIndex, featureIndex, filter, filterLayerIDs, availableImages, styleLayers, serializedLayers, sourceFeatureState, intersectionTest) {
30836 const layerIDs = this.bucketLayerIDs[bucketIndex];
30837 if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs))
30838 return;
30839 const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex);
30840 const sourceLayer = this.vtLayers[sourceLayerName];
30841 const feature = sourceLayer.feature(featureIndex);
30842 if (filter.needGeometry) {
30843 const evaluationFeature = toEvaluationFeature(feature, true);
30844 if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) {
30845 return;
30846 }
30847 }
30848 else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) {
30849 return;
30850 }
30851 const id = this.getId(feature, sourceLayerName);
30852 for (let l = 0; l < layerIDs.length; l++) {
30853 const layerID = layerIDs[l];
30854 if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {
30855 continue;
30856 }
30857 const styleLayer = styleLayers[layerID];
30858 if (!styleLayer)
30859 continue;
30860 let featureState = {};
30861 if (id && sourceFeatureState) {
30862 // `feature-state` expression evaluation requires feature state to be available
30863 featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', id);
30864 }
30865 const serializedLayer = extend$1({}, serializedLayers[layerID]);
30866 serializedLayer.paint = evaluateProperties(serializedLayer.paint, styleLayer.paint, feature, featureState, availableImages);
30867 serializedLayer.layout = evaluateProperties(serializedLayer.layout, styleLayer.layout, feature, featureState, availableImages);
30868 const intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer, featureState);
30869 if (!intersectionZ) {
30870 // Only applied for non-symbol features
30871 continue;
30872 }
30873 const geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y, id);
30874 geojsonFeature.layer = serializedLayer;
30875 let layerResult = result[layerID];
30876 if (layerResult === undefined) {
30877 layerResult = result[layerID] = [];
30878 }
30879 layerResult.push({ featureIndex, feature: geojsonFeature, intersectionZ });
30880 }
30881 }
30882 // Given a set of symbol indexes that have already been looked up,
30883 // return a matching set of GeoJSONFeatures
30884 lookupSymbolFeatures(symbolFeatureIndexes, serializedLayers, bucketIndex, sourceLayerIndex, filterSpec, filterLayerIDs, availableImages, styleLayers) {
30885 const result = {};
30886 this.loadVTLayers();
30887 const filter = createFilter(filterSpec);
30888 for (const symbolFeatureIndex of symbolFeatureIndexes) {
30889 this.loadMatchingFeature(result, bucketIndex, sourceLayerIndex, symbolFeatureIndex, filter, filterLayerIDs, availableImages, styleLayers, serializedLayers);
30890 }
30891 return result;
30892 }
30893 hasLayer(id) {
30894 for (const layerIDs of this.bucketLayerIDs) {
30895 for (const layerID of layerIDs) {
30896 if (id === layerID)
30897 return true;
30898 }
30899 }
30900 return false;
30901 }
30902 getId(feature, sourceLayerId) {
30903 let id = feature.id;
30904 if (this.promoteId) {
30905 const propName = typeof this.promoteId === 'string' ? this.promoteId : this.promoteId[sourceLayerId];
30906 id = feature.properties[propName];
30907 if (typeof id === 'boolean')
30908 id = Number(id);
30909 }
30910 return id;
30911 }
30912}
30913register('FeatureIndex', FeatureIndex, { omit: ['rawTileData', 'sourceLayerCoder'] });
30914function evaluateProperties(serializedProperties, styleLayerProperties, feature, featureState, availableImages) {
30915 return mapObject(serializedProperties, (property, key) => {
30916 const prop = styleLayerProperties instanceof PossiblyEvaluated ? styleLayerProperties.get(key) : null;
30917 return prop && prop.evaluate ? prop.evaluate(feature, featureState, availableImages) : prop;
30918 });
30919}
30920function getBounds(geometry) {
30921 let minX = Infinity;
30922 let minY = Infinity;
30923 let maxX = -Infinity;
30924 let maxY = -Infinity;
30925 for (const p of geometry) {
30926 minX = Math.min(minX, p.x);
30927 minY = Math.min(minY, p.y);
30928 maxX = Math.max(maxX, p.x);
30929 maxY = Math.max(maxY, p.y);
30930 }
30931 return { minX, minY, maxX, maxY };
30932}
30933function topDownFeatureComparator(a, b) {
30934 return b - a;
30935}
30936
30937var refProperties = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];
30938
30939exports.PerformanceMarkers = void 0;
30940(function (PerformanceMarkers) {
30941 PerformanceMarkers["create"] = "create";
30942 PerformanceMarkers["load"] = "load";
30943 PerformanceMarkers["fullLoad"] = "fullLoad";
30944})(exports.PerformanceMarkers || (exports.PerformanceMarkers = {}));
30945let lastFrameTime = null;
30946let frameTimes = [];
30947const minFramerateTarget = 30;
30948const frameTimeTarget = 1000 / minFramerateTarget;
30949const PerformanceUtils = {
30950 mark(marker) {
30951 performance.mark(marker);
30952 },
30953 frame(timestamp) {
30954 const currTimestamp = timestamp;
30955 if (lastFrameTime != null) {
30956 const frameTime = currTimestamp - lastFrameTime;
30957 frameTimes.push(frameTime);
30958 }
30959 lastFrameTime = currTimestamp;
30960 },
30961 clearMetrics() {
30962 lastFrameTime = null;
30963 frameTimes = [];
30964 performance.clearMeasures('loadTime');
30965 performance.clearMeasures('fullLoadTime');
30966 for (const marker in exports.PerformanceMarkers) {
30967 performance.clearMarks(exports.PerformanceMarkers[marker]);
30968 }
30969 },
30970 getPerformanceMetrics() {
30971 performance.measure('loadTime', exports.PerformanceMarkers.create, exports.PerformanceMarkers.load);
30972 performance.measure('fullLoadTime', exports.PerformanceMarkers.create, exports.PerformanceMarkers.fullLoad);
30973 const loadTime = performance.getEntriesByName('loadTime')[0].duration;
30974 const fullLoadTime = performance.getEntriesByName('fullLoadTime')[0].duration;
30975 const totalFrames = frameTimes.length;
30976 const avgFrameTime = frameTimes.reduce((prev, curr) => prev + curr, 0) / totalFrames / 1000;
30977 const fps = 1 / avgFrameTime;
30978 // count frames that missed our framerate target
30979 const droppedFrames = frameTimes
30980 .filter((frameTime) => frameTime > frameTimeTarget)
30981 .reduce((acc, curr) => {
30982 return acc + (curr - frameTimeTarget) / frameTimeTarget;
30983 }, 0);
30984 const percentDroppedFrames = (droppedFrames / (totalFrames + droppedFrames)) * 100;
30985 return {
30986 loadTime,
30987 fullLoadTime,
30988 fps,
30989 percentDroppedFrames
30990 };
30991 }
30992};
30993/**
30994 * Safe wrapper for the performance resource timing API in web workers with graceful degradation
30995 *
30996 * @param {RequestParameters} request
30997 * @private
30998 */
30999class RequestPerformance {
31000 constructor(request) {
31001 this._marks = {
31002 start: [request.url, 'start'].join('#'),
31003 end: [request.url, 'end'].join('#'),
31004 measure: request.url.toString()
31005 };
31006 performance.mark(this._marks.start);
31007 }
31008 finish() {
31009 performance.mark(this._marks.end);
31010 let resourceTimingData = performance.getEntriesByName(this._marks.measure);
31011 // fallback if web worker implementation of perf.getEntriesByName returns empty
31012 if (resourceTimingData.length === 0) {
31013 performance.measure(this._marks.measure, this._marks.start, this._marks.end);
31014 resourceTimingData = performance.getEntriesByName(this._marks.measure);
31015 // cleanup
31016 performance.clearMarks(this._marks.start);
31017 performance.clearMarks(this._marks.end);
31018 performance.clearMeasures(this._marks.measure);
31019 }
31020 return resourceTimingData;
31021 }
31022}
31023var performance$1 = performance;
31024
31025exports.AJAXError = AJAXError;
31026exports.Actor = Actor;
31027exports.AlphaImage = AlphaImage;
31028exports.CanonicalTileID = CanonicalTileID;
31029exports.CollisionBoxArray = CollisionBoxArray;
31030exports.CollisionCircleLayoutArray = CollisionCircleLayoutArray;
31031exports.Color = Color;
31032exports.DEMData = DEMData;
31033exports.DataConstantProperty = DataConstantProperty;
31034exports.DictionaryCoder = DictionaryCoder;
31035exports.EXTENT = EXTENT;
31036exports.ErrorEvent = ErrorEvent;
31037exports.EvaluationParameters = EvaluationParameters;
31038exports.Event = Event;
31039exports.Evented = Evented;
31040exports.FeatureIndex = FeatureIndex;
31041exports.FillBucket = FillBucket;
31042exports.FillExtrusionBucket = FillExtrusionBucket;
31043exports.GeoJSONFeature = GeoJSONFeature;
31044exports.ImageAtlas = ImageAtlas;
31045exports.ImagePosition = ImagePosition;
31046exports.LineBucket = LineBucket;
31047exports.LineStripIndexArray = LineStripIndexArray;
31048exports.LngLat = LngLat;
31049exports.LngLatBounds = LngLatBounds$1;
31050exports.MercatorCoordinate = MercatorCoordinate;
31051exports.ONE_EM = ONE_EM;
31052exports.OverscaledTileID = OverscaledTileID;
31053exports.PerformanceUtils = PerformanceUtils;
31054exports.PosArray = PosArray;
31055exports.Properties = Properties;
31056exports.QuadTriangleArray = QuadTriangleArray;
31057exports.RGBAImage = RGBAImage;
31058exports.RasterBoundsArray = RasterBoundsArray;
31059exports.RequestPerformance = RequestPerformance;
31060exports.ResourceType = ResourceType;
31061exports.SegmentVector = SegmentVector;
31062exports.SymbolBucket = SymbolBucket$1;
31063exports.Transitionable = Transitionable;
31064exports.TriangleIndexArray = TriangleIndexArray;
31065exports.Uniform1f = Uniform1f;
31066exports.Uniform1i = Uniform1i;
31067exports.Uniform2f = Uniform2f;
31068exports.Uniform3f = Uniform3f;
31069exports.Uniform4f = Uniform4f;
31070exports.UniformColor = UniformColor;
31071exports.UniformMatrix4f = UniformMatrix4f;
31072exports.UnwrappedTileID = UnwrappedTileID;
31073exports.ValidationError = ValidationError;
31074exports.ZoomHistory = ZoomHistory;
31075exports.add = add$4;
31076exports.addDynamicAttributes = addDynamicAttributes;
31077exports.assert = assert$1;
31078exports.asyncAll = asyncAll;
31079exports.bezier = bezier$1;
31080exports.bindAll = bindAll;
31081exports.cacheEntryPossiblyAdded = cacheEntryPossiblyAdded;
31082exports.clamp = clamp;
31083exports.clearTileCache = clearTileCache;
31084exports.clipLine = clipLine;
31085exports.clone = clone$5;
31086exports.clone$1 = clone$9;
31087exports.clone$2 = clone$4;
31088exports.collisionCircleLayout = collisionCircleLayout;
31089exports.config = config;
31090exports.create = create$5;
31091exports.create$1 = create$6;
31092exports.create$2 = create$8;
31093exports.createExpression = createExpression;
31094exports.createFilter = createFilter;
31095exports.createLayout = createLayout;
31096exports.createStyleLayer = createStyleLayer;
31097exports.cross = cross$2;
31098exports.deepEqual = deepEqual;
31099exports.dot = dot$5;
31100exports.dot$1 = dot$4;
31101exports.ease = ease;
31102exports.emitValidationErrors = emitValidationErrors;
31103exports.enforceCacheSizeLimit = enforceCacheSizeLimit;
31104exports.evaluateSizeForFeature = evaluateSizeForFeature;
31105exports.evaluateSizeForZoom = evaluateSizeForZoom;
31106exports.evaluateVariableOffset = evaluateVariableOffset;
31107exports.evented = evented;
31108exports.exported = exported$1;
31109exports.exported$1 = exported;
31110exports.extend = extend$1;
31111exports.filterObject = filterObject;
31112exports.fromRotation = fromRotation$2;
31113exports.getAnchorAlignment = getAnchorAlignment;
31114exports.getAnchorJustification = getAnchorJustification;
31115exports.getArrayBuffer = getArrayBuffer;
31116exports.getImage = getImage;
31117exports.getJSON = getJSON;
31118exports.getOverlapMode = getOverlapMode;
31119exports.getRTLTextPluginStatus = getRTLTextPluginStatus;
31120exports.getReferrer = getReferrer;
31121exports.getVideo = getVideo;
31122exports.identity = identity$2;
31123exports.invert = invert$2;
31124exports.isImageBitmap = isImageBitmap;
31125exports.isSafari = isSafari;
31126exports.keysDifference = keysDifference;
31127exports.lazyLoadRTLTextPlugin = lazyLoadRTLTextPlugin;
31128exports.makeRequest = makeRequest;
31129exports.mapObject = mapObject;
31130exports.mercatorXfromLng = mercatorXfromLng;
31131exports.mercatorYfromLat = mercatorYfromLat;
31132exports.mercatorZfromAltitude = mercatorZfromAltitude;
31133exports.mul = mul$5;
31134exports.multiply = multiply$5;
31135exports.nextPowerOfTwo = nextPowerOfTwo;
31136exports.normalize = normalize$4;
31137exports.number = number;
31138exports.ortho = ortho;
31139exports.parseCacheControl = parseCacheControl;
31140exports.parseGlyphPBF = parseGlyphPBF;
31141exports.pbf = pbf;
31142exports.performSymbolLayout = performSymbolLayout;
31143exports.perspective = perspective;
31144exports.pick = pick;
31145exports.plugin = plugin;
31146exports.pointGeometry = pointGeometry;
31147exports.polygonIntersectsPolygon = polygonIntersectsPolygon;
31148exports.potpack = potpack;
31149exports.refProperties = refProperties;
31150exports.register = register;
31151exports.registerForPluginStateChange = registerForPluginStateChange;
31152exports.renderColorRamp = renderColorRamp;
31153exports.rotate = rotate$4;
31154exports.rotateX = rotateX$3;
31155exports.rotateZ = rotateZ$3;
31156exports.scale = scale$5;
31157exports.scale$1 = scale$3;
31158exports.scale$2 = scale$4;
31159exports.setCacheLimits = setCacheLimits;
31160exports.setRTLTextPlugin = setRTLTextPlugin;
31161exports.spec = spec;
31162exports.sphericalToCartesian = sphericalToCartesian;
31163exports.sqrLen = sqrLen;
31164exports.sub = sub$2;
31165exports.toEvaluationFeature = toEvaluationFeature;
31166exports.transformMat3 = transformMat3$1;
31167exports.transformMat4 = transformMat4$1;
31168exports.translate = translate$1;
31169exports.triggerPluginCompletionEvent = triggerPluginCompletionEvent;
31170exports.unicodeBlockLookup = unicodeBlockLookup;
31171exports.uniqueId = uniqueId;
31172exports.validateCustomStyleLayer = validateCustomStyleLayer;
31173exports.validateLight = validateLight;
31174exports.validateStyle = validateStyle;
31175exports.vectorTile = vectorTile;
31176exports.warnOnce = warnOnce;
31177exports.wrap = wrap;
31178
31179}));
31180
31181define(['./shared'], (function (performance) { 'use strict';
31182
31183function stringify(obj) {
31184 const type = typeof obj;
31185 if (type === 'number' || type === 'boolean' || type === 'string' || obj === undefined || obj === null)
31186 return JSON.stringify(obj);
31187 if (Array.isArray(obj)) {
31188 let str = '[';
31189 for (const val of obj) {
31190 str += `${stringify(val)},`;
31191 }
31192 return `${str}]`;
31193 }
31194 const keys = Object.keys(obj).sort();
31195 let str = '{';
31196 for (let i = 0; i < keys.length; i++) {
31197 str += `${JSON.stringify(keys[i])}:${stringify(obj[keys[i]])},`;
31198 }
31199 return `${str}}`;
31200}
31201function getKey(layer) {
31202 let key = '';
31203 for (const k of performance.refProperties) {
31204 key += `/${stringify(layer[k])}`;
31205 }
31206 return key;
31207}
31208/**
31209 * Given an array of layers, return an array of arrays of layers where all
31210 * layers in each group have identical layout-affecting properties. These
31211 * are the properties that were formerly used by explicit `ref` mechanism
31212 * for layers: 'type', 'source', 'source-layer', 'minzoom', 'maxzoom',
31213 * 'filter', and 'layout'.
31214 *
31215 * The input is not modified. The output layers are references to the
31216 * input layers.
31217 *
31218 * @private
31219 * @param {Array<Layer>} layers
31220 * @param {Object} [cachedKeys] - an object to keep already calculated keys.
31221 * @returns {Array<Array<Layer>>}
31222 */
31223function groupByLayout(layers, cachedKeys) {
31224 const groups = {};
31225 for (let i = 0; i < layers.length; i++) {
31226 const k = (cachedKeys && cachedKeys[layers[i].id]) || getKey(layers[i]);
31227 // update the cache if there is one
31228 if (cachedKeys)
31229 cachedKeys[layers[i].id] = k;
31230 let group = groups[k];
31231 if (!group) {
31232 group = groups[k] = [];
31233 }
31234 group.push(layers[i]);
31235 }
31236 const result = [];
31237 for (const k in groups) {
31238 result.push(groups[k]);
31239 }
31240 return result;
31241}
31242
31243class StyleLayerIndex {
31244 constructor(layerConfigs) {
31245 this.keyCache = {};
31246 if (layerConfigs) {
31247 this.replace(layerConfigs);
31248 }
31249 }
31250 replace(layerConfigs) {
31251 this._layerConfigs = {};
31252 this._layers = {};
31253 this.update(layerConfigs, []);
31254 }
31255 update(layerConfigs, removedIds) {
31256 for (const layerConfig of layerConfigs) {
31257 this._layerConfigs[layerConfig.id] = layerConfig;
31258 const layer = this._layers[layerConfig.id] = performance.createStyleLayer(layerConfig);
31259 layer._featureFilter = performance.createFilter(layer.filter);
31260 if (this.keyCache[layerConfig.id])
31261 delete this.keyCache[layerConfig.id];
31262 }
31263 for (const id of removedIds) {
31264 delete this.keyCache[id];
31265 delete this._layerConfigs[id];
31266 delete this._layers[id];
31267 }
31268 this.familiesBySource = {};
31269 const groups = groupByLayout(Object.values(this._layerConfigs), this.keyCache);
31270 for (const layerConfigs of groups) {
31271 const layers = layerConfigs.map((layerConfig) => this._layers[layerConfig.id]);
31272 const layer = layers[0];
31273 if (layer.visibility === 'none') {
31274 continue;
31275 }
31276 const sourceId = layer.source || '';
31277 let sourceGroup = this.familiesBySource[sourceId];
31278 if (!sourceGroup) {
31279 sourceGroup = this.familiesBySource[sourceId] = {};
31280 }
31281 const sourceLayerId = layer.sourceLayer || '_geojsonTileLayer';
31282 let sourceLayerFamilies = sourceGroup[sourceLayerId];
31283 if (!sourceLayerFamilies) {
31284 sourceLayerFamilies = sourceGroup[sourceLayerId] = [];
31285 }
31286 sourceLayerFamilies.push(layers);
31287 }
31288 }
31289}
31290
31291const padding = 1;
31292class GlyphAtlas {
31293 constructor(stacks) {
31294 const positions = {};
31295 const bins = [];
31296 for (const stack in stacks) {
31297 const glyphs = stacks[stack];
31298 const stackPositions = positions[stack] = {};
31299 for (const id in glyphs) {
31300 const src = glyphs[+id];
31301 if (!src || src.bitmap.width === 0 || src.bitmap.height === 0)
31302 continue;
31303 const bin = {
31304 x: 0,
31305 y: 0,
31306 w: src.bitmap.width + 2 * padding,
31307 h: src.bitmap.height + 2 * padding
31308 };
31309 bins.push(bin);
31310 stackPositions[id] = { rect: bin, metrics: src.metrics };
31311 }
31312 }
31313 const { w, h } = performance.potpack(bins);
31314 const image = new performance.AlphaImage({ width: w || 1, height: h || 1 });
31315 for (const stack in stacks) {
31316 const glyphs = stacks[stack];
31317 for (const id in glyphs) {
31318 const src = glyphs[+id];
31319 if (!src || src.bitmap.width === 0 || src.bitmap.height === 0)
31320 continue;
31321 const bin = positions[stack][id].rect;
31322 performance.AlphaImage.copy(src.bitmap, image, { x: 0, y: 0 }, { x: bin.x + padding, y: bin.y + padding }, src.bitmap);
31323 }
31324 }
31325 this.image = image;
31326 this.positions = positions;
31327 }
31328}
31329performance.register('GlyphAtlas', GlyphAtlas);
31330
31331class WorkerTile {
31332 constructor(params) {
31333 this.tileID = new performance.OverscaledTileID(params.tileID.overscaledZ, params.tileID.wrap, params.tileID.canonical.z, params.tileID.canonical.x, params.tileID.canonical.y);
31334 this.uid = params.uid;
31335 this.zoom = params.zoom;
31336 this.pixelRatio = params.pixelRatio;
31337 this.tileSize = params.tileSize;
31338 this.source = params.source;
31339 this.overscaling = this.tileID.overscaleFactor();
31340 this.showCollisionBoxes = params.showCollisionBoxes;
31341 this.collectResourceTiming = !!params.collectResourceTiming;
31342 this.returnDependencies = !!params.returnDependencies;
31343 this.promoteId = params.promoteId;
31344 }
31345 parse(data, layerIndex, availableImages, actor, callback) {
31346 this.status = 'parsing';
31347 this.data = data;
31348 this.collisionBoxArray = new performance.CollisionBoxArray();
31349 const sourceLayerCoder = new performance.DictionaryCoder(Object.keys(data.layers).sort());
31350 const featureIndex = new performance.FeatureIndex(this.tileID, this.promoteId);
31351 featureIndex.bucketLayerIDs = [];
31352 const buckets = {};
31353 const options = {
31354 featureIndex,
31355 iconDependencies: {},
31356 patternDependencies: {},
31357 glyphDependencies: {},
31358 availableImages
31359 };
31360 const layerFamilies = layerIndex.familiesBySource[this.source];
31361 for (const sourceLayerId in layerFamilies) {
31362 const sourceLayer = data.layers[sourceLayerId];
31363 if (!sourceLayer) {
31364 continue;
31365 }
31366 if (sourceLayer.version === 1) {
31367 performance.warnOnce(`Vector tile source "${this.source}" layer "${sourceLayerId}" ` +
31368 'does not use vector tile spec v2 and therefore may have some rendering errors.');
31369 }
31370 const sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId);
31371 const features = [];
31372 for (let index = 0; index < sourceLayer.length; index++) {
31373 const feature = sourceLayer.feature(index);
31374 const id = featureIndex.getId(feature, sourceLayerId);
31375 features.push({ feature, id, index, sourceLayerIndex });
31376 }
31377 for (const family of layerFamilies[sourceLayerId]) {
31378 const layer = family[0];
31379 performance.assert(layer.source === this.source);
31380 if (layer.minzoom && this.zoom < Math.floor(layer.minzoom))
31381 continue;
31382 if (layer.maxzoom && this.zoom >= layer.maxzoom)
31383 continue;
31384 if (layer.visibility === 'none')
31385 continue;
31386 recalculateLayers(family, this.zoom, availableImages);
31387 const bucket = buckets[layer.id] = layer.createBucket({
31388 index: featureIndex.bucketLayerIDs.length,
31389 layers: family,
31390 zoom: this.zoom,
31391 pixelRatio: this.pixelRatio,
31392 overscaling: this.overscaling,
31393 collisionBoxArray: this.collisionBoxArray,
31394 sourceLayerIndex,
31395 sourceID: this.source
31396 });
31397 bucket.populate(features, options, this.tileID.canonical);
31398 featureIndex.bucketLayerIDs.push(family.map((l) => l.id));
31399 }
31400 }
31401 let error;
31402 let glyphMap;
31403 let iconMap;
31404 let patternMap;
31405 const stacks = performance.mapObject(options.glyphDependencies, (glyphs) => Object.keys(glyphs).map(Number));
31406 if (Object.keys(stacks).length) {
31407 actor.send('getGlyphs', { uid: this.uid, stacks }, (err, result) => {
31408 if (!error) {
31409 error = err;
31410 glyphMap = result;
31411 maybePrepare.call(this);
31412 }
31413 });
31414 }
31415 else {
31416 glyphMap = {};
31417 }
31418 const icons = Object.keys(options.iconDependencies);
31419 if (icons.length) {
31420 actor.send('getImages', { icons, source: this.source, tileID: this.tileID, type: 'icons' }, (err, result) => {
31421 if (!error) {
31422 error = err;
31423 iconMap = result;
31424 maybePrepare.call(this);
31425 }
31426 });
31427 }
31428 else {
31429 iconMap = {};
31430 }
31431 const patterns = Object.keys(options.patternDependencies);
31432 if (patterns.length) {
31433 actor.send('getImages', { icons: patterns, source: this.source, tileID: this.tileID, type: 'patterns' }, (err, result) => {
31434 if (!error) {
31435 error = err;
31436 patternMap = result;
31437 maybePrepare.call(this);
31438 }
31439 });
31440 }
31441 else {
31442 patternMap = {};
31443 }
31444 maybePrepare.call(this);
31445 function maybePrepare() {
31446 if (error) {
31447 return callback(error);
31448 }
31449 else if (glyphMap && iconMap && patternMap) {
31450 const glyphAtlas = new GlyphAtlas(glyphMap);
31451 const imageAtlas = new performance.ImageAtlas(iconMap, patternMap);
31452 for (const key in buckets) {
31453 const bucket = buckets[key];
31454 if (bucket instanceof performance.SymbolBucket) {
31455 recalculateLayers(bucket.layers, this.zoom, availableImages);
31456 performance.performSymbolLayout(bucket, glyphMap, glyphAtlas.positions, iconMap, imageAtlas.iconPositions, this.showCollisionBoxes, this.tileID.canonical);
31457 }
31458 else if (bucket.hasPattern &&
31459 (bucket instanceof performance.LineBucket ||
31460 bucket instanceof performance.FillBucket ||
31461 bucket instanceof performance.FillExtrusionBucket)) {
31462 recalculateLayers(bucket.layers, this.zoom, availableImages);
31463 bucket.addFeatures(options, this.tileID.canonical, imageAtlas.patternPositions);
31464 }
31465 }
31466 this.status = 'done';
31467 callback(null, {
31468 buckets: Object.values(buckets).filter(b => !b.isEmpty()),
31469 featureIndex,
31470 collisionBoxArray: this.collisionBoxArray,
31471 glyphAtlasImage: glyphAtlas.image,
31472 imageAtlas,
31473 // Only used for benchmarking:
31474 glyphMap: this.returnDependencies ? glyphMap : null,
31475 iconMap: this.returnDependencies ? iconMap : null,
31476 glyphPositions: this.returnDependencies ? glyphAtlas.positions : null
31477 });
31478 }
31479 }
31480 }
31481}
31482function recalculateLayers(layers, zoom, availableImages) {
31483 // Layers are shared and may have been used by a WorkerTile with a different zoom.
31484 const parameters = new performance.EvaluationParameters(zoom);
31485 for (const layer of layers) {
31486 layer.recalculate(parameters, availableImages);
31487 }
31488}
31489
31490/**
31491 * @private
31492 */
31493function loadVectorTile(params, callback) {
31494 const request = performance.getArrayBuffer(params.request, (err, data, cacheControl, expires) => {
31495 if (err) {
31496 callback(err);
31497 }
31498 else if (data) {
31499 callback(null, {
31500 vectorTile: new performance.vectorTile.VectorTile(new performance.pbf(data)),
31501 rawData: data,
31502 cacheControl,
31503 expires
31504 });
31505 }
31506 });
31507 return () => {
31508 request.cancel();
31509 callback();
31510 };
31511}
31512/**
31513 * The {@link WorkerSource} implementation that supports {@link VectorTileSource}.
31514 * This class is designed to be easily reused to support custom source types
31515 * for data formats that can be parsed/converted into an in-memory VectorTile
31516 * representation. To do so, create it with
31517 * `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`.
31518 *
31519 * @private
31520 */
31521class VectorTileWorkerSource {
31522 /**
31523 * @param [loadVectorData] Optional method for custom loading of a VectorTile
31524 * object based on parameters passed from the main-thread Source. See
31525 * {@link VectorTileWorkerSource#loadTile}. The default implementation simply
31526 * loads the pbf at `params.url`.
31527 * @private
31528 */
31529 constructor(actor, layerIndex, availableImages, loadVectorData) {
31530 this.actor = actor;
31531 this.layerIndex = layerIndex;
31532 this.availableImages = availableImages;
31533 this.loadVectorData = loadVectorData || loadVectorTile;
31534 this.loading = {};
31535 this.loaded = {};
31536 }
31537 /**
31538 * Implements {@link WorkerSource#loadTile}. Delegates to
31539 * {@link VectorTileWorkerSource#loadVectorData} (which by default expects
31540 * a `params.url` property) for fetching and producing a VectorTile object.
31541 * @private
31542 */
31543 loadTile(params, callback) {
31544 const uid = params.uid;
31545 if (!this.loading)
31546 this.loading = {};
31547 const perf = (params && params.request && params.request.collectResourceTiming) ?
31548 new performance.RequestPerformance(params.request) : false;
31549 const workerTile = this.loading[uid] = new WorkerTile(params);
31550 workerTile.abort = this.loadVectorData(params, (err, response) => {
31551 delete this.loading[uid];
31552 if (err || !response) {
31553 workerTile.status = 'done';
31554 this.loaded[uid] = workerTile;
31555 return callback(err);
31556 }
31557 const rawTileData = response.rawData;
31558 const cacheControl = {};
31559 if (response.expires)
31560 cacheControl.expires = response.expires;
31561 if (response.cacheControl)
31562 cacheControl.cacheControl = response.cacheControl;
31563 const resourceTiming = {};
31564 if (perf) {
31565 const resourceTimingData = perf.finish();
31566 // it's necessary to eval the result of getEntriesByName() here via parse/stringify
31567 // late evaluation in the main thread causes TypeError: illegal invocation
31568 if (resourceTimingData)
31569 resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData));
31570 }
31571 workerTile.vectorTile = response.vectorTile;
31572 workerTile.parse(response.vectorTile, this.layerIndex, this.availableImages, this.actor, (err, result) => {
31573 if (err || !result)
31574 return callback(err);
31575 // Transferring a copy of rawTileData because the worker needs to retain its copy.
31576 callback(null, performance.extend({ rawTileData: rawTileData.slice(0) }, result, cacheControl, resourceTiming));
31577 });
31578 this.loaded = this.loaded || {};
31579 this.loaded[uid] = workerTile;
31580 });
31581 }
31582 /**
31583 * Implements {@link WorkerSource#reloadTile}.
31584 * @private
31585 */
31586 reloadTile(params, callback) {
31587 const loaded = this.loaded, uid = params.uid, vtSource = this;
31588 if (loaded && loaded[uid]) {
31589 const workerTile = loaded[uid];
31590 workerTile.showCollisionBoxes = params.showCollisionBoxes;
31591 const done = (err, data) => {
31592 const reloadCallback = workerTile.reloadCallback;
31593 if (reloadCallback) {
31594 delete workerTile.reloadCallback;
31595 workerTile.parse(workerTile.vectorTile, vtSource.layerIndex, this.availableImages, vtSource.actor, reloadCallback);
31596 }
31597 callback(err, data);
31598 };
31599 if (workerTile.status === 'parsing') {
31600 workerTile.reloadCallback = done;
31601 }
31602 else if (workerTile.status === 'done') {
31603 // if there was no vector tile data on the initial load, don't try and re-parse tile
31604 if (workerTile.vectorTile) {
31605 workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor, done);
31606 }
31607 else {
31608 done();
31609 }
31610 }
31611 }
31612 }
31613 /**
31614 * Implements {@link WorkerSource#abortTile}.
31615 *
31616 * @param params
31617 * @param params.uid The UID for this tile.
31618 * @private
31619 */
31620 abortTile(params, callback) {
31621 const loading = this.loading, uid = params.uid;
31622 if (loading && loading[uid] && loading[uid].abort) {
31623 loading[uid].abort();
31624 delete loading[uid];
31625 }
31626 callback();
31627 }
31628 /**
31629 * Implements {@link WorkerSource#removeTile}.
31630 *
31631 * @param params
31632 * @param params.uid The UID for this tile.
31633 * @private
31634 */
31635 removeTile(params, callback) {
31636 const loaded = this.loaded, uid = params.uid;
31637 if (loaded && loaded[uid]) {
31638 delete loaded[uid];
31639 }
31640 callback();
31641 }
31642}
31643
31644class RasterDEMTileWorkerSource {
31645 constructor() {
31646 this.loaded = {};
31647 }
31648 loadTile(params, callback) {
31649 const { uid, encoding, rawImageData } = params;
31650 // Main thread will transfer ImageBitmap if offscreen decode with OffscreenCanvas is supported, else it will transfer an already decoded image.
31651 const imagePixels = performance.isImageBitmap(rawImageData) ? this.getImageData(rawImageData) : rawImageData;
31652 const dem = new performance.DEMData(uid, imagePixels, encoding);
31653 this.loaded = this.loaded || {};
31654 this.loaded[uid] = dem;
31655 callback(null, dem);
31656 }
31657 getImageData(imgBitmap) {
31658 // Lazily initialize OffscreenCanvas
31659 if (!this.offscreenCanvas || !this.offscreenCanvasContext) {
31660 // Dem tiles are typically 256x256
31661 this.offscreenCanvas = new OffscreenCanvas(imgBitmap.width, imgBitmap.height);
31662 this.offscreenCanvasContext = this.offscreenCanvas.getContext('2d');
31663 }
31664 this.offscreenCanvas.width = imgBitmap.width;
31665 this.offscreenCanvas.height = imgBitmap.height;
31666 this.offscreenCanvasContext.drawImage(imgBitmap, 0, 0, imgBitmap.width, imgBitmap.height);
31667 // Insert an additional 1px padding around the image to allow backfilling for neighboring data.
31668 const imgData = this.offscreenCanvasContext.getImageData(-1, -1, imgBitmap.width + 2, imgBitmap.height + 2);
31669 this.offscreenCanvasContext.clearRect(0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height);
31670 return new performance.RGBAImage({ width: imgData.width, height: imgData.height }, imgData.data);
31671 }
31672 removeTile(params) {
31673 const loaded = this.loaded, uid = params.uid;
31674 if (loaded && loaded[uid]) {
31675 delete loaded[uid];
31676 }
31677 }
31678}
31679
31680var geojsonRewind = rewind$1;
31681
31682function rewind$1(gj, outer) {
31683 var type = gj && gj.type, i;
31684
31685 if (type === 'FeatureCollection') {
31686 for (i = 0; i < gj.features.length; i++) rewind$1(gj.features[i], outer);
31687
31688 } else if (type === 'GeometryCollection') {
31689 for (i = 0; i < gj.geometries.length; i++) rewind$1(gj.geometries[i], outer);
31690
31691 } else if (type === 'Feature') {
31692 rewind$1(gj.geometry, outer);
31693
31694 } else if (type === 'Polygon') {
31695 rewindRings(gj.coordinates, outer);
31696
31697 } else if (type === 'MultiPolygon') {
31698 for (i = 0; i < gj.coordinates.length; i++) rewindRings(gj.coordinates[i], outer);
31699 }
31700
31701 return gj;
31702}
31703
31704function rewindRings(rings, outer) {
31705 if (rings.length === 0) return;
31706
31707 rewindRing(rings[0], outer);
31708 for (var i = 1; i < rings.length; i++) {
31709 rewindRing(rings[i], !outer);
31710 }
31711}
31712
31713function rewindRing(ring, dir) {
31714 var area = 0, err = 0;
31715 for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) {
31716 var k = (ring[i][0] - ring[j][0]) * (ring[j][1] + ring[i][1]);
31717 var m = area + k;
31718 err += Math.abs(area) >= Math.abs(k) ? area - m + k : k - m + area;
31719 area = m;
31720 }
31721 if (area + err >= 0 !== !!dir) ring.reverse();
31722}
31723
31724const toGeoJSON = performance.vectorTile.VectorTileFeature.prototype.toGeoJSON;
31725class FeatureWrapper$1 {
31726 constructor(feature) {
31727 this._feature = feature;
31728 this.extent = performance.EXTENT;
31729 this.type = feature.type;
31730 this.properties = feature.tags;
31731 // If the feature has a top-level `id` property, copy it over, but only
31732 // if it can be coerced to an integer, because this wrapper is used for
31733 // serializing geojson feature data into vector tile PBF data, and the
31734 // vector tile spec only supports integer values for feature ids --
31735 // allowing non-integer values here results in a non-compliant PBF
31736 // that causes an exception when it is parsed with vector-tile-js
31737 if ('id' in feature && !isNaN(feature.id)) {
31738 this.id = parseInt(feature.id, 10);
31739 }
31740 }
31741 loadGeometry() {
31742 if (this._feature.type === 1) {
31743 const geometry = [];
31744 for (const point of this._feature.geometry) {
31745 geometry.push([new performance.pointGeometry(point[0], point[1])]);
31746 }
31747 return geometry;
31748 }
31749 else {
31750 const geometry = [];
31751 for (const ring of this._feature.geometry) {
31752 const newRing = [];
31753 for (const point of ring) {
31754 newRing.push(new performance.pointGeometry(point[0], point[1]));
31755 }
31756 geometry.push(newRing);
31757 }
31758 return geometry;
31759 }
31760 }
31761 toGeoJSON(x, y, z) {
31762 return toGeoJSON.call(this, x, y, z);
31763 }
31764}
31765class GeoJSONWrapper$2 {
31766 constructor(features) {
31767 this.layers = { '_geojsonTileLayer': this };
31768 this.name = '_geojsonTileLayer';
31769 this.extent = performance.EXTENT;
31770 this.length = features.length;
31771 this._features = features;
31772 }
31773 feature(i) {
31774 return new FeatureWrapper$1(this._features[i]);
31775 }
31776}
31777
31778var vtPbf = {exports: {}};
31779
31780'use strict';
31781
31782var Point = performance.pointGeometry;
31783var VectorTileFeature = performance.vectorTile.VectorTileFeature;
31784
31785var geojson_wrapper = GeoJSONWrapper$1;
31786
31787// conform to vectortile api
31788function GeoJSONWrapper$1 (features, options) {
31789 this.options = options || {};
31790 this.features = features;
31791 this.length = features.length;
31792}
31793
31794GeoJSONWrapper$1.prototype.feature = function (i) {
31795 return new FeatureWrapper(this.features[i], this.options.extent)
31796};
31797
31798function FeatureWrapper (feature, extent) {
31799 this.id = typeof feature.id === 'number' ? feature.id : undefined;
31800 this.type = feature.type;
31801 this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry;
31802 this.properties = feature.tags;
31803 this.extent = extent || 4096;
31804}
31805
31806FeatureWrapper.prototype.loadGeometry = function () {
31807 var rings = this.rawGeometry;
31808 this.geometry = [];
31809
31810 for (var i = 0; i < rings.length; i++) {
31811 var ring = rings[i];
31812 var newRing = [];
31813 for (var j = 0; j < ring.length; j++) {
31814 newRing.push(new Point(ring[j][0], ring[j][1]));
31815 }
31816 this.geometry.push(newRing);
31817 }
31818 return this.geometry
31819};
31820
31821FeatureWrapper.prototype.bbox = function () {
31822 if (!this.geometry) this.loadGeometry();
31823
31824 var rings = this.geometry;
31825 var x1 = Infinity;
31826 var x2 = -Infinity;
31827 var y1 = Infinity;
31828 var y2 = -Infinity;
31829
31830 for (var i = 0; i < rings.length; i++) {
31831 var ring = rings[i];
31832
31833 for (var j = 0; j < ring.length; j++) {
31834 var coord = ring[j];
31835
31836 x1 = Math.min(x1, coord.x);
31837 x2 = Math.max(x2, coord.x);
31838 y1 = Math.min(y1, coord.y);
31839 y2 = Math.max(y2, coord.y);
31840 }
31841 }
31842
31843 return [x1, y1, x2, y2]
31844};
31845
31846FeatureWrapper.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON;
31847
31848var Pbf = performance.pbf;
31849var GeoJSONWrapper = geojson_wrapper;
31850
31851vtPbf.exports = fromVectorTileJs;
31852var fromVectorTileJs_1 = vtPbf.exports.fromVectorTileJs = fromVectorTileJs;
31853var fromGeojsonVt_1 = vtPbf.exports.fromGeojsonVt = fromGeojsonVt;
31854var GeoJSONWrapper_1 = vtPbf.exports.GeoJSONWrapper = GeoJSONWrapper;
31855
31856/**
31857 * Serialize a vector-tile-js-created tile to pbf
31858 *
31859 * @param {Object} tile
31860 * @return {Buffer} uncompressed, pbf-serialized tile data
31861 */
31862function fromVectorTileJs (tile) {
31863 var out = new Pbf();
31864 writeTile(tile, out);
31865 return out.finish()
31866}
31867
31868/**
31869 * Serialized a geojson-vt-created tile to pbf.
31870 *
31871 * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects
31872 * @param {Object} [options] - An object specifying the vector-tile specification version and extent that were used to create `layers`.
31873 * @param {Number} [options.version=1] - Version of vector-tile spec used
31874 * @param {Number} [options.extent=4096] - Extent of the vector tile
31875 * @return {Buffer} uncompressed, pbf-serialized tile data
31876 */
31877function fromGeojsonVt (layers, options) {
31878 options = options || {};
31879 var l = {};
31880 for (var k in layers) {
31881 l[k] = new GeoJSONWrapper(layers[k].features, options);
31882 l[k].name = k;
31883 l[k].version = options.version;
31884 l[k].extent = options.extent;
31885 }
31886 return fromVectorTileJs({ layers: l })
31887}
31888
31889function writeTile (tile, pbf) {
31890 for (var key in tile.layers) {
31891 pbf.writeMessage(3, writeLayer, tile.layers[key]);
31892 }
31893}
31894
31895function writeLayer (layer, pbf) {
31896 pbf.writeVarintField(15, layer.version || 1);
31897 pbf.writeStringField(1, layer.name || '');
31898 pbf.writeVarintField(5, layer.extent || 4096);
31899
31900 var i;
31901 var context = {
31902 keys: [],
31903 values: [],
31904 keycache: {},
31905 valuecache: {}
31906 };
31907
31908 for (i = 0; i < layer.length; i++) {
31909 context.feature = layer.feature(i);
31910 pbf.writeMessage(2, writeFeature, context);
31911 }
31912
31913 var keys = context.keys;
31914 for (i = 0; i < keys.length; i++) {
31915 pbf.writeStringField(3, keys[i]);
31916 }
31917
31918 var values = context.values;
31919 for (i = 0; i < values.length; i++) {
31920 pbf.writeMessage(4, writeValue, values[i]);
31921 }
31922}
31923
31924function writeFeature (context, pbf) {
31925 var feature = context.feature;
31926
31927 if (feature.id !== undefined) {
31928 pbf.writeVarintField(1, feature.id);
31929 }
31930
31931 pbf.writeMessage(2, writeProperties, context);
31932 pbf.writeVarintField(3, feature.type);
31933 pbf.writeMessage(4, writeGeometry, feature);
31934}
31935
31936function writeProperties (context, pbf) {
31937 var feature = context.feature;
31938 var keys = context.keys;
31939 var values = context.values;
31940 var keycache = context.keycache;
31941 var valuecache = context.valuecache;
31942
31943 for (var key in feature.properties) {
31944 var value = feature.properties[key];
31945
31946 var keyIndex = keycache[key];
31947 if (value === null) continue // don't encode null value properties
31948
31949 if (typeof keyIndex === 'undefined') {
31950 keys.push(key);
31951 keyIndex = keys.length - 1;
31952 keycache[key] = keyIndex;
31953 }
31954 pbf.writeVarint(keyIndex);
31955
31956 var type = typeof value;
31957 if (type !== 'string' && type !== 'boolean' && type !== 'number') {
31958 value = JSON.stringify(value);
31959 }
31960 var valueKey = type + ':' + value;
31961 var valueIndex = valuecache[valueKey];
31962 if (typeof valueIndex === 'undefined') {
31963 values.push(value);
31964 valueIndex = values.length - 1;
31965 valuecache[valueKey] = valueIndex;
31966 }
31967 pbf.writeVarint(valueIndex);
31968 }
31969}
31970
31971function command (cmd, length) {
31972 return (length << 3) + (cmd & 0x7)
31973}
31974
31975function zigzag (num) {
31976 return (num << 1) ^ (num >> 31)
31977}
31978
31979function writeGeometry (feature, pbf) {
31980 var geometry = feature.loadGeometry();
31981 var type = feature.type;
31982 var x = 0;
31983 var y = 0;
31984 var rings = geometry.length;
31985 for (var r = 0; r < rings; r++) {
31986 var ring = geometry[r];
31987 var count = 1;
31988 if (type === 1) {
31989 count = ring.length;
31990 }
31991 pbf.writeVarint(command(1, count)); // moveto
31992 // do not write polygon closing path as lineto
31993 var lineCount = type === 3 ? ring.length - 1 : ring.length;
31994 for (var i = 0; i < lineCount; i++) {
31995 if (i === 1 && type !== 1) {
31996 pbf.writeVarint(command(2, lineCount - 1)); // lineto
31997 }
31998 var dx = ring[i].x - x;
31999 var dy = ring[i].y - y;
32000 pbf.writeVarint(zigzag(dx));
32001 pbf.writeVarint(zigzag(dy));
32002 x += dx;
32003 y += dy;
32004 }
32005 if (type === 3) {
32006 pbf.writeVarint(command(7, 1)); // closepath
32007 }
32008 }
32009}
32010
32011function writeValue (value, pbf) {
32012 var type = typeof value;
32013 if (type === 'string') {
32014 pbf.writeStringField(1, value);
32015 } else if (type === 'boolean') {
32016 pbf.writeBooleanField(7, value);
32017 } else if (type === 'number') {
32018 if (value % 1 !== 0) {
32019 pbf.writeDoubleField(3, value);
32020 } else if (value < 0) {
32021 pbf.writeSVarintField(6, value);
32022 } else {
32023 pbf.writeVarintField(5, value);
32024 }
32025 }
32026}
32027
32028var vtpbf = vtPbf.exports;
32029
32030function sortKD(ids, coords, nodeSize, left, right, depth) {
32031 if (right - left <= nodeSize) return;
32032
32033 const m = (left + right) >> 1;
32034
32035 select(ids, coords, m, left, right, depth % 2);
32036
32037 sortKD(ids, coords, nodeSize, left, m - 1, depth + 1);
32038 sortKD(ids, coords, nodeSize, m + 1, right, depth + 1);
32039}
32040
32041function select(ids, coords, k, left, right, inc) {
32042
32043 while (right > left) {
32044 if (right - left > 600) {
32045 const n = right - left + 1;
32046 const m = k - left + 1;
32047 const z = Math.log(n);
32048 const s = 0.5 * Math.exp(2 * z / 3);
32049 const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
32050 const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
32051 const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
32052 select(ids, coords, k, newLeft, newRight, inc);
32053 }
32054
32055 const t = coords[2 * k + inc];
32056 let i = left;
32057 let j = right;
32058
32059 swapItem(ids, coords, left, k);
32060 if (coords[2 * right + inc] > t) swapItem(ids, coords, left, right);
32061
32062 while (i < j) {
32063 swapItem(ids, coords, i, j);
32064 i++;
32065 j--;
32066 while (coords[2 * i + inc] < t) i++;
32067 while (coords[2 * j + inc] > t) j--;
32068 }
32069
32070 if (coords[2 * left + inc] === t) swapItem(ids, coords, left, j);
32071 else {
32072 j++;
32073 swapItem(ids, coords, j, right);
32074 }
32075
32076 if (j <= k) left = j + 1;
32077 if (k <= j) right = j - 1;
32078 }
32079}
32080
32081function swapItem(ids, coords, i, j) {
32082 swap(ids, i, j);
32083 swap(coords, 2 * i, 2 * j);
32084 swap(coords, 2 * i + 1, 2 * j + 1);
32085}
32086
32087function swap(arr, i, j) {
32088 const tmp = arr[i];
32089 arr[i] = arr[j];
32090 arr[j] = tmp;
32091}
32092
32093function range(ids, coords, minX, minY, maxX, maxY, nodeSize) {
32094 const stack = [0, ids.length - 1, 0];
32095 const result = [];
32096 let x, y;
32097
32098 while (stack.length) {
32099 const axis = stack.pop();
32100 const right = stack.pop();
32101 const left = stack.pop();
32102
32103 if (right - left <= nodeSize) {
32104 for (let i = left; i <= right; i++) {
32105 x = coords[2 * i];
32106 y = coords[2 * i + 1];
32107 if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[i]);
32108 }
32109 continue;
32110 }
32111
32112 const m = Math.floor((left + right) / 2);
32113
32114 x = coords[2 * m];
32115 y = coords[2 * m + 1];
32116
32117 if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[m]);
32118
32119 const nextAxis = (axis + 1) % 2;
32120
32121 if (axis === 0 ? minX <= x : minY <= y) {
32122 stack.push(left);
32123 stack.push(m - 1);
32124 stack.push(nextAxis);
32125 }
32126 if (axis === 0 ? maxX >= x : maxY >= y) {
32127 stack.push(m + 1);
32128 stack.push(right);
32129 stack.push(nextAxis);
32130 }
32131 }
32132
32133 return result;
32134}
32135
32136function within(ids, coords, qx, qy, r, nodeSize) {
32137 const stack = [0, ids.length - 1, 0];
32138 const result = [];
32139 const r2 = r * r;
32140
32141 while (stack.length) {
32142 const axis = stack.pop();
32143 const right = stack.pop();
32144 const left = stack.pop();
32145
32146 if (right - left <= nodeSize) {
32147 for (let i = left; i <= right; i++) {
32148 if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) result.push(ids[i]);
32149 }
32150 continue;
32151 }
32152
32153 const m = Math.floor((left + right) / 2);
32154
32155 const x = coords[2 * m];
32156 const y = coords[2 * m + 1];
32157
32158 if (sqDist(x, y, qx, qy) <= r2) result.push(ids[m]);
32159
32160 const nextAxis = (axis + 1) % 2;
32161
32162 if (axis === 0 ? qx - r <= x : qy - r <= y) {
32163 stack.push(left);
32164 stack.push(m - 1);
32165 stack.push(nextAxis);
32166 }
32167 if (axis === 0 ? qx + r >= x : qy + r >= y) {
32168 stack.push(m + 1);
32169 stack.push(right);
32170 stack.push(nextAxis);
32171 }
32172 }
32173
32174 return result;
32175}
32176
32177function sqDist(ax, ay, bx, by) {
32178 const dx = ax - bx;
32179 const dy = ay - by;
32180 return dx * dx + dy * dy;
32181}
32182
32183const defaultGetX = p => p[0];
32184const defaultGetY = p => p[1];
32185
32186class KDBush {
32187 constructor(points, getX = defaultGetX, getY = defaultGetY, nodeSize = 64, ArrayType = Float64Array) {
32188 this.nodeSize = nodeSize;
32189 this.points = points;
32190
32191 const IndexArrayType = points.length < 65536 ? Uint16Array : Uint32Array;
32192
32193 const ids = this.ids = new IndexArrayType(points.length);
32194 const coords = this.coords = new ArrayType(points.length * 2);
32195
32196 for (let i = 0; i < points.length; i++) {
32197 ids[i] = i;
32198 coords[2 * i] = getX(points[i]);
32199 coords[2 * i + 1] = getY(points[i]);
32200 }
32201
32202 sortKD(ids, coords, nodeSize, 0, ids.length - 1, 0);
32203 }
32204
32205 range(minX, minY, maxX, maxY) {
32206 return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize);
32207 }
32208
32209 within(x, y, r) {
32210 return within(this.ids, this.coords, x, y, r, this.nodeSize);
32211 }
32212}
32213
32214const defaultOptions = {
32215 minZoom: 0, // min zoom to generate clusters on
32216 maxZoom: 16, // max zoom level to cluster the points on
32217 minPoints: 2, // minimum points to form a cluster
32218 radius: 40, // cluster radius in pixels
32219 extent: 512, // tile extent (radius is calculated relative to it)
32220 nodeSize: 64, // size of the KD-tree leaf node, affects performance
32221 log: false, // whether to log timing info
32222
32223 // whether to generate numeric ids for input features (in vector tiles)
32224 generateId: false,
32225
32226 // a reduce function for calculating custom cluster properties
32227 reduce: null, // (accumulated, props) => { accumulated.sum += props.sum; }
32228
32229 // properties to use for individual points when running the reducer
32230 map: props => props // props => ({sum: props.my_value})
32231};
32232
32233const fround = Math.fround || (tmp => ((x) => { tmp[0] = +x; return tmp[0]; }))(new Float32Array(1));
32234
32235class Supercluster {
32236 constructor(options) {
32237 this.options = extend$1(Object.create(defaultOptions), options);
32238 this.trees = new Array(this.options.maxZoom + 1);
32239 }
32240
32241 load(points) {
32242 const {log, minZoom, maxZoom, nodeSize} = this.options;
32243
32244 if (log) console.time('total time');
32245
32246 const timerId = `prepare ${ points.length } points`;
32247 if (log) console.time(timerId);
32248
32249 this.points = points;
32250
32251 // generate a cluster object for each point and index input points into a KD-tree
32252 let clusters = [];
32253 for (let i = 0; i < points.length; i++) {
32254 if (!points[i].geometry) continue;
32255 clusters.push(createPointCluster(points[i], i));
32256 }
32257 this.trees[maxZoom + 1] = new KDBush(clusters, getX, getY, nodeSize, Float32Array);
32258
32259 if (log) console.timeEnd(timerId);
32260
32261 // cluster points on max zoom, then cluster the results on previous zoom, etc.;
32262 // results in a cluster hierarchy across zoom levels
32263 for (let z = maxZoom; z >= minZoom; z--) {
32264 const now = +Date.now();
32265
32266 // create a new set of clusters for the zoom and index them with a KD-tree
32267 clusters = this._cluster(clusters, z);
32268 this.trees[z] = new KDBush(clusters, getX, getY, nodeSize, Float32Array);
32269
32270 if (log) console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now);
32271 }
32272
32273 if (log) console.timeEnd('total time');
32274
32275 return this;
32276 }
32277
32278 getClusters(bbox, zoom) {
32279 let minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180;
32280 const minLat = Math.max(-90, Math.min(90, bbox[1]));
32281 let maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180;
32282 const maxLat = Math.max(-90, Math.min(90, bbox[3]));
32283
32284 if (bbox[2] - bbox[0] >= 360) {
32285 minLng = -180;
32286 maxLng = 180;
32287 } else if (minLng > maxLng) {
32288 const easternHem = this.getClusters([minLng, minLat, 180, maxLat], zoom);
32289 const westernHem = this.getClusters([-180, minLat, maxLng, maxLat], zoom);
32290 return easternHem.concat(westernHem);
32291 }
32292
32293 const tree = this.trees[this._limitZoom(zoom)];
32294 const ids = tree.range(lngX(minLng), latY(maxLat), lngX(maxLng), latY(minLat));
32295 const clusters = [];
32296 for (const id of ids) {
32297 const c = tree.points[id];
32298 clusters.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]);
32299 }
32300 return clusters;
32301 }
32302
32303 getChildren(clusterId) {
32304 const originId = this._getOriginId(clusterId);
32305 const originZoom = this._getOriginZoom(clusterId);
32306 const errorMsg = 'No cluster with the specified id.';
32307
32308 const index = this.trees[originZoom];
32309 if (!index) throw new Error(errorMsg);
32310
32311 const origin = index.points[originId];
32312 if (!origin) throw new Error(errorMsg);
32313
32314 const r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1));
32315 const ids = index.within(origin.x, origin.y, r);
32316 const children = [];
32317 for (const id of ids) {
32318 const c = index.points[id];
32319 if (c.parentId === clusterId) {
32320 children.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]);
32321 }
32322 }
32323
32324 if (children.length === 0) throw new Error(errorMsg);
32325
32326 return children;
32327 }
32328
32329 getLeaves(clusterId, limit, offset) {
32330 limit = limit || 10;
32331 offset = offset || 0;
32332
32333 const leaves = [];
32334 this._appendLeaves(leaves, clusterId, limit, offset, 0);
32335
32336 return leaves;
32337 }
32338
32339 getTile(z, x, y) {
32340 const tree = this.trees[this._limitZoom(z)];
32341 const z2 = Math.pow(2, z);
32342 const {extent, radius} = this.options;
32343 const p = radius / extent;
32344 const top = (y - p) / z2;
32345 const bottom = (y + 1 + p) / z2;
32346
32347 const tile = {
32348 features: []
32349 };
32350
32351 this._addTileFeatures(
32352 tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom),
32353 tree.points, x, y, z2, tile);
32354
32355 if (x === 0) {
32356 this._addTileFeatures(
32357 tree.range(1 - p / z2, top, 1, bottom),
32358 tree.points, z2, y, z2, tile);
32359 }
32360 if (x === z2 - 1) {
32361 this._addTileFeatures(
32362 tree.range(0, top, p / z2, bottom),
32363 tree.points, -1, y, z2, tile);
32364 }
32365
32366 return tile.features.length ? tile : null;
32367 }
32368
32369 getClusterExpansionZoom(clusterId) {
32370 let expansionZoom = this._getOriginZoom(clusterId) - 1;
32371 while (expansionZoom <= this.options.maxZoom) {
32372 const children = this.getChildren(clusterId);
32373 expansionZoom++;
32374 if (children.length !== 1) break;
32375 clusterId = children[0].properties.cluster_id;
32376 }
32377 return expansionZoom;
32378 }
32379
32380 _appendLeaves(result, clusterId, limit, offset, skipped) {
32381 const children = this.getChildren(clusterId);
32382
32383 for (const child of children) {
32384 const props = child.properties;
32385
32386 if (props && props.cluster) {
32387 if (skipped + props.point_count <= offset) {
32388 // skip the whole cluster
32389 skipped += props.point_count;
32390 } else {
32391 // enter the cluster
32392 skipped = this._appendLeaves(result, props.cluster_id, limit, offset, skipped);
32393 // exit the cluster
32394 }
32395 } else if (skipped < offset) {
32396 // skip a single point
32397 skipped++;
32398 } else {
32399 // add a single point
32400 result.push(child);
32401 }
32402 if (result.length === limit) break;
32403 }
32404
32405 return skipped;
32406 }
32407
32408 _addTileFeatures(ids, points, x, y, z2, tile) {
32409 for (const i of ids) {
32410 const c = points[i];
32411 const isCluster = c.numPoints;
32412
32413 let tags, px, py;
32414 if (isCluster) {
32415 tags = getClusterProperties(c);
32416 px = c.x;
32417 py = c.y;
32418 } else {
32419 const p = this.points[c.index];
32420 tags = p.properties;
32421 px = lngX(p.geometry.coordinates[0]);
32422 py = latY(p.geometry.coordinates[1]);
32423 }
32424
32425 const f = {
32426 type: 1,
32427 geometry: [[
32428 Math.round(this.options.extent * (px * z2 - x)),
32429 Math.round(this.options.extent * (py * z2 - y))
32430 ]],
32431 tags
32432 };
32433
32434 // assign id
32435 let id;
32436 if (isCluster) {
32437 id = c.id;
32438 } else if (this.options.generateId) {
32439 // optionally generate id
32440 id = c.index;
32441 } else if (this.points[c.index].id) {
32442 // keep id if already assigned
32443 id = this.points[c.index].id;
32444 }
32445
32446 if (id !== undefined) f.id = id;
32447
32448 tile.features.push(f);
32449 }
32450 }
32451
32452 _limitZoom(z) {
32453 return Math.max(this.options.minZoom, Math.min(+z, this.options.maxZoom + 1));
32454 }
32455
32456 _cluster(points, zoom) {
32457 const clusters = [];
32458 const {radius, extent, reduce, minPoints} = this.options;
32459 const r = radius / (extent * Math.pow(2, zoom));
32460
32461 // loop through each point
32462 for (let i = 0; i < points.length; i++) {
32463 const p = points[i];
32464 // if we've already visited the point at this zoom level, skip it
32465 if (p.zoom <= zoom) continue;
32466 p.zoom = zoom;
32467
32468 // find all nearby points
32469 const tree = this.trees[zoom + 1];
32470 const neighborIds = tree.within(p.x, p.y, r);
32471
32472 const numPointsOrigin = p.numPoints || 1;
32473 let numPoints = numPointsOrigin;
32474
32475 // count the number of points in a potential cluster
32476 for (const neighborId of neighborIds) {
32477 const b = tree.points[neighborId];
32478 // filter out neighbors that are already processed
32479 if (b.zoom > zoom) numPoints += b.numPoints || 1;
32480 }
32481
32482 // if there were neighbors to merge, and there are enough points to form a cluster
32483 if (numPoints > numPointsOrigin && numPoints >= minPoints) {
32484 let wx = p.x * numPointsOrigin;
32485 let wy = p.y * numPointsOrigin;
32486
32487 let clusterProperties = reduce && numPointsOrigin > 1 ? this._map(p, true) : null;
32488
32489 // encode both zoom and point index on which the cluster originated -- offset by total length of features
32490 const id = (i << 5) + (zoom + 1) + this.points.length;
32491
32492 for (const neighborId of neighborIds) {
32493 const b = tree.points[neighborId];
32494
32495 if (b.zoom <= zoom) continue;
32496 b.zoom = zoom; // save the zoom (so it doesn't get processed twice)
32497
32498 const numPoints2 = b.numPoints || 1;
32499 wx += b.x * numPoints2; // accumulate coordinates for calculating weighted center
32500 wy += b.y * numPoints2;
32501
32502 b.parentId = id;
32503
32504 if (reduce) {
32505 if (!clusterProperties) clusterProperties = this._map(p, true);
32506 reduce(clusterProperties, this._map(b));
32507 }
32508 }
32509
32510 p.parentId = id;
32511 clusters.push(createCluster(wx / numPoints, wy / numPoints, id, numPoints, clusterProperties));
32512
32513 } else { // left points as unclustered
32514 clusters.push(p);
32515
32516 if (numPoints > 1) {
32517 for (const neighborId of neighborIds) {
32518 const b = tree.points[neighborId];
32519 if (b.zoom <= zoom) continue;
32520 b.zoom = zoom;
32521 clusters.push(b);
32522 }
32523 }
32524 }
32525 }
32526
32527 return clusters;
32528 }
32529
32530 // get index of the point from which the cluster originated
32531 _getOriginId(clusterId) {
32532 return (clusterId - this.points.length) >> 5;
32533 }
32534
32535 // get zoom of the point from which the cluster originated
32536 _getOriginZoom(clusterId) {
32537 return (clusterId - this.points.length) % 32;
32538 }
32539
32540 _map(point, clone) {
32541 if (point.numPoints) {
32542 return clone ? extend$1({}, point.properties) : point.properties;
32543 }
32544 const original = this.points[point.index].properties;
32545 const result = this.options.map(original);
32546 return clone && result === original ? extend$1({}, result) : result;
32547 }
32548}
32549
32550function createCluster(x, y, id, numPoints, properties) {
32551 return {
32552 x: fround(x), // weighted cluster center; round for consistency with Float32Array index
32553 y: fround(y),
32554 zoom: Infinity, // the last zoom the cluster was processed at
32555 id, // encodes index of the first child of the cluster and its zoom level
32556 parentId: -1, // parent cluster id
32557 numPoints,
32558 properties
32559 };
32560}
32561
32562function createPointCluster(p, id) {
32563 const [x, y] = p.geometry.coordinates;
32564 return {
32565 x: fround(lngX(x)), // projected point coordinates
32566 y: fround(latY(y)),
32567 zoom: Infinity, // the last zoom the point was processed at
32568 index: id, // index of the source feature in the original input array,
32569 parentId: -1 // parent cluster id
32570 };
32571}
32572
32573function getClusterJSON(cluster) {
32574 return {
32575 type: 'Feature',
32576 id: cluster.id,
32577 properties: getClusterProperties(cluster),
32578 geometry: {
32579 type: 'Point',
32580 coordinates: [xLng(cluster.x), yLat(cluster.y)]
32581 }
32582 };
32583}
32584
32585function getClusterProperties(cluster) {
32586 const count = cluster.numPoints;
32587 const abbrev =
32588 count >= 10000 ? `${Math.round(count / 1000) }k` :
32589 count >= 1000 ? `${Math.round(count / 100) / 10 }k` : count;
32590 return extend$1(extend$1({}, cluster.properties), {
32591 cluster: true,
32592 cluster_id: cluster.id,
32593 point_count: count,
32594 point_count_abbreviated: abbrev
32595 });
32596}
32597
32598// longitude/latitude to spherical mercator in [0..1] range
32599function lngX(lng) {
32600 return lng / 360 + 0.5;
32601}
32602function latY(lat) {
32603 const sin = Math.sin(lat * Math.PI / 180);
32604 const y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI);
32605 return y < 0 ? 0 : y > 1 ? 1 : y;
32606}
32607
32608// spherical mercator to longitude/latitude
32609function xLng(x) {
32610 return (x - 0.5) * 360;
32611}
32612function yLat(y) {
32613 const y2 = (180 - y * 360) * Math.PI / 180;
32614 return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90;
32615}
32616
32617function extend$1(dest, src) {
32618 for (const id in src) dest[id] = src[id];
32619 return dest;
32620}
32621
32622function getX(p) {
32623 return p.x;
32624}
32625function getY(p) {
32626 return p.y;
32627}
32628
32629// calculate simplification data using optimized Douglas-Peucker algorithm
32630
32631function simplify(coords, first, last, sqTolerance) {
32632 var maxSqDist = sqTolerance;
32633 var mid = (last - first) >> 1;
32634 var minPosToMid = last - first;
32635 var index;
32636
32637 var ax = coords[first];
32638 var ay = coords[first + 1];
32639 var bx = coords[last];
32640 var by = coords[last + 1];
32641
32642 for (var i = first + 3; i < last; i += 3) {
32643 var d = getSqSegDist(coords[i], coords[i + 1], ax, ay, bx, by);
32644
32645 if (d > maxSqDist) {
32646 index = i;
32647 maxSqDist = d;
32648
32649 } else if (d === maxSqDist) {
32650 // a workaround to ensure we choose a pivot close to the middle of the list,
32651 // reducing recursion depth, for certain degenerate inputs
32652 // https://github.com/mapbox/geojson-vt/issues/104
32653 var posToMid = Math.abs(i - mid);
32654 if (posToMid < minPosToMid) {
32655 index = i;
32656 minPosToMid = posToMid;
32657 }
32658 }
32659 }
32660
32661 if (maxSqDist > sqTolerance) {
32662 if (index - first > 3) simplify(coords, first, index, sqTolerance);
32663 coords[index + 2] = maxSqDist;
32664 if (last - index > 3) simplify(coords, index, last, sqTolerance);
32665 }
32666}
32667
32668// square distance from a point to a segment
32669function getSqSegDist(px, py, x, y, bx, by) {
32670
32671 var dx = bx - x;
32672 var dy = by - y;
32673
32674 if (dx !== 0 || dy !== 0) {
32675
32676 var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);
32677
32678 if (t > 1) {
32679 x = bx;
32680 y = by;
32681
32682 } else if (t > 0) {
32683 x += dx * t;
32684 y += dy * t;
32685 }
32686 }
32687
32688 dx = px - x;
32689 dy = py - y;
32690
32691 return dx * dx + dy * dy;
32692}
32693
32694function createFeature(id, type, geom, tags) {
32695 var feature = {
32696 id: typeof id === 'undefined' ? null : id,
32697 type: type,
32698 geometry: geom,
32699 tags: tags,
32700 minX: Infinity,
32701 minY: Infinity,
32702 maxX: -Infinity,
32703 maxY: -Infinity
32704 };
32705 calcBBox(feature);
32706 return feature;
32707}
32708
32709function calcBBox(feature) {
32710 var geom = feature.geometry;
32711 var type = feature.type;
32712
32713 if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') {
32714 calcLineBBox(feature, geom);
32715
32716 } else if (type === 'Polygon' || type === 'MultiLineString') {
32717 for (var i = 0; i < geom.length; i++) {
32718 calcLineBBox(feature, geom[i]);
32719 }
32720
32721 } else if (type === 'MultiPolygon') {
32722 for (i = 0; i < geom.length; i++) {
32723 for (var j = 0; j < geom[i].length; j++) {
32724 calcLineBBox(feature, geom[i][j]);
32725 }
32726 }
32727 }
32728}
32729
32730function calcLineBBox(feature, geom) {
32731 for (var i = 0; i < geom.length; i += 3) {
32732 feature.minX = Math.min(feature.minX, geom[i]);
32733 feature.minY = Math.min(feature.minY, geom[i + 1]);
32734 feature.maxX = Math.max(feature.maxX, geom[i]);
32735 feature.maxY = Math.max(feature.maxY, geom[i + 1]);
32736 }
32737}
32738
32739// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data
32740
32741function convert(data, options) {
32742 var features = [];
32743 if (data.type === 'FeatureCollection') {
32744 for (var i = 0; i < data.features.length; i++) {
32745 convertFeature(features, data.features[i], options, i);
32746 }
32747
32748 } else if (data.type === 'Feature') {
32749 convertFeature(features, data, options);
32750
32751 } else {
32752 // single geometry or a geometry collection
32753 convertFeature(features, {geometry: data}, options);
32754 }
32755
32756 return features;
32757}
32758
32759function convertFeature(features, geojson, options, index) {
32760 if (!geojson.geometry) return;
32761
32762 var coords = geojson.geometry.coordinates;
32763 var type = geojson.geometry.type;
32764 var tolerance = Math.pow(options.tolerance / ((1 << options.maxZoom) * options.extent), 2);
32765 var geometry = [];
32766 var id = geojson.id;
32767 if (options.promoteId) {
32768 id = geojson.properties[options.promoteId];
32769 } else if (options.generateId) {
32770 id = index || 0;
32771 }
32772 if (type === 'Point') {
32773 convertPoint(coords, geometry);
32774
32775 } else if (type === 'MultiPoint') {
32776 for (var i = 0; i < coords.length; i++) {
32777 convertPoint(coords[i], geometry);
32778 }
32779
32780 } else if (type === 'LineString') {
32781 convertLine(coords, geometry, tolerance, false);
32782
32783 } else if (type === 'MultiLineString') {
32784 if (options.lineMetrics) {
32785 // explode into linestrings to be able to track metrics
32786 for (i = 0; i < coords.length; i++) {
32787 geometry = [];
32788 convertLine(coords[i], geometry, tolerance, false);
32789 features.push(createFeature(id, 'LineString', geometry, geojson.properties));
32790 }
32791 return;
32792 } else {
32793 convertLines(coords, geometry, tolerance, false);
32794 }
32795
32796 } else if (type === 'Polygon') {
32797 convertLines(coords, geometry, tolerance, true);
32798
32799 } else if (type === 'MultiPolygon') {
32800 for (i = 0; i < coords.length; i++) {
32801 var polygon = [];
32802 convertLines(coords[i], polygon, tolerance, true);
32803 geometry.push(polygon);
32804 }
32805 } else if (type === 'GeometryCollection') {
32806 for (i = 0; i < geojson.geometry.geometries.length; i++) {
32807 convertFeature(features, {
32808 id: id,
32809 geometry: geojson.geometry.geometries[i],
32810 properties: geojson.properties
32811 }, options, index);
32812 }
32813 return;
32814 } else {
32815 throw new Error('Input data is not a valid GeoJSON object.');
32816 }
32817
32818 features.push(createFeature(id, type, geometry, geojson.properties));
32819}
32820
32821function convertPoint(coords, out) {
32822 out.push(projectX(coords[0]));
32823 out.push(projectY(coords[1]));
32824 out.push(0);
32825}
32826
32827function convertLine(ring, out, tolerance, isPolygon) {
32828 var x0, y0;
32829 var size = 0;
32830
32831 for (var j = 0; j < ring.length; j++) {
32832 var x = projectX(ring[j][0]);
32833 var y = projectY(ring[j][1]);
32834
32835 out.push(x);
32836 out.push(y);
32837 out.push(0);
32838
32839 if (j > 0) {
32840 if (isPolygon) {
32841 size += (x0 * y - x * y0) / 2; // area
32842 } else {
32843 size += Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)); // length
32844 }
32845 }
32846 x0 = x;
32847 y0 = y;
32848 }
32849
32850 var last = out.length - 3;
32851 out[2] = 1;
32852 simplify(out, 0, last, tolerance);
32853 out[last + 2] = 1;
32854
32855 out.size = Math.abs(size);
32856 out.start = 0;
32857 out.end = out.size;
32858}
32859
32860function convertLines(rings, out, tolerance, isPolygon) {
32861 for (var i = 0; i < rings.length; i++) {
32862 var geom = [];
32863 convertLine(rings[i], geom, tolerance, isPolygon);
32864 out.push(geom);
32865 }
32866}
32867
32868function projectX(x) {
32869 return x / 360 + 0.5;
32870}
32871
32872function projectY(y) {
32873 var sin = Math.sin(y * Math.PI / 180);
32874 var y2 = 0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI;
32875 return y2 < 0 ? 0 : y2 > 1 ? 1 : y2;
32876}
32877
32878/* clip features between two axis-parallel lines:
32879 * | |
32880 * ___|___ | /
32881 * / | \____|____/
32882 * | |
32883 */
32884
32885function clip(features, scale, k1, k2, axis, minAll, maxAll, options) {
32886
32887 k1 /= scale;
32888 k2 /= scale;
32889
32890 if (minAll >= k1 && maxAll < k2) return features; // trivial accept
32891 else if (maxAll < k1 || minAll >= k2) return null; // trivial reject
32892
32893 var clipped = [];
32894
32895 for (var i = 0; i < features.length; i++) {
32896
32897 var feature = features[i];
32898 var geometry = feature.geometry;
32899 var type = feature.type;
32900
32901 var min = axis === 0 ? feature.minX : feature.minY;
32902 var max = axis === 0 ? feature.maxX : feature.maxY;
32903
32904 if (min >= k1 && max < k2) { // trivial accept
32905 clipped.push(feature);
32906 continue;
32907 } else if (max < k1 || min >= k2) { // trivial reject
32908 continue;
32909 }
32910
32911 var newGeometry = [];
32912
32913 if (type === 'Point' || type === 'MultiPoint') {
32914 clipPoints(geometry, newGeometry, k1, k2, axis);
32915
32916 } else if (type === 'LineString') {
32917 clipLine(geometry, newGeometry, k1, k2, axis, false, options.lineMetrics);
32918
32919 } else if (type === 'MultiLineString') {
32920 clipLines(geometry, newGeometry, k1, k2, axis, false);
32921
32922 } else if (type === 'Polygon') {
32923 clipLines(geometry, newGeometry, k1, k2, axis, true);
32924
32925 } else if (type === 'MultiPolygon') {
32926 for (var j = 0; j < geometry.length; j++) {
32927 var polygon = [];
32928 clipLines(geometry[j], polygon, k1, k2, axis, true);
32929 if (polygon.length) {
32930 newGeometry.push(polygon);
32931 }
32932 }
32933 }
32934
32935 if (newGeometry.length) {
32936 if (options.lineMetrics && type === 'LineString') {
32937 for (j = 0; j < newGeometry.length; j++) {
32938 clipped.push(createFeature(feature.id, type, newGeometry[j], feature.tags));
32939 }
32940 continue;
32941 }
32942
32943 if (type === 'LineString' || type === 'MultiLineString') {
32944 if (newGeometry.length === 1) {
32945 type = 'LineString';
32946 newGeometry = newGeometry[0];
32947 } else {
32948 type = 'MultiLineString';
32949 }
32950 }
32951 if (type === 'Point' || type === 'MultiPoint') {
32952 type = newGeometry.length === 3 ? 'Point' : 'MultiPoint';
32953 }
32954
32955 clipped.push(createFeature(feature.id, type, newGeometry, feature.tags));
32956 }
32957 }
32958
32959 return clipped.length ? clipped : null;
32960}
32961
32962function clipPoints(geom, newGeom, k1, k2, axis) {
32963 for (var i = 0; i < geom.length; i += 3) {
32964 var a = geom[i + axis];
32965
32966 if (a >= k1 && a <= k2) {
32967 newGeom.push(geom[i]);
32968 newGeom.push(geom[i + 1]);
32969 newGeom.push(geom[i + 2]);
32970 }
32971 }
32972}
32973
32974function clipLine(geom, newGeom, k1, k2, axis, isPolygon, trackMetrics) {
32975
32976 var slice = newSlice(geom);
32977 var intersect = axis === 0 ? intersectX : intersectY;
32978 var len = geom.start;
32979 var segLen, t;
32980
32981 for (var i = 0; i < geom.length - 3; i += 3) {
32982 var ax = geom[i];
32983 var ay = geom[i + 1];
32984 var az = geom[i + 2];
32985 var bx = geom[i + 3];
32986 var by = geom[i + 4];
32987 var a = axis === 0 ? ax : ay;
32988 var b = axis === 0 ? bx : by;
32989 var exited = false;
32990
32991 if (trackMetrics) segLen = Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2));
32992
32993 if (a < k1) {
32994 // ---|--> | (line enters the clip region from the left)
32995 if (b > k1) {
32996 t = intersect(slice, ax, ay, bx, by, k1);
32997 if (trackMetrics) slice.start = len + segLen * t;
32998 }
32999 } else if (a > k2) {
33000 // | <--|--- (line enters the clip region from the right)
33001 if (b < k2) {
33002 t = intersect(slice, ax, ay, bx, by, k2);
33003 if (trackMetrics) slice.start = len + segLen * t;
33004 }
33005 } else {
33006 addPoint(slice, ax, ay, az);
33007 }
33008 if (b < k1 && a >= k1) {
33009 // <--|--- | or <--|-----|--- (line exits the clip region on the left)
33010 t = intersect(slice, ax, ay, bx, by, k1);
33011 exited = true;
33012 }
33013 if (b > k2 && a <= k2) {
33014 // | ---|--> or ---|-----|--> (line exits the clip region on the right)
33015 t = intersect(slice, ax, ay, bx, by, k2);
33016 exited = true;
33017 }
33018
33019 if (!isPolygon && exited) {
33020 if (trackMetrics) slice.end = len + segLen * t;
33021 newGeom.push(slice);
33022 slice = newSlice(geom);
33023 }
33024
33025 if (trackMetrics) len += segLen;
33026 }
33027
33028 // add the last point
33029 var last = geom.length - 3;
33030 ax = geom[last];
33031 ay = geom[last + 1];
33032 az = geom[last + 2];
33033 a = axis === 0 ? ax : ay;
33034 if (a >= k1 && a <= k2) addPoint(slice, ax, ay, az);
33035
33036 // close the polygon if its endpoints are not the same after clipping
33037 last = slice.length - 3;
33038 if (isPolygon && last >= 3 && (slice[last] !== slice[0] || slice[last + 1] !== slice[1])) {
33039 addPoint(slice, slice[0], slice[1], slice[2]);
33040 }
33041
33042 // add the final slice
33043 if (slice.length) {
33044 newGeom.push(slice);
33045 }
33046}
33047
33048function newSlice(line) {
33049 var slice = [];
33050 slice.size = line.size;
33051 slice.start = line.start;
33052 slice.end = line.end;
33053 return slice;
33054}
33055
33056function clipLines(geom, newGeom, k1, k2, axis, isPolygon) {
33057 for (var i = 0; i < geom.length; i++) {
33058 clipLine(geom[i], newGeom, k1, k2, axis, isPolygon, false);
33059 }
33060}
33061
33062function addPoint(out, x, y, z) {
33063 out.push(x);
33064 out.push(y);
33065 out.push(z);
33066}
33067
33068function intersectX(out, ax, ay, bx, by, x) {
33069 var t = (x - ax) / (bx - ax);
33070 out.push(x);
33071 out.push(ay + (by - ay) * t);
33072 out.push(1);
33073 return t;
33074}
33075
33076function intersectY(out, ax, ay, bx, by, y) {
33077 var t = (y - ay) / (by - ay);
33078 out.push(ax + (bx - ax) * t);
33079 out.push(y);
33080 out.push(1);
33081 return t;
33082}
33083
33084function wrap(features, options) {
33085 var buffer = options.buffer / options.extent;
33086 var merged = features;
33087 var left = clip(features, 1, -1 - buffer, buffer, 0, -1, 2, options); // left world copy
33088 var right = clip(features, 1, 1 - buffer, 2 + buffer, 0, -1, 2, options); // right world copy
33089
33090 if (left || right) {
33091 merged = clip(features, 1, -buffer, 1 + buffer, 0, -1, 2, options) || []; // center world copy
33092
33093 if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center
33094 if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center
33095 }
33096
33097 return merged;
33098}
33099
33100function shiftFeatureCoords(features, offset) {
33101 var newFeatures = [];
33102
33103 for (var i = 0; i < features.length; i++) {
33104 var feature = features[i],
33105 type = feature.type;
33106
33107 var newGeometry;
33108
33109 if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') {
33110 newGeometry = shiftCoords(feature.geometry, offset);
33111
33112 } else if (type === 'MultiLineString' || type === 'Polygon') {
33113 newGeometry = [];
33114 for (var j = 0; j < feature.geometry.length; j++) {
33115 newGeometry.push(shiftCoords(feature.geometry[j], offset));
33116 }
33117 } else if (type === 'MultiPolygon') {
33118 newGeometry = [];
33119 for (j = 0; j < feature.geometry.length; j++) {
33120 var newPolygon = [];
33121 for (var k = 0; k < feature.geometry[j].length; k++) {
33122 newPolygon.push(shiftCoords(feature.geometry[j][k], offset));
33123 }
33124 newGeometry.push(newPolygon);
33125 }
33126 }
33127
33128 newFeatures.push(createFeature(feature.id, type, newGeometry, feature.tags));
33129 }
33130
33131 return newFeatures;
33132}
33133
33134function shiftCoords(points, offset) {
33135 var newPoints = [];
33136 newPoints.size = points.size;
33137
33138 if (points.start !== undefined) {
33139 newPoints.start = points.start;
33140 newPoints.end = points.end;
33141 }
33142
33143 for (var i = 0; i < points.length; i += 3) {
33144 newPoints.push(points[i] + offset, points[i + 1], points[i + 2]);
33145 }
33146 return newPoints;
33147}
33148
33149// Transforms the coordinates of each feature in the given tile from
33150// mercator-projected space into (extent x extent) tile space.
33151function transformTile(tile, extent) {
33152 if (tile.transformed) return tile;
33153
33154 var z2 = 1 << tile.z,
33155 tx = tile.x,
33156 ty = tile.y,
33157 i, j, k;
33158
33159 for (i = 0; i < tile.features.length; i++) {
33160 var feature = tile.features[i],
33161 geom = feature.geometry,
33162 type = feature.type;
33163
33164 feature.geometry = [];
33165
33166 if (type === 1) {
33167 for (j = 0; j < geom.length; j += 2) {
33168 feature.geometry.push(transformPoint(geom[j], geom[j + 1], extent, z2, tx, ty));
33169 }
33170 } else {
33171 for (j = 0; j < geom.length; j++) {
33172 var ring = [];
33173 for (k = 0; k < geom[j].length; k += 2) {
33174 ring.push(transformPoint(geom[j][k], geom[j][k + 1], extent, z2, tx, ty));
33175 }
33176 feature.geometry.push(ring);
33177 }
33178 }
33179 }
33180
33181 tile.transformed = true;
33182
33183 return tile;
33184}
33185
33186function transformPoint(x, y, extent, z2, tx, ty) {
33187 return [
33188 Math.round(extent * (x * z2 - tx)),
33189 Math.round(extent * (y * z2 - ty))];
33190}
33191
33192function createTile(features, z, tx, ty, options) {
33193 var tolerance = z === options.maxZoom ? 0 : options.tolerance / ((1 << z) * options.extent);
33194 var tile = {
33195 features: [],
33196 numPoints: 0,
33197 numSimplified: 0,
33198 numFeatures: 0,
33199 source: null,
33200 x: tx,
33201 y: ty,
33202 z: z,
33203 transformed: false,
33204 minX: 2,
33205 minY: 1,
33206 maxX: -1,
33207 maxY: 0
33208 };
33209 for (var i = 0; i < features.length; i++) {
33210 tile.numFeatures++;
33211 addFeature(tile, features[i], tolerance, options);
33212
33213 var minX = features[i].minX;
33214 var minY = features[i].minY;
33215 var maxX = features[i].maxX;
33216 var maxY = features[i].maxY;
33217
33218 if (minX < tile.minX) tile.minX = minX;
33219 if (minY < tile.minY) tile.minY = minY;
33220 if (maxX > tile.maxX) tile.maxX = maxX;
33221 if (maxY > tile.maxY) tile.maxY = maxY;
33222 }
33223 return tile;
33224}
33225
33226function addFeature(tile, feature, tolerance, options) {
33227
33228 var geom = feature.geometry,
33229 type = feature.type,
33230 simplified = [];
33231
33232 if (type === 'Point' || type === 'MultiPoint') {
33233 for (var i = 0; i < geom.length; i += 3) {
33234 simplified.push(geom[i]);
33235 simplified.push(geom[i + 1]);
33236 tile.numPoints++;
33237 tile.numSimplified++;
33238 }
33239
33240 } else if (type === 'LineString') {
33241 addLine(simplified, geom, tile, tolerance, false, false);
33242
33243 } else if (type === 'MultiLineString' || type === 'Polygon') {
33244 for (i = 0; i < geom.length; i++) {
33245 addLine(simplified, geom[i], tile, tolerance, type === 'Polygon', i === 0);
33246 }
33247
33248 } else if (type === 'MultiPolygon') {
33249
33250 for (var k = 0; k < geom.length; k++) {
33251 var polygon = geom[k];
33252 for (i = 0; i < polygon.length; i++) {
33253 addLine(simplified, polygon[i], tile, tolerance, true, i === 0);
33254 }
33255 }
33256 }
33257
33258 if (simplified.length) {
33259 var tags = feature.tags || null;
33260 if (type === 'LineString' && options.lineMetrics) {
33261 tags = {};
33262 for (var key in feature.tags) tags[key] = feature.tags[key];
33263 tags['mapbox_clip_start'] = geom.start / geom.size;
33264 tags['mapbox_clip_end'] = geom.end / geom.size;
33265 }
33266 var tileFeature = {
33267 geometry: simplified,
33268 type: type === 'Polygon' || type === 'MultiPolygon' ? 3 :
33269 type === 'LineString' || type === 'MultiLineString' ? 2 : 1,
33270 tags: tags
33271 };
33272 if (feature.id !== null) {
33273 tileFeature.id = feature.id;
33274 }
33275 tile.features.push(tileFeature);
33276 }
33277}
33278
33279function addLine(result, geom, tile, tolerance, isPolygon, isOuter) {
33280 var sqTolerance = tolerance * tolerance;
33281
33282 if (tolerance > 0 && (geom.size < (isPolygon ? sqTolerance : tolerance))) {
33283 tile.numPoints += geom.length / 3;
33284 return;
33285 }
33286
33287 var ring = [];
33288
33289 for (var i = 0; i < geom.length; i += 3) {
33290 if (tolerance === 0 || geom[i + 2] > sqTolerance) {
33291 tile.numSimplified++;
33292 ring.push(geom[i]);
33293 ring.push(geom[i + 1]);
33294 }
33295 tile.numPoints++;
33296 }
33297
33298 if (isPolygon) rewind(ring, isOuter);
33299
33300 result.push(ring);
33301}
33302
33303function rewind(ring, clockwise) {
33304 var area = 0;
33305 for (var i = 0, len = ring.length, j = len - 2; i < len; j = i, i += 2) {
33306 area += (ring[i] - ring[j]) * (ring[i + 1] + ring[j + 1]);
33307 }
33308 if (area > 0 === clockwise) {
33309 for (i = 0, len = ring.length; i < len / 2; i += 2) {
33310 var x = ring[i];
33311 var y = ring[i + 1];
33312 ring[i] = ring[len - 2 - i];
33313 ring[i + 1] = ring[len - 1 - i];
33314 ring[len - 2 - i] = x;
33315 ring[len - 1 - i] = y;
33316 }
33317 }
33318}
33319
33320function geojsonvt(data, options) {
33321 return new GeoJSONVT(data, options);
33322}
33323
33324function GeoJSONVT(data, options) {
33325 options = this.options = extend(Object.create(this.options), options);
33326
33327 var debug = options.debug;
33328
33329 if (debug) console.time('preprocess data');
33330
33331 if (options.maxZoom < 0 || options.maxZoom > 24) throw new Error('maxZoom should be in the 0-24 range');
33332 if (options.promoteId && options.generateId) throw new Error('promoteId and generateId cannot be used together.');
33333
33334 var features = convert(data, options);
33335
33336 this.tiles = {};
33337 this.tileCoords = [];
33338
33339 if (debug) {
33340 console.timeEnd('preprocess data');
33341 console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints);
33342 console.time('generate tiles');
33343 this.stats = {};
33344 this.total = 0;
33345 }
33346
33347 features = wrap(features, options);
33348
33349 // start slicing from the top tile down
33350 if (features.length) this.splitTile(features, 0, 0, 0);
33351
33352 if (debug) {
33353 if (features.length) console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints);
33354 console.timeEnd('generate tiles');
33355 console.log('tiles generated:', this.total, JSON.stringify(this.stats));
33356 }
33357}
33358
33359GeoJSONVT.prototype.options = {
33360 maxZoom: 14, // max zoom to preserve detail on
33361 indexMaxZoom: 5, // max zoom in the tile index
33362 indexMaxPoints: 100000, // max number of points per tile in the tile index
33363 tolerance: 3, // simplification tolerance (higher means simpler)
33364 extent: 4096, // tile extent
33365 buffer: 64, // tile buffer on each side
33366 lineMetrics: false, // whether to calculate line metrics
33367 promoteId: null, // name of a feature property to be promoted to feature.id
33368 generateId: false, // whether to generate feature ids. Cannot be used with promoteId
33369 debug: 0 // logging level (0, 1 or 2)
33370};
33371
33372GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) {
33373
33374 var stack = [features, z, x, y],
33375 options = this.options,
33376 debug = options.debug;
33377
33378 // avoid recursion by using a processing queue
33379 while (stack.length) {
33380 y = stack.pop();
33381 x = stack.pop();
33382 z = stack.pop();
33383 features = stack.pop();
33384
33385 var z2 = 1 << z,
33386 id = toID(z, x, y),
33387 tile = this.tiles[id];
33388
33389 if (!tile) {
33390 if (debug > 1) console.time('creation');
33391
33392 tile = this.tiles[id] = createTile(features, z, x, y, options);
33393 this.tileCoords.push({z: z, x: x, y: y});
33394
33395 if (debug) {
33396 if (debug > 1) {
33397 console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)',
33398 z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified);
33399 console.timeEnd('creation');
33400 }
33401 var key = 'z' + z;
33402 this.stats[key] = (this.stats[key] || 0) + 1;
33403 this.total++;
33404 }
33405 }
33406
33407 // save reference to original geometry in tile so that we can drill down later if we stop now
33408 tile.source = features;
33409
33410 // if it's the first-pass tiling
33411 if (!cz) {
33412 // stop tiling if we reached max zoom, or if the tile is too simple
33413 if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) continue;
33414
33415 // if a drilldown to a specific tile
33416 } else {
33417 // stop tiling if we reached base zoom or our target tile zoom
33418 if (z === options.maxZoom || z === cz) continue;
33419
33420 // stop tiling if it's not an ancestor of the target tile
33421 var m = 1 << (cz - z);
33422 if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) continue;
33423 }
33424
33425 // if we slice further down, no need to keep source geometry
33426 tile.source = null;
33427
33428 if (features.length === 0) continue;
33429
33430 if (debug > 1) console.time('clipping');
33431
33432 // values we'll use for clipping
33433 var k1 = 0.5 * options.buffer / options.extent,
33434 k2 = 0.5 - k1,
33435 k3 = 0.5 + k1,
33436 k4 = 1 + k1,
33437 tl, bl, tr, br, left, right;
33438
33439 tl = bl = tr = br = null;
33440
33441 left = clip(features, z2, x - k1, x + k3, 0, tile.minX, tile.maxX, options);
33442 right = clip(features, z2, x + k2, x + k4, 0, tile.minX, tile.maxX, options);
33443 features = null;
33444
33445 if (left) {
33446 tl = clip(left, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options);
33447 bl = clip(left, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options);
33448 left = null;
33449 }
33450
33451 if (right) {
33452 tr = clip(right, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options);
33453 br = clip(right, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options);
33454 right = null;
33455 }
33456
33457 if (debug > 1) console.timeEnd('clipping');
33458
33459 stack.push(tl || [], z + 1, x * 2, y * 2);
33460 stack.push(bl || [], z + 1, x * 2, y * 2 + 1);
33461 stack.push(tr || [], z + 1, x * 2 + 1, y * 2);
33462 stack.push(br || [], z + 1, x * 2 + 1, y * 2 + 1);
33463 }
33464};
33465
33466GeoJSONVT.prototype.getTile = function (z, x, y) {
33467 var options = this.options,
33468 extent = options.extent,
33469 debug = options.debug;
33470
33471 if (z < 0 || z > 24) return null;
33472
33473 var z2 = 1 << z;
33474 x = ((x % z2) + z2) % z2; // wrap tile x coordinate
33475
33476 var id = toID(z, x, y);
33477 if (this.tiles[id]) return transformTile(this.tiles[id], extent);
33478
33479 if (debug > 1) console.log('drilling down to z%d-%d-%d', z, x, y);
33480
33481 var z0 = z,
33482 x0 = x,
33483 y0 = y,
33484 parent;
33485
33486 while (!parent && z0 > 0) {
33487 z0--;
33488 x0 = Math.floor(x0 / 2);
33489 y0 = Math.floor(y0 / 2);
33490 parent = this.tiles[toID(z0, x0, y0)];
33491 }
33492
33493 if (!parent || !parent.source) return null;
33494
33495 // if we found a parent tile containing the original geometry, we can drill down from it
33496 if (debug > 1) console.log('found parent tile z%d-%d-%d', z0, x0, y0);
33497
33498 if (debug > 1) console.time('drilling down');
33499 this.splitTile(parent.source, z0, x0, y0, z, x, y);
33500 if (debug > 1) console.timeEnd('drilling down');
33501
33502 return this.tiles[id] ? transformTile(this.tiles[id], extent) : null;
33503};
33504
33505function toID(z, x, y) {
33506 return (((1 << z) * y + x) * 32) + z;
33507}
33508
33509function extend(dest, src) {
33510 for (var i in src) dest[i] = src[i];
33511 return dest;
33512}
33513
33514function loadGeoJSONTile(params, callback) {
33515 const canonical = params.tileID.canonical;
33516 if (!this._geoJSONIndex) {
33517 return callback(null, null); // we couldn't load the file
33518 }
33519 const geoJSONTile = this._geoJSONIndex.getTile(canonical.z, canonical.x, canonical.y);
33520 if (!geoJSONTile) {
33521 return callback(null, null); // nothing in the given tile
33522 }
33523 const geojsonWrapper = new GeoJSONWrapper$2(geoJSONTile.features);
33524 // Encode the geojson-vt tile into binary vector tile form. This
33525 // is a convenience that allows `FeatureIndex` to operate the same way
33526 // across `VectorTileSource` and `GeoJSONSource` data.
33527 let pbf = vtpbf(geojsonWrapper);
33528 if (pbf.byteOffset !== 0 || pbf.byteLength !== pbf.buffer.byteLength) {
33529 // Compatibility with node Buffer (https://github.com/mapbox/pbf/issues/35)
33530 pbf = new Uint8Array(pbf);
33531 }
33532 callback(null, {
33533 vectorTile: geojsonWrapper,
33534 rawData: pbf.buffer
33535 });
33536}
33537/**
33538 * The {@link WorkerSource} implementation that supports {@link GeoJSONSource}.
33539 * This class is designed to be easily reused to support custom source types
33540 * for data formats that can be parsed/converted into an in-memory GeoJSON
33541 * representation. To do so, create it with
33542 * `new GeoJSONWorkerSource(actor, layerIndex, customLoadGeoJSONFunction)`.
33543 * For a full example, see [mapbox-gl-topojson](https://github.com/developmentseed/mapbox-gl-topojson).
33544 *
33545 * @private
33546 */
33547class GeoJSONWorkerSource extends VectorTileWorkerSource {
33548 /**
33549 * @param [loadGeoJSON] Optional method for custom loading/parsing of
33550 * GeoJSON based on parameters passed from the main-thread Source.
33551 * See {@link GeoJSONWorkerSource#loadGeoJSON}.
33552 * @private
33553 */
33554 constructor(actor, layerIndex, availableImages, loadGeoJSON) {
33555 super(actor, layerIndex, availableImages, loadGeoJSONTile);
33556 if (loadGeoJSON) {
33557 this.loadGeoJSON = loadGeoJSON;
33558 }
33559 }
33560 /**
33561 * Fetches (if appropriate), parses, and index geojson data into tiles. This
33562 * preparatory method must be called before {@link GeoJSONWorkerSource#loadTile}
33563 * can correctly serve up tiles.
33564 *
33565 * Defers to {@link GeoJSONWorkerSource#loadGeoJSON} for the fetching/parsing,
33566 * expecting `callback(error, data)` to be called with either an error or a
33567 * parsed GeoJSON object.
33568 *
33569 * When `loadData` requests come in faster than they can be processed,
33570 * they are coalesced into a single request using the latest data.
33571 * See {@link GeoJSONWorkerSource#coalesce}
33572 *
33573 * @param params
33574 * @param callback
33575 * @private
33576 */
33577 loadData(params, callback) {
33578 if (this._pendingCallback) {
33579 // Tell the foreground the previous call has been abandoned
33580 this._pendingCallback(null, { abandoned: true });
33581 }
33582 this._pendingCallback = callback;
33583 this._pendingLoadDataParams = params;
33584 if (this._state &&
33585 this._state !== 'Idle') {
33586 this._state = 'NeedsLoadData';
33587 }
33588 else {
33589 this._state = 'Coalescing';
33590 this._loadData();
33591 }
33592 }
33593 /**
33594 * Internal implementation: called directly by `loadData`
33595 * or by `coalesce` using stored parameters.
33596 */
33597 _loadData() {
33598 if (!this._pendingCallback || !this._pendingLoadDataParams) {
33599 performance.assert(false);
33600 return;
33601 }
33602 const callback = this._pendingCallback;
33603 const params = this._pendingLoadDataParams;
33604 delete this._pendingCallback;
33605 delete this._pendingLoadDataParams;
33606 const perf = (params && params.request && params.request.collectResourceTiming) ?
33607 new performance.RequestPerformance(params.request) : false;
33608 this.loadGeoJSON(params, (err, data) => {
33609 if (err || !data) {
33610 return callback(err);
33611 }
33612 else if (typeof data !== 'object') {
33613 return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`));
33614 }
33615 else {
33616 geojsonRewind(data, true);
33617 try {
33618 if (params.filter) {
33619 const compiled = performance.createExpression(params.filter, { type: 'boolean', 'property-type': 'data-driven', overridable: false, transition: false });
33620 if (compiled.result === 'error')
33621 throw new Error(compiled.value.map(err => `${err.key}: ${err.message}`).join(', '));
33622 const features = data.features.filter(feature => compiled.value.evaluate({ zoom: 0 }, feature));
33623 data = { type: 'FeatureCollection', features };
33624 }
33625 this._geoJSONIndex = params.cluster ?
33626 new Supercluster(getSuperclusterOptions(params)).load(data.features) :
33627 geojsonvt(data, params.geojsonVtOptions);
33628 }
33629 catch (err) {
33630 return callback(err);
33631 }
33632 this.loaded = {};
33633 const result = {};
33634 if (perf) {
33635 const resourceTimingData = perf.finish();
33636 // it's necessary to eval the result of getEntriesByName() here via parse/stringify
33637 // late evaluation in the main thread causes TypeError: illegal invocation
33638 if (resourceTimingData) {
33639 result.resourceTiming = {};
33640 result.resourceTiming[params.source] = JSON.parse(JSON.stringify(resourceTimingData));
33641 }
33642 }
33643 callback(null, result);
33644 }
33645 });
33646 }
33647 /**
33648 * While processing `loadData`, we coalesce all further
33649 * `loadData` messages into a single call to _loadData
33650 * that will happen once we've finished processing the
33651 * first message. {@link GeoJSONSource#_updateWorkerData}
33652 * is responsible for sending us the `coalesce` message
33653 * at the time it receives a response from `loadData`
33654 *
33655 * State: Idle
33656 * ↑ |
33657 * 'coalesce' 'loadData'
33658 * | (triggers load)
33659 * | ↓
33660 * State: Coalescing
33661 * ↑ |
33662 * (triggers load) |
33663 * 'coalesce' 'loadData'
33664 * | ↓
33665 * State: NeedsLoadData
33666 */
33667 coalesce() {
33668 if (this._state === 'Coalescing') {
33669 this._state = 'Idle';
33670 }
33671 else if (this._state === 'NeedsLoadData') {
33672 this._state = 'Coalescing';
33673 this._loadData();
33674 }
33675 }
33676 /**
33677 * Implements {@link WorkerSource#reloadTile}.
33678 *
33679 * If the tile is loaded, uses the implementation in VectorTileWorkerSource.
33680 * Otherwise, such as after a setData() call, we load the tile fresh.
33681 *
33682 * @param params
33683 * @param params.uid The UID for this tile.
33684 * @private
33685 */
33686 reloadTile(params, callback) {
33687 const loaded = this.loaded, uid = params.uid;
33688 if (loaded && loaded[uid]) {
33689 return super.reloadTile(params, callback);
33690 }
33691 else {
33692 return this.loadTile(params, callback);
33693 }
33694 }
33695 /**
33696 * Fetch and parse GeoJSON according to the given params. Calls `callback`
33697 * with `(err, data)`, where `data` is a parsed GeoJSON object.
33698 *
33699 * GeoJSON is loaded and parsed from `params.url` if it exists, or else
33700 * expected as a literal (string or object) `params.data`.
33701 *
33702 * @param params
33703 * @param [params.url] A URL to the remote GeoJSON data.
33704 * @param [params.data] Literal GeoJSON data. Must be provided if `params.url` is not.
33705 * @private
33706 */
33707 loadGeoJSON(params, callback) {
33708 // Because of same origin issues, urls must either include an explicit
33709 // origin or absolute path.
33710 // ie: /foo/bar.json or http://example.com/bar.json
33711 // but not ../foo/bar.json
33712 if (params.request) {
33713 performance.getJSON(params.request, callback);
33714 }
33715 else if (typeof params.data === 'string') {
33716 try {
33717 return callback(null, JSON.parse(params.data));
33718 }
33719 catch (e) {
33720 return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`));
33721 }
33722 }
33723 else {
33724 return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`));
33725 }
33726 }
33727 removeSource(params, callback) {
33728 if (this._pendingCallback) {
33729 // Don't leak callbacks
33730 this._pendingCallback(null, { abandoned: true });
33731 }
33732 callback();
33733 }
33734 getClusterExpansionZoom(params, callback) {
33735 try {
33736 callback(null, this._geoJSONIndex.getClusterExpansionZoom(params.clusterId));
33737 }
33738 catch (e) {
33739 callback(e);
33740 }
33741 }
33742 getClusterChildren(params, callback) {
33743 try {
33744 callback(null, this._geoJSONIndex.getChildren(params.clusterId));
33745 }
33746 catch (e) {
33747 callback(e);
33748 }
33749 }
33750 getClusterLeaves(params, callback) {
33751 try {
33752 callback(null, this._geoJSONIndex.getLeaves(params.clusterId, params.limit, params.offset));
33753 }
33754 catch (e) {
33755 callback(e);
33756 }
33757 }
33758}
33759function getSuperclusterOptions({ superclusterOptions, clusterProperties }) {
33760 if (!clusterProperties || !superclusterOptions)
33761 return superclusterOptions;
33762 const mapExpressions = {};
33763 const reduceExpressions = {};
33764 const globals = { accumulated: null, zoom: 0 };
33765 const feature = { properties: null };
33766 const propertyNames = Object.keys(clusterProperties);
33767 for (const key of propertyNames) {
33768 const [operator, mapExpression] = clusterProperties[key];
33769 const mapExpressionParsed = performance.createExpression(mapExpression);
33770 const reduceExpressionParsed = performance.createExpression(typeof operator === 'string' ? [operator, ['accumulated'], ['get', key]] : operator);
33771 performance.assert(mapExpressionParsed.result === 'success');
33772 performance.assert(reduceExpressionParsed.result === 'success');
33773 mapExpressions[key] = mapExpressionParsed.value;
33774 reduceExpressions[key] = reduceExpressionParsed.value;
33775 }
33776 superclusterOptions.map = (pointProperties) => {
33777 feature.properties = pointProperties;
33778 const properties = {};
33779 for (const key of propertyNames) {
33780 properties[key] = mapExpressions[key].evaluate(globals, feature);
33781 }
33782 return properties;
33783 };
33784 superclusterOptions.reduce = (accumulated, clusterProperties) => {
33785 feature.properties = clusterProperties;
33786 for (const key of propertyNames) {
33787 globals.accumulated = accumulated[key];
33788 accumulated[key] = reduceExpressions[key].evaluate(globals, feature);
33789 }
33790 };
33791 return superclusterOptions;
33792}
33793
33794/**
33795 * @private
33796 */
33797class Worker {
33798 constructor(self) {
33799 this.self = self;
33800 this.actor = new performance.Actor(self, this);
33801 this.layerIndexes = {};
33802 this.availableImages = {};
33803 this.workerSourceTypes = {
33804 vector: VectorTileWorkerSource,
33805 geojson: GeoJSONWorkerSource
33806 };
33807 // [mapId][sourceType][sourceName] => worker source instance
33808 this.workerSources = {};
33809 this.demWorkerSources = {};
33810 this.self.registerWorkerSource = (name, WorkerSource) => {
33811 if (this.workerSourceTypes[name]) {
33812 throw new Error(`Worker source with name "${name}" already registered.`);
33813 }
33814 this.workerSourceTypes[name] = WorkerSource;
33815 };
33816 // This is invoked by the RTL text plugin when the download via the `importScripts` call has finished, and the code has been parsed.
33817 this.self.registerRTLTextPlugin = (rtlTextPlugin) => {
33818 if (performance.plugin.isParsed()) {
33819 throw new Error('RTL text plugin already registered.');
33820 }
33821 performance.plugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping;
33822 performance.plugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText;
33823 performance.plugin['processStyledBidirectionalText'] = rtlTextPlugin.processStyledBidirectionalText;
33824 };
33825 }
33826 setReferrer(mapID, referrer) {
33827 this.referrer = referrer;
33828 }
33829 setImages(mapId, images, callback) {
33830 this.availableImages[mapId] = images;
33831 for (const workerSource in this.workerSources[mapId]) {
33832 const ws = this.workerSources[mapId][workerSource];
33833 for (const source in ws) {
33834 ws[source].availableImages = images;
33835 }
33836 }
33837 callback();
33838 }
33839 setLayers(mapId, layers, callback) {
33840 this.getLayerIndex(mapId).replace(layers);
33841 callback();
33842 }
33843 updateLayers(mapId, params, callback) {
33844 this.getLayerIndex(mapId).update(params.layers, params.removedIds);
33845 callback();
33846 }
33847 loadTile(mapId, params, callback) {
33848 performance.assert(params.type);
33849 this.getWorkerSource(mapId, params.type, params.source).loadTile(params, callback);
33850 }
33851 loadDEMTile(mapId, params, callback) {
33852 this.getDEMWorkerSource(mapId, params.source).loadTile(params, callback);
33853 }
33854 reloadTile(mapId, params, callback) {
33855 performance.assert(params.type);
33856 this.getWorkerSource(mapId, params.type, params.source).reloadTile(params, callback);
33857 }
33858 abortTile(mapId, params, callback) {
33859 performance.assert(params.type);
33860 this.getWorkerSource(mapId, params.type, params.source).abortTile(params, callback);
33861 }
33862 removeTile(mapId, params, callback) {
33863 performance.assert(params.type);
33864 this.getWorkerSource(mapId, params.type, params.source).removeTile(params, callback);
33865 }
33866 removeDEMTile(mapId, params) {
33867 this.getDEMWorkerSource(mapId, params.source).removeTile(params);
33868 }
33869 removeSource(mapId, params, callback) {
33870 performance.assert(params.type);
33871 performance.assert(params.source);
33872 if (!this.workerSources[mapId] ||
33873 !this.workerSources[mapId][params.type] ||
33874 !this.workerSources[mapId][params.type][params.source]) {
33875 return;
33876 }
33877 const worker = this.workerSources[mapId][params.type][params.source];
33878 delete this.workerSources[mapId][params.type][params.source];
33879 if (worker.removeSource !== undefined) {
33880 worker.removeSource(params, callback);
33881 }
33882 else {
33883 callback();
33884 }
33885 }
33886 /**
33887 * Load a {@link WorkerSource} script at params.url. The script is run
33888 * (using importScripts) with `registerWorkerSource` in scope, which is a
33889 * function taking `(name, workerSourceObject)`.
33890 * @private
33891 */
33892 loadWorkerSource(map, params, callback) {
33893 try {
33894 this.self.importScripts(params.url);
33895 callback();
33896 }
33897 catch (e) {
33898 callback(e.toString());
33899 }
33900 }
33901 syncRTLPluginState(map, state, callback) {
33902 try {
33903 performance.plugin.setState(state);
33904 const pluginURL = performance.plugin.getPluginURL();
33905 if (performance.plugin.isLoaded() &&
33906 !performance.plugin.isParsed() &&
33907 pluginURL != null // Not possible when `isLoaded` is true, but keeps flow happy
33908 ) {
33909 this.self.importScripts(pluginURL);
33910 const complete = performance.plugin.isParsed();
33911 const error = complete ? undefined : new Error(`RTL Text Plugin failed to import scripts from ${pluginURL}`);
33912 callback(error, complete);
33913 }
33914 }
33915 catch (e) {
33916 callback(e.toString());
33917 }
33918 }
33919 getAvailableImages(mapId) {
33920 let availableImages = this.availableImages[mapId];
33921 if (!availableImages) {
33922 availableImages = [];
33923 }
33924 return availableImages;
33925 }
33926 getLayerIndex(mapId) {
33927 let layerIndexes = this.layerIndexes[mapId];
33928 if (!layerIndexes) {
33929 layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex();
33930 }
33931 return layerIndexes;
33932 }
33933 getWorkerSource(mapId, type, source) {
33934 if (!this.workerSources[mapId])
33935 this.workerSources[mapId] = {};
33936 if (!this.workerSources[mapId][type])
33937 this.workerSources[mapId][type] = {};
33938 if (!this.workerSources[mapId][type][source]) {
33939 // use a wrapped actor so that we can attach a target mapId param
33940 // to any messages invoked by the WorkerSource
33941 const actor = {
33942 send: (type, data, callback) => {
33943 this.actor.send(type, data, callback, mapId);
33944 }
33945 };
33946 this.workerSources[mapId][type][source] = new this.workerSourceTypes[type](actor, this.getLayerIndex(mapId), this.getAvailableImages(mapId));
33947 }
33948 return this.workerSources[mapId][type][source];
33949 }
33950 getDEMWorkerSource(mapId, source) {
33951 if (!this.demWorkerSources[mapId])
33952 this.demWorkerSources[mapId] = {};
33953 if (!this.demWorkerSources[mapId][source]) {
33954 this.demWorkerSources[mapId][source] = new RasterDEMTileWorkerSource();
33955 }
33956 return this.demWorkerSources[mapId][source];
33957 }
33958 enforceCacheSizeLimit(mapId, limit) {
33959 performance.enforceCacheSizeLimit(limit);
33960 }
33961}
33962/* global self, WorkerGlobalScope */
33963if (typeof WorkerGlobalScope !== 'undefined' &&
33964 typeof self !== 'undefined' &&
33965 self instanceof WorkerGlobalScope) {
33966 self.worker = new Worker(self);
33967}
33968
33969return Worker;
33970
33971}));
33972
33973define(['./shared'], (function (performance) { 'use strict';
33974
33975var mapboxGlSupported = {};
33976
33977'use strict';
33978
33979var supported = mapboxGlSupported.supported = isSupported;
33980var notSupportedReason_1 = mapboxGlSupported.notSupportedReason = notSupportedReason;
33981
33982/**
33983 * Test whether the current browser supports Mapbox GL JS
33984 * @param {Object} options
33985 * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`
33986 * if the performance of Mapbox GL JS would be dramatically worse than
33987 * expected (i.e. a software renderer is would be used)
33988 * @return {boolean}
33989 */
33990function isSupported(options) {
33991 return !notSupportedReason(options);
33992}
33993
33994function notSupportedReason(options) {
33995 if (!isBrowser()) return 'not a browser';
33996 if (!isArraySupported()) return 'insufficent Array support';
33997 if (!isFunctionSupported()) return 'insufficient Function support';
33998 if (!isObjectSupported()) return 'insufficient Object support';
33999 if (!isJSONSupported()) return 'insufficient JSON support';
34000 if (!isWorkerSupported()) return 'insufficient worker support';
34001 if (!isUint8ClampedArraySupported()) return 'insufficient Uint8ClampedArray support';
34002 if (!isArrayBufferSupported()) return 'insufficient ArrayBuffer support';
34003 if (!isCanvasGetImageDataSupported()) return 'insufficient Canvas/getImageData support';
34004 if (!isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)) return 'insufficient WebGL support';
34005 if (!isNotIE()) return 'insufficient ECMAScript 6 support';
34006}
34007
34008function isBrowser() {
34009 return typeof window !== 'undefined' && typeof document !== 'undefined';
34010}
34011
34012function isArraySupported() {
34013 return (
34014 Array.prototype &&
34015 Array.prototype.every &&
34016 Array.prototype.filter &&
34017 Array.prototype.forEach &&
34018 Array.prototype.indexOf &&
34019 Array.prototype.lastIndexOf &&
34020 Array.prototype.map &&
34021 Array.prototype.some &&
34022 Array.prototype.reduce &&
34023 Array.prototype.reduceRight &&
34024 Array.isArray
34025 );
34026}
34027
34028function isFunctionSupported() {
34029 return Function.prototype && Function.prototype.bind;
34030}
34031
34032function isObjectSupported() {
34033 return (
34034 Object.keys &&
34035 Object.create &&
34036 Object.getPrototypeOf &&
34037 Object.getOwnPropertyNames &&
34038 Object.isSealed &&
34039 Object.isFrozen &&
34040 Object.isExtensible &&
34041 Object.getOwnPropertyDescriptor &&
34042 Object.defineProperty &&
34043 Object.defineProperties &&
34044 Object.seal &&
34045 Object.freeze &&
34046 Object.preventExtensions
34047 );
34048}
34049
34050function isJSONSupported() {
34051 return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON;
34052}
34053
34054function isWorkerSupported() {
34055 if (!('Worker' in window && 'Blob' in window && 'URL' in window)) {
34056 return false;
34057 }
34058
34059 var blob = new Blob([''], { type: 'text/javascript' });
34060 var workerURL = URL.createObjectURL(blob);
34061 var supported;
34062 var worker;
34063
34064 try {
34065 worker = new Worker(workerURL);
34066 supported = true;
34067 } catch (e) {
34068 supported = false;
34069 }
34070
34071 if (worker) {
34072 worker.terminate();
34073 }
34074 URL.revokeObjectURL(workerURL);
34075
34076 return supported;
34077}
34078
34079// IE11 only supports `Uint8ClampedArray` as of version
34080// [KB2929437](https://support.microsoft.com/en-us/kb/2929437)
34081function isUint8ClampedArraySupported() {
34082 return 'Uint8ClampedArray' in window;
34083}
34084
34085// https://github.com/mapbox/mapbox-gl-supported/issues/19
34086function isArrayBufferSupported() {
34087 return ArrayBuffer.isView;
34088}
34089
34090// Some browsers or browser extensions block access to canvas data to prevent fingerprinting.
34091// Mapbox GL uses this API to load sprites and images in general.
34092function isCanvasGetImageDataSupported() {
34093 var canvas = document.createElement('canvas');
34094 canvas.width = canvas.height = 1;
34095 var context = canvas.getContext('2d');
34096 if (!context) {
34097 return false;
34098 }
34099 var imageData = context.getImageData(0, 0, 1, 1);
34100 return imageData && imageData.width === canvas.width;
34101}
34102
34103var isWebGLSupportedCache = {};
34104function isWebGLSupportedCached(failIfMajorPerformanceCaveat) {
34105
34106 if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) {
34107 isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat);
34108 }
34109
34110 return isWebGLSupportedCache[failIfMajorPerformanceCaveat];
34111}
34112
34113isSupported.webGLContextAttributes = {
34114 antialias: false,
34115 alpha: true,
34116 stencil: true,
34117 depth: true
34118};
34119
34120function getWebGLContext(failIfMajorPerformanceCaveat) {
34121 var canvas = document.createElement('canvas');
34122
34123 var attributes = Object.create(isSupported.webGLContextAttributes);
34124 attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;
34125
34126 return (
34127 canvas.getContext('webgl', attributes) ||
34128 canvas.getContext('experimental-webgl', attributes)
34129 );
34130}
34131
34132function isWebGLSupported(failIfMajorPerformanceCaveat) {
34133 var gl = getWebGLContext(failIfMajorPerformanceCaveat);
34134 if (!gl) {
34135 return false;
34136 }
34137
34138 // Try compiling a shader and get its compile status. Some browsers like Brave block this API
34139 // to prevent fingerprinting. Unfortunately, this also means that Mapbox GL won't work.
34140 var shader;
34141 try {
34142 shader = gl.createShader(gl.VERTEX_SHADER);
34143 } catch (e) {
34144 // some older browsers throw an exception that `createShader` is not defined
34145 // so handle this separately from the case where browsers block `createShader`
34146 // for security reasons
34147 return false;
34148 }
34149
34150 if (!shader || gl.isContextLost()) {
34151 return false;
34152 }
34153 gl.shaderSource(shader, 'void main() {}');
34154 gl.compileShader(shader);
34155 return gl.getShaderParameter(shader, gl.COMPILE_STATUS) === true;
34156}
34157
34158function isNotIE() {
34159 return !document.documentMode;
34160}
34161
34162class DOM {
34163 static testProp(props) {
34164 if (!DOM.docStyle)
34165 return props[0];
34166 for (let i = 0; i < props.length; i++) {
34167 if (props[i] in DOM.docStyle) {
34168 return props[i];
34169 }
34170 }
34171 return props[0];
34172 }
34173 static create(tagName, className, container) {
34174 const el = window.document.createElement(tagName);
34175 if (className !== undefined)
34176 el.className = className;
34177 if (container)
34178 container.appendChild(el);
34179 return el;
34180 }
34181 static createNS(namespaceURI, tagName) {
34182 const el = window.document.createElementNS(namespaceURI, tagName);
34183 return el;
34184 }
34185 static disableDrag() {
34186 if (DOM.docStyle && DOM.selectProp) {
34187 DOM.userSelect = DOM.docStyle[DOM.selectProp];
34188 DOM.docStyle[DOM.selectProp] = 'none';
34189 }
34190 }
34191 static enableDrag() {
34192 if (DOM.docStyle && DOM.selectProp) {
34193 DOM.docStyle[DOM.selectProp] = DOM.userSelect;
34194 }
34195 }
34196 static setTransform(el, value) {
34197 el.style[DOM.transformProp] = value;
34198 }
34199 static addEventListener(target, type, callback, options = {}) {
34200 if ('passive' in options) {
34201 target.addEventListener(type, callback, options);
34202 }
34203 else {
34204 target.addEventListener(type, callback, options.capture);
34205 }
34206 }
34207 static removeEventListener(target, type, callback, options = {}) {
34208 if ('passive' in options) {
34209 target.removeEventListener(type, callback, options);
34210 }
34211 else {
34212 target.removeEventListener(type, callback, options.capture);
34213 }
34214 }
34215 // Suppress the next click, but only if it's immediate.
34216 static suppressClickInternal(e) {
34217 e.preventDefault();
34218 e.stopPropagation();
34219 window.removeEventListener('click', DOM.suppressClickInternal, true);
34220 }
34221 static suppressClick() {
34222 window.addEventListener('click', DOM.suppressClickInternal, true);
34223 window.setTimeout(() => {
34224 window.removeEventListener('click', DOM.suppressClickInternal, true);
34225 }, 0);
34226 }
34227 static mousePos(el, e) {
34228 const rect = el.getBoundingClientRect();
34229 return new performance.pointGeometry(e.clientX - rect.left - el.clientLeft, e.clientY - rect.top - el.clientTop);
34230 }
34231 static touchPos(el, touches) {
34232 const rect = el.getBoundingClientRect();
34233 const points = [];
34234 for (let i = 0; i < touches.length; i++) {
34235 points.push(new performance.pointGeometry(touches[i].clientX - rect.left - el.clientLeft, touches[i].clientY - rect.top - el.clientTop));
34236 }
34237 return points;
34238 }
34239 static mouseButton(e) {
34240 performance.assert(e.type === 'mousedown' || e.type === 'mouseup');
34241 return e.button;
34242 }
34243 static remove(node) {
34244 if (node.parentNode) {
34245 node.parentNode.removeChild(node);
34246 }
34247 }
34248}
34249DOM.docStyle = typeof window !== 'undefined' && window.document && window.document.documentElement.style;
34250DOM.selectProp = DOM.testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']);
34251DOM.transformProp = DOM.testProp(['transform', 'WebkitTransform']);
34252
34253class RequestManager {
34254 constructor(transformRequestFn) {
34255 this._transformRequestFn = transformRequestFn;
34256 }
34257 transformRequest(url, type) {
34258 if (this._transformRequestFn) {
34259 return this._transformRequestFn(url, type) || { url };
34260 }
34261 return { url };
34262 }
34263 normalizeSpriteURL(url, format, extension) {
34264 const urlObject = parseUrl(url);
34265 urlObject.path += `${format}${extension}`;
34266 return formatUrl(urlObject);
34267 }
34268 setTransformRequest(transformRequest) {
34269 this._transformRequestFn = transformRequest;
34270 }
34271}
34272const urlRe = /^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/;
34273function parseUrl(url) {
34274 const parts = url.match(urlRe);
34275 if (!parts) {
34276 throw new Error(`Unable to parse URL "${url}"`);
34277 }
34278 return {
34279 protocol: parts[1],
34280 authority: parts[2],
34281 path: parts[3] || '/',
34282 params: parts[4] ? parts[4].split('&') : []
34283 };
34284}
34285function formatUrl(obj) {
34286 const params = obj.params.length ? `?${obj.params.join('&')}` : '';
34287 return `${obj.protocol}://${obj.authority}${obj.path}${params}`;
34288}
34289
34290function loadSprite (baseURL, requestManager, pixelRatio, callback) {
34291 let json, image, error;
34292 const format = pixelRatio > 1 ? '@2x' : '';
34293 let jsonRequest = performance.getJSON(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.json'), performance.ResourceType.SpriteJSON), (err, data) => {
34294 jsonRequest = null;
34295 if (!error) {
34296 error = err;
34297 json = data;
34298 maybeComplete();
34299 }
34300 });
34301 let imageRequest = performance.getImage(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.png'), performance.ResourceType.SpriteImage), (err, img) => {
34302 imageRequest = null;
34303 if (!error) {
34304 error = err;
34305 image = img;
34306 maybeComplete();
34307 }
34308 });
34309 function maybeComplete() {
34310 if (error) {
34311 callback(error);
34312 }
34313 else if (json && image) {
34314 const imageData = performance.exported.getImageData(image);
34315 const result = {};
34316 for (const id in json) {
34317 const { width, height, x, y, sdf, pixelRatio, stretchX, stretchY, content } = json[id];
34318 const data = new performance.RGBAImage({ width, height });
34319 performance.RGBAImage.copy(imageData, data, { x, y }, { x: 0, y: 0 }, { width, height });
34320 result[id] = { data, pixelRatio, sdf, stretchX, stretchY, content };
34321 }
34322 callback(null, result);
34323 }
34324 }
34325 return {
34326 cancel() {
34327 if (jsonRequest) {
34328 jsonRequest.cancel();
34329 jsonRequest = null;
34330 }
34331 if (imageRequest) {
34332 imageRequest.cancel();
34333 imageRequest = null;
34334 }
34335 }
34336 };
34337}
34338
34339class Texture {
34340 constructor(context, image, format, options) {
34341 this.context = context;
34342 this.format = format;
34343 this.texture = context.gl.createTexture();
34344 this.update(image, options);
34345 }
34346 update(image, options, position) {
34347 const { width, height } = image;
34348 const resize = (!this.size || this.size[0] !== width || this.size[1] !== height) && !position;
34349 const { context } = this;
34350 const { gl } = context;
34351 this.useMipmap = Boolean(options && options.useMipmap);
34352 gl.bindTexture(gl.TEXTURE_2D, this.texture);
34353 context.pixelStoreUnpackFlipY.set(false);
34354 context.pixelStoreUnpack.set(1);
34355 context.pixelStoreUnpackPremultiplyAlpha.set(this.format === gl.RGBA && (!options || options.premultiply !== false));
34356 if (resize) {
34357 this.size = [width, height];
34358 if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || performance.isImageBitmap(image)) {
34359 gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.format, gl.UNSIGNED_BYTE, image);
34360 }
34361 else {
34362 gl.texImage2D(gl.TEXTURE_2D, 0, this.format, width, height, 0, this.format, gl.UNSIGNED_BYTE, image.data);
34363 }
34364 }
34365 else {
34366 const { x, y } = position || { x: 0, y: 0 };
34367 if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || performance.isImageBitmap(image)) {
34368 gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, image);
34369 }
34370 else {
34371 gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, image.data);
34372 }
34373 }
34374 if (this.useMipmap && this.isSizePowerOfTwo()) {
34375 gl.generateMipmap(gl.TEXTURE_2D);
34376 }
34377 }
34378 bind(filter, wrap, minFilter) {
34379 const { context } = this;
34380 const { gl } = context;
34381 gl.bindTexture(gl.TEXTURE_2D, this.texture);
34382 if (minFilter === gl.LINEAR_MIPMAP_NEAREST && !this.isSizePowerOfTwo()) {
34383 minFilter = gl.LINEAR;
34384 }
34385 if (filter !== this.filter) {
34386 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
34387 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter || filter);
34388 this.filter = filter;
34389 }
34390 if (wrap !== this.wrap) {
34391 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);
34392 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);
34393 this.wrap = wrap;
34394 }
34395 }
34396 isSizePowerOfTwo() {
34397 return this.size[0] === this.size[1] && (Math.log(this.size[0]) / Math.LN2) % 1 === 0;
34398 }
34399 destroy() {
34400 const { gl } = this.context;
34401 gl.deleteTexture(this.texture);
34402 this.texture = null;
34403 }
34404}
34405
34406function renderStyleImage(image) {
34407 const { userImage } = image;
34408 if (userImage && userImage.render) {
34409 const updated = userImage.render();
34410 if (updated) {
34411 image.data.replace(new Uint8Array(userImage.data.buffer));
34412 return true;
34413 }
34414 }
34415 return false;
34416}
34417
34418// When copied into the atlas texture, image data is padded by one pixel on each side. Icon
34419// images are padded with fully transparent pixels, while pattern images are padded with a
34420// copy of the image data wrapped from the opposite side. In both cases, this ensures the
34421// correct behavior of GL_LINEAR texture sampling mode.
34422const padding = 1;
34423/*
34424 ImageManager does three things:
34425
34426 1. Tracks requests for icon images from tile workers and sends responses when the requests are fulfilled.
34427 2. Builds a texture atlas for pattern images.
34428 3. Rerenders renderable images once per frame
34429
34430 These are disparate responsibilities and should eventually be handled by different classes. When we implement
34431 data-driven support for `*-pattern`, we'll likely use per-bucket pattern atlases, and that would be a good time
34432 to refactor this.
34433*/
34434class ImageManager extends performance.Evented {
34435 constructor() {
34436 super();
34437 this.images = {};
34438 this.updatedImages = {};
34439 this.callbackDispatchedThisFrame = {};
34440 this.loaded = false;
34441 this.requestors = [];
34442 this.patterns = {};
34443 this.atlasImage = new performance.RGBAImage({ width: 1, height: 1 });
34444 this.dirty = true;
34445 }
34446 isLoaded() {
34447 return this.loaded;
34448 }
34449 setLoaded(loaded) {
34450 if (this.loaded === loaded) {
34451 return;
34452 }
34453 this.loaded = loaded;
34454 if (loaded) {
34455 for (const { ids, callback } of this.requestors) {
34456 this._notify(ids, callback);
34457 }
34458 this.requestors = [];
34459 }
34460 }
34461 getImage(id) {
34462 return this.images[id];
34463 }
34464 addImage(id, image) {
34465 performance.assert(!this.images[id]);
34466 if (this._validate(id, image)) {
34467 this.images[id] = image;
34468 }
34469 }
34470 _validate(id, image) {
34471 let valid = true;
34472 if (!this._validateStretch(image.stretchX, image.data && image.data.width)) {
34473 this.fire(new performance.ErrorEvent(new Error(`Image "${id}" has invalid "stretchX" value`)));
34474 valid = false;
34475 }
34476 if (!this._validateStretch(image.stretchY, image.data && image.data.height)) {
34477 this.fire(new performance.ErrorEvent(new Error(`Image "${id}" has invalid "stretchY" value`)));
34478 valid = false;
34479 }
34480 if (!this._validateContent(image.content, image)) {
34481 this.fire(new performance.ErrorEvent(new Error(`Image "${id}" has invalid "content" value`)));
34482 valid = false;
34483 }
34484 return valid;
34485 }
34486 _validateStretch(stretch, size) {
34487 if (!stretch)
34488 return true;
34489 let last = 0;
34490 for (const part of stretch) {
34491 if (part[0] < last || part[1] < part[0] || size < part[1])
34492 return false;
34493 last = part[1];
34494 }
34495 return true;
34496 }
34497 _validateContent(content, image) {
34498 if (!content)
34499 return true;
34500 if (content.length !== 4)
34501 return false;
34502 if (content[0] < 0 || image.data.width < content[0])
34503 return false;
34504 if (content[1] < 0 || image.data.height < content[1])
34505 return false;
34506 if (content[2] < 0 || image.data.width < content[2])
34507 return false;
34508 if (content[3] < 0 || image.data.height < content[3])
34509 return false;
34510 if (content[2] < content[0])
34511 return false;
34512 if (content[3] < content[1])
34513 return false;
34514 return true;
34515 }
34516 updateImage(id, image) {
34517 const oldImage = this.images[id];
34518 performance.assert(oldImage);
34519 performance.assert(oldImage.data.width === image.data.width);
34520 performance.assert(oldImage.data.height === image.data.height);
34521 image.version = oldImage.version + 1;
34522 this.images[id] = image;
34523 this.updatedImages[id] = true;
34524 }
34525 removeImage(id) {
34526 performance.assert(this.images[id]);
34527 const image = this.images[id];
34528 delete this.images[id];
34529 delete this.patterns[id];
34530 if (image.userImage && image.userImage.onRemove) {
34531 image.userImage.onRemove();
34532 }
34533 }
34534 listImages() {
34535 return Object.keys(this.images);
34536 }
34537 getImages(ids, callback) {
34538 // If the sprite has been loaded, or if all the icon dependencies are already present
34539 // (i.e. if they've been added via runtime styling), then notify the requestor immediately.
34540 // Otherwise, delay notification until the sprite is loaded. At that point, if any of the
34541 // dependencies are still unavailable, we'll just assume they are permanently missing.
34542 let hasAllDependencies = true;
34543 if (!this.isLoaded()) {
34544 for (const id of ids) {
34545 if (!this.images[id]) {
34546 hasAllDependencies = false;
34547 }
34548 }
34549 }
34550 if (this.isLoaded() || hasAllDependencies) {
34551 this._notify(ids, callback);
34552 }
34553 else {
34554 this.requestors.push({ ids, callback });
34555 }
34556 }
34557 _notify(ids, callback) {
34558 const response = {};
34559 for (const id of ids) {
34560 if (!this.images[id]) {
34561 this.fire(new performance.Event('styleimagemissing', { id }));
34562 }
34563 const image = this.images[id];
34564 if (image) {
34565 // Clone the image so that our own copy of its ArrayBuffer doesn't get transferred.
34566 response[id] = {
34567 data: image.data.clone(),
34568 pixelRatio: image.pixelRatio,
34569 sdf: image.sdf,
34570 version: image.version,
34571 stretchX: image.stretchX,
34572 stretchY: image.stretchY,
34573 content: image.content,
34574 hasRenderCallback: Boolean(image.userImage && image.userImage.render)
34575 };
34576 }
34577 else {
34578 performance.warnOnce(`Image "${id}" could not be loaded. Please make sure you have added the image with map.addImage() or a "sprite" property in your style. You can provide missing images by listening for the "styleimagemissing" map event.`);
34579 }
34580 }
34581 callback(null, response);
34582 }
34583 // Pattern stuff
34584 getPixelSize() {
34585 const { width, height } = this.atlasImage;
34586 return { width, height };
34587 }
34588 getPattern(id) {
34589 const pattern = this.patterns[id];
34590 const image = this.getImage(id);
34591 if (!image) {
34592 return null;
34593 }
34594 if (pattern && pattern.position.version === image.version) {
34595 return pattern.position;
34596 }
34597 if (!pattern) {
34598 const w = image.data.width + padding * 2;
34599 const h = image.data.height + padding * 2;
34600 const bin = { w, h, x: 0, y: 0 };
34601 const position = new performance.ImagePosition(bin, image);
34602 this.patterns[id] = { bin, position };
34603 }
34604 else {
34605 pattern.position.version = image.version;
34606 }
34607 this._updatePatternAtlas();
34608 return this.patterns[id].position;
34609 }
34610 bind(context) {
34611 const gl = context.gl;
34612 if (!this.atlasTexture) {
34613 this.atlasTexture = new Texture(context, this.atlasImage, gl.RGBA);
34614 }
34615 else if (this.dirty) {
34616 this.atlasTexture.update(this.atlasImage);
34617 this.dirty = false;
34618 }
34619 this.atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
34620 }
34621 _updatePatternAtlas() {
34622 const bins = [];
34623 for (const id in this.patterns) {
34624 bins.push(this.patterns[id].bin);
34625 }
34626 const { w, h } = performance.potpack(bins);
34627 const dst = this.atlasImage;
34628 dst.resize({ width: w || 1, height: h || 1 });
34629 for (const id in this.patterns) {
34630 const { bin } = this.patterns[id];
34631 const x = bin.x + padding;
34632 const y = bin.y + padding;
34633 const src = this.images[id].data;
34634 const w = src.width;
34635 const h = src.height;
34636 performance.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x, y }, { width: w, height: h });
34637 // Add 1 pixel wrapped padding on each side of the image.
34638 performance.RGBAImage.copy(src, dst, { x: 0, y: h - 1 }, { x, y: y - 1 }, { width: w, height: 1 }); // T
34639 performance.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x, y: y + h }, { width: w, height: 1 }); // B
34640 performance.RGBAImage.copy(src, dst, { x: w - 1, y: 0 }, { x: x - 1, y }, { width: 1, height: h }); // L
34641 performance.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x + w, y }, { width: 1, height: h }); // R
34642 }
34643 this.dirty = true;
34644 }
34645 beginFrame() {
34646 this.callbackDispatchedThisFrame = {};
34647 }
34648 dispatchRenderCallbacks(ids) {
34649 for (const id of ids) {
34650 // the callback for the image was already dispatched for a different frame
34651 if (this.callbackDispatchedThisFrame[id])
34652 continue;
34653 this.callbackDispatchedThisFrame[id] = true;
34654 const image = this.images[id];
34655 performance.assert(image);
34656 const updated = renderStyleImage(image);
34657 if (updated) {
34658 this.updateImage(id, image);
34659 }
34660 }
34661 }
34662}
34663
34664function loadGlyphRange(fontstack, range, urlTemplate, requestManager, callback) {
34665 const begin = range * 256;
34666 const end = begin + 255;
34667 const request = requestManager.transformRequest(urlTemplate.replace('{fontstack}', fontstack).replace('{range}', `${begin}-${end}`), performance.ResourceType.Glyphs);
34668 performance.getArrayBuffer(request, (err, data) => {
34669 if (err) {
34670 callback(err);
34671 }
34672 else if (data) {
34673 const glyphs = {};
34674 for (const glyph of performance.parseGlyphPBF(data)) {
34675 glyphs[glyph.id] = glyph;
34676 }
34677 callback(null, glyphs);
34678 }
34679 });
34680}
34681
34682const INF = 1e20;
34683
34684class TinySDF {
34685 constructor({
34686 fontSize = 24,
34687 buffer = 3,
34688 radius = 8,
34689 cutoff = 0.25,
34690 fontFamily = 'sans-serif',
34691 fontWeight = 'normal',
34692 fontStyle = 'normal'
34693 } = {}) {
34694 this.buffer = buffer;
34695 this.cutoff = cutoff;
34696 this.radius = radius;
34697
34698 // make the canvas size big enough to both have the specified buffer around the glyph
34699 // for "halo", and account for some glyphs possibly being larger than their font size
34700 const size = this.size = fontSize + buffer * 4;
34701
34702 const canvas = this._createCanvas(size);
34703 const ctx = this.ctx = canvas.getContext('2d', {willReadFrequently: true});
34704 ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;
34705
34706 ctx.textBaseline = 'alphabetic';
34707 ctx.textAlign = 'left'; // Necessary so that RTL text doesn't have different alignment
34708 ctx.fillStyle = 'black';
34709
34710 // temporary arrays for the distance transform
34711 this.gridOuter = new Float64Array(size * size);
34712 this.gridInner = new Float64Array(size * size);
34713 this.f = new Float64Array(size);
34714 this.z = new Float64Array(size + 1);
34715 this.v = new Uint16Array(size);
34716 }
34717
34718 _createCanvas(size) {
34719 const canvas = document.createElement('canvas');
34720 canvas.width = canvas.height = size;
34721 return canvas;
34722 }
34723
34724 draw(char) {
34725 const {
34726 width: glyphAdvance,
34727 actualBoundingBoxAscent,
34728 actualBoundingBoxDescent,
34729 actualBoundingBoxLeft,
34730 actualBoundingBoxRight
34731 } = this.ctx.measureText(char);
34732
34733 // The integer/pixel part of the top alignment is encoded in metrics.glyphTop
34734 // The remainder is implicitly encoded in the rasterization
34735 const glyphTop = Math.ceil(actualBoundingBoxAscent);
34736 const glyphLeft = 0;
34737
34738 // If the glyph overflows the canvas size, it will be clipped at the bottom/right
34739 const glyphWidth = Math.min(this.size - this.buffer, Math.ceil(actualBoundingBoxRight - actualBoundingBoxLeft));
34740 const glyphHeight = Math.min(this.size - this.buffer, glyphTop + Math.ceil(actualBoundingBoxDescent));
34741
34742 const width = glyphWidth + 2 * this.buffer;
34743 const height = glyphHeight + 2 * this.buffer;
34744
34745 const len = Math.max(width * height, 0);
34746 const data = new Uint8ClampedArray(len);
34747 const glyph = {data, width, height, glyphWidth, glyphHeight, glyphTop, glyphLeft, glyphAdvance};
34748 if (glyphWidth === 0 || glyphHeight === 0) return glyph;
34749
34750 const {ctx, buffer, gridInner, gridOuter} = this;
34751 ctx.clearRect(buffer, buffer, glyphWidth, glyphHeight);
34752 ctx.fillText(char, buffer, buffer + glyphTop);
34753 const imgData = ctx.getImageData(buffer, buffer, glyphWidth, glyphHeight);
34754
34755 // Initialize grids outside the glyph range to alpha 0
34756 gridOuter.fill(INF, 0, len);
34757 gridInner.fill(0, 0, len);
34758
34759 for (let y = 0; y < glyphHeight; y++) {
34760 for (let x = 0; x < glyphWidth; x++) {
34761 const a = imgData.data[4 * (y * glyphWidth + x) + 3] / 255; // alpha value
34762 if (a === 0) continue; // empty pixels
34763
34764 const j = (y + buffer) * width + x + buffer;
34765
34766 if (a === 1) { // fully drawn pixels
34767 gridOuter[j] = 0;
34768 gridInner[j] = INF;
34769
34770 } else { // aliased pixels
34771 const d = 0.5 - a;
34772 gridOuter[j] = d > 0 ? d * d : 0;
34773 gridInner[j] = d < 0 ? d * d : 0;
34774 }
34775 }
34776 }
34777
34778 edt(gridOuter, 0, 0, width, height, width, this.f, this.v, this.z);
34779 edt(gridInner, buffer, buffer, glyphWidth, glyphHeight, width, this.f, this.v, this.z);
34780
34781 for (let i = 0; i < len; i++) {
34782 const d = Math.sqrt(gridOuter[i]) - Math.sqrt(gridInner[i]);
34783 data[i] = Math.round(255 - 255 * (d / this.radius + this.cutoff));
34784 }
34785
34786 return glyph;
34787 }
34788}
34789
34790// 2D Euclidean squared distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf
34791function edt(data, x0, y0, width, height, gridSize, f, v, z) {
34792 for (let x = x0; x < x0 + width; x++) edt1d(data, y0 * gridSize + x, gridSize, height, f, v, z);
34793 for (let y = y0; y < y0 + height; y++) edt1d(data, y * gridSize + x0, 1, width, f, v, z);
34794}
34795
34796// 1D squared distance transform
34797function edt1d(grid, offset, stride, length, f, v, z) {
34798 v[0] = 0;
34799 z[0] = -INF;
34800 z[1] = INF;
34801 f[0] = grid[offset];
34802
34803 for (let q = 1, k = 0, s = 0; q < length; q++) {
34804 f[q] = grid[offset + q * stride];
34805 const q2 = q * q;
34806 do {
34807 const r = v[k];
34808 s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;
34809 } while (s <= z[k] && --k > -1);
34810
34811 k++;
34812 v[k] = q;
34813 z[k] = s;
34814 z[k + 1] = INF;
34815 }
34816
34817 for (let q = 0, k = 0; q < length; q++) {
34818 while (z[k + 1] < q) k++;
34819 const r = v[k];
34820 const qr = q - r;
34821 grid[offset + q * stride] = f[r] + qr * qr;
34822 }
34823}
34824
34825class GlyphManager {
34826 constructor(requestManager, localIdeographFontFamily) {
34827 this.requestManager = requestManager;
34828 this.localIdeographFontFamily = localIdeographFontFamily;
34829 this.entries = {};
34830 }
34831 setURL(url) {
34832 this.url = url;
34833 }
34834 getGlyphs(glyphs, callback) {
34835 const all = [];
34836 for (const stack in glyphs) {
34837 for (const id of glyphs[stack]) {
34838 all.push({ stack, id });
34839 }
34840 }
34841 performance.asyncAll(all, ({ stack, id }, callback) => {
34842 let entry = this.entries[stack];
34843 if (!entry) {
34844 entry = this.entries[stack] = {
34845 glyphs: {},
34846 requests: {},
34847 ranges: {}
34848 };
34849 }
34850 let glyph = entry.glyphs[id];
34851 if (glyph !== undefined) {
34852 callback(null, { stack, id, glyph });
34853 return;
34854 }
34855 glyph = this._tinySDF(entry, stack, id);
34856 if (glyph) {
34857 entry.glyphs[id] = glyph;
34858 callback(null, { stack, id, glyph });
34859 return;
34860 }
34861 const range = Math.floor(id / 256);
34862 if (range * 256 > 65535) {
34863 callback(new Error('glyphs > 65535 not supported'));
34864 return;
34865 }
34866 if (entry.ranges[range]) {
34867 callback(null, { stack, id, glyph });
34868 return;
34869 }
34870 let requests = entry.requests[range];
34871 if (!requests) {
34872 requests = entry.requests[range] = [];
34873 GlyphManager.loadGlyphRange(stack, range, this.url, this.requestManager, (err, response) => {
34874 if (response) {
34875 for (const id in response) {
34876 if (!this._doesCharSupportLocalGlyph(+id)) {
34877 entry.glyphs[+id] = response[+id];
34878 }
34879 }
34880 entry.ranges[range] = true;
34881 }
34882 for (const cb of requests) {
34883 cb(err, response);
34884 }
34885 delete entry.requests[range];
34886 });
34887 }
34888 requests.push((err, result) => {
34889 if (err) {
34890 callback(err);
34891 }
34892 else if (result) {
34893 callback(null, { stack, id, glyph: result[id] || null });
34894 }
34895 });
34896 }, (err, glyphs) => {
34897 if (err) {
34898 callback(err);
34899 }
34900 else if (glyphs) {
34901 const result = {};
34902 for (const { stack, id, glyph } of glyphs) {
34903 // Clone the glyph so that our own copy of its ArrayBuffer doesn't get transferred.
34904 (result[stack] || (result[stack] = {}))[id] = glyph && {
34905 id: glyph.id,
34906 bitmap: glyph.bitmap.clone(),
34907 metrics: glyph.metrics
34908 };
34909 }
34910 callback(null, result);
34911 }
34912 });
34913 }
34914 _doesCharSupportLocalGlyph(id) {
34915 /* eslint-disable new-cap */
34916 return !!this.localIdeographFontFamily &&
34917 (performance.unicodeBlockLookup['CJK Unified Ideographs'](id) ||
34918 performance.unicodeBlockLookup['Hangul Syllables'](id) ||
34919 performance.unicodeBlockLookup['Hiragana'](id) ||
34920 performance.unicodeBlockLookup['Katakana'](id));
34921 /* eslint-enable new-cap */
34922 }
34923 _tinySDF(entry, stack, id) {
34924 const fontFamily = this.localIdeographFontFamily;
34925 if (!fontFamily) {
34926 return;
34927 }
34928 if (!this._doesCharSupportLocalGlyph(id)) {
34929 return;
34930 }
34931 let tinySDF = entry.tinySDF;
34932 if (!tinySDF) {
34933 let fontWeight = '400';
34934 if (/bold/i.test(stack)) {
34935 fontWeight = '900';
34936 }
34937 else if (/medium/i.test(stack)) {
34938 fontWeight = '500';
34939 }
34940 else if (/light/i.test(stack)) {
34941 fontWeight = '200';
34942 }
34943 tinySDF = entry.tinySDF = new GlyphManager.TinySDF({
34944 fontSize: 24,
34945 buffer: 3,
34946 radius: 8,
34947 cutoff: 0.25,
34948 fontFamily,
34949 fontWeight
34950 });
34951 }
34952 const char = tinySDF.draw(String.fromCharCode(id));
34953 /**
34954 * TinySDF's "top" is the distance from the alphabetic baseline to the top of the glyph.
34955 * Server-generated fonts specify "top" relative to an origin above the em box (the origin
34956 * comes from FreeType, but I'm unclear on exactly how it's derived)
34957 * ref: https://github.com/mapbox/sdf-glyph-foundry
34958 *
34959 * Server fonts don't yet include baseline information, so we can't line up exactly with them
34960 * (and they don't line up with each other)
34961 * ref: https://github.com/mapbox/node-fontnik/pull/160
34962 *
34963 * To approximately align TinySDF glyphs with server-provided glyphs, we use this baseline adjustment
34964 * factor calibrated to be in between DIN Pro and Arial Unicode (but closer to Arial Unicode)
34965 */
34966 const topAdjustment = 27;
34967 return {
34968 id,
34969 bitmap: new performance.AlphaImage({ width: char.width || 30, height: char.height || 30 }, char.data),
34970 metrics: {
34971 width: char.glyphWidth || 24,
34972 height: char.glyphHeight || 24,
34973 left: char.glyphLeft || 0,
34974 top: char.glyphTop - topAdjustment || -8,
34975 advance: char.glyphAdvance || 24
34976 }
34977 };
34978 }
34979}
34980// exposed as statics to enable stubbing in unit tests
34981GlyphManager.loadGlyphRange = loadGlyphRange;
34982GlyphManager.TinySDF = TinySDF;
34983
34984class LightPositionProperty {
34985 constructor() {
34986 this.specification = performance.spec.light.position;
34987 }
34988 possiblyEvaluate(value, parameters) {
34989 return performance.sphericalToCartesian(value.expression.evaluate(parameters));
34990 }
34991 interpolate(a, b, t) {
34992 return {
34993 x: performance.number(a.x, b.x, t),
34994 y: performance.number(a.y, b.y, t),
34995 z: performance.number(a.z, b.z, t),
34996 };
34997 }
34998}
34999const properties = new performance.Properties({
35000 'anchor': new performance.DataConstantProperty(performance.spec.light.anchor),
35001 'position': new LightPositionProperty(),
35002 'color': new performance.DataConstantProperty(performance.spec.light.color),
35003 'intensity': new performance.DataConstantProperty(performance.spec.light.intensity),
35004});
35005const TRANSITION_SUFFIX = '-transition';
35006/*
35007 * Represents the light used to light extruded features.
35008 */
35009class Light extends performance.Evented {
35010 constructor(lightOptions) {
35011 super();
35012 this._transitionable = new performance.Transitionable(properties);
35013 this.setLight(lightOptions);
35014 this._transitioning = this._transitionable.untransitioned();
35015 }
35016 getLight() {
35017 return this._transitionable.serialize();
35018 }
35019 setLight(light, options = {}) {
35020 if (this._validate(performance.validateLight, light, options)) {
35021 return;
35022 }
35023 for (const name in light) {
35024 const value = light[name];
35025 if (name.endsWith(TRANSITION_SUFFIX)) {
35026 this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value);
35027 }
35028 else {
35029 this._transitionable.setValue(name, value);
35030 }
35031 }
35032 }
35033 updateTransitions(parameters) {
35034 this._transitioning = this._transitionable.transitioned(parameters, this._transitioning);
35035 }
35036 hasTransition() {
35037 return this._transitioning.hasTransition();
35038 }
35039 recalculate(parameters) {
35040 this.properties = this._transitioning.possiblyEvaluate(parameters);
35041 }
35042 _validate(validate, value, options) {
35043 if (options && options.validate === false) {
35044 return false;
35045 }
35046 return performance.emitValidationErrors(this, validate.call(performance.validateStyle, performance.extend({
35047 value,
35048 // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407
35049 style: { glyphs: true, sprite: true },
35050 styleSpec: performance.spec
35051 })));
35052 }
35053}
35054
35055/**
35056 * A LineAtlas lets us reuse rendered dashed lines
35057 * by writing many of them to a texture and then fetching their positions
35058 * using .getDash.
35059 *
35060 * @param {number} width
35061 * @param {number} height
35062 * @private
35063 */
35064class LineAtlas {
35065 constructor(width, height) {
35066 this.width = width;
35067 this.height = height;
35068 this.nextRow = 0;
35069 this.data = new Uint8Array(this.width * this.height);
35070 this.dashEntry = {};
35071 }
35072 /**
35073 * Get or create a dash line pattern.
35074 *
35075 * @param {Array<number>} dasharray
35076 * @param {boolean} round whether to add circle caps in between dash segments
35077 * @returns {Object} position of dash texture in { y, height, width }
35078 * @private
35079 */
35080 getDash(dasharray, round) {
35081 const key = dasharray.join(',') + String(round);
35082 if (!this.dashEntry[key]) {
35083 this.dashEntry[key] = this.addDash(dasharray, round);
35084 }
35085 return this.dashEntry[key];
35086 }
35087 getDashRanges(dasharray, lineAtlasWidth, stretch) {
35088 // If dasharray has an odd length, both the first and last parts
35089 // are dashes and should be joined seamlessly.
35090 const oddDashArray = dasharray.length % 2 === 1;
35091 const ranges = [];
35092 let left = oddDashArray ? -dasharray[dasharray.length - 1] * stretch : 0;
35093 let right = dasharray[0] * stretch;
35094 let isDash = true;
35095 ranges.push({ left, right, isDash, zeroLength: dasharray[0] === 0 });
35096 let currentDashLength = dasharray[0];
35097 for (let i = 1; i < dasharray.length; i++) {
35098 isDash = !isDash;
35099 const dashLength = dasharray[i];
35100 left = currentDashLength * stretch;
35101 currentDashLength += dashLength;
35102 right = currentDashLength * stretch;
35103 ranges.push({ left, right, isDash, zeroLength: dashLength === 0 });
35104 }
35105 return ranges;
35106 }
35107 addRoundDash(ranges, stretch, n) {
35108 const halfStretch = stretch / 2;
35109 for (let y = -n; y <= n; y++) {
35110 const row = this.nextRow + n + y;
35111 const index = this.width * row;
35112 let currIndex = 0;
35113 let range = ranges[currIndex];
35114 for (let x = 0; x < this.width; x++) {
35115 if (x / range.right > 1) {
35116 range = ranges[++currIndex];
35117 }
35118 const distLeft = Math.abs(x - range.left);
35119 const distRight = Math.abs(x - range.right);
35120 const minDist = Math.min(distLeft, distRight);
35121 let signedDistance;
35122 const distMiddle = y / n * (halfStretch + 1);
35123 if (range.isDash) {
35124 const distEdge = halfStretch - Math.abs(distMiddle);
35125 signedDistance = Math.sqrt(minDist * minDist + distEdge * distEdge);
35126 }
35127 else {
35128 signedDistance = halfStretch - Math.sqrt(minDist * minDist + distMiddle * distMiddle);
35129 }
35130 this.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128));
35131 }
35132 }
35133 }
35134 addRegularDash(ranges) {
35135 // Collapse any zero-length range
35136 // Collapse neighbouring same-type parts into a single part
35137 for (let i = ranges.length - 1; i >= 0; --i) {
35138 const part = ranges[i];
35139 const next = ranges[i + 1];
35140 if (part.zeroLength) {
35141 ranges.splice(i, 1);
35142 }
35143 else if (next && next.isDash === part.isDash) {
35144 next.left = part.left;
35145 ranges.splice(i, 1);
35146 }
35147 }
35148 // Combine the first and last parts if possible
35149 const first = ranges[0];
35150 const last = ranges[ranges.length - 1];
35151 if (first.isDash === last.isDash) {
35152 first.left = last.left - this.width;
35153 last.right = first.right + this.width;
35154 }
35155 const index = this.width * this.nextRow;
35156 let currIndex = 0;
35157 let range = ranges[currIndex];
35158 for (let x = 0; x < this.width; x++) {
35159 if (x / range.right > 1) {
35160 range = ranges[++currIndex];
35161 }
35162 const distLeft = Math.abs(x - range.left);
35163 const distRight = Math.abs(x - range.right);
35164 const minDist = Math.min(distLeft, distRight);
35165 const signedDistance = range.isDash ? minDist : -minDist;
35166 this.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128));
35167 }
35168 }
35169 addDash(dasharray, round) {
35170 const n = round ? 7 : 0;
35171 const height = 2 * n + 1;
35172 if (this.nextRow + height > this.height) {
35173 performance.warnOnce('LineAtlas out of space');
35174 return null;
35175 }
35176 let length = 0;
35177 for (let i = 0; i < dasharray.length; i++) {
35178 length += dasharray[i];
35179 }
35180 if (length !== 0) {
35181 const stretch = this.width / length;
35182 const ranges = this.getDashRanges(dasharray, this.width, stretch);
35183 if (round) {
35184 this.addRoundDash(ranges, stretch, n);
35185 }
35186 else {
35187 this.addRegularDash(ranges);
35188 }
35189 }
35190 const dashEntry = {
35191 y: (this.nextRow + n + 0.5) / this.height,
35192 height: 2 * n / this.height,
35193 width: length
35194 };
35195 this.nextRow += height;
35196 this.dirty = true;
35197 return dashEntry;
35198 }
35199 bind(context) {
35200 const gl = context.gl;
35201 if (!this.texture) {
35202 this.texture = gl.createTexture();
35203 gl.bindTexture(gl.TEXTURE_2D, this.texture);
35204 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
35205 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);
35206 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
35207 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
35208 gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, this.data);
35209 }
35210 else {
35211 gl.bindTexture(gl.TEXTURE_2D, this.texture);
35212 if (this.dirty) {
35213 this.dirty = false;
35214 gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data);
35215 }
35216 }
35217 }
35218}
35219
35220/**
35221 * Responsible for sending messages from a {@link Source} to an associated
35222 * {@link WorkerSource}.
35223 *
35224 * @private
35225 */
35226class Dispatcher {
35227 constructor(workerPool, parent) {
35228 this.workerPool = workerPool;
35229 this.actors = [];
35230 this.currentActor = 0;
35231 this.id = performance.uniqueId();
35232 const workers = this.workerPool.acquire(this.id);
35233 for (let i = 0; i < workers.length; i++) {
35234 const worker = workers[i];
35235 const actor = new Dispatcher.Actor(worker, parent, this.id);
35236 actor.name = `Worker ${i}`;
35237 this.actors.push(actor);
35238 }
35239 performance.assert(this.actors.length);
35240 }
35241 /**
35242 * Broadcast a message to all Workers.
35243 * @private
35244 */
35245 broadcast(type, data, cb) {
35246 performance.assert(this.actors.length);
35247 cb = cb || function () { };
35248 performance.asyncAll(this.actors, (actor, done) => {
35249 actor.send(type, data, done);
35250 }, cb);
35251 }
35252 /**
35253 * Acquires an actor to dispatch messages to. The actors are distributed in round-robin fashion.
35254 * @returns An actor object backed by a web worker for processing messages.
35255 */
35256 getActor() {
35257 performance.assert(this.actors.length);
35258 this.currentActor = (this.currentActor + 1) % this.actors.length;
35259 return this.actors[this.currentActor];
35260 }
35261 remove() {
35262 this.actors.forEach((actor) => { actor.remove(); });
35263 this.actors = [];
35264 this.workerPool.release(this.id);
35265 }
35266}
35267Dispatcher.Actor = performance.Actor;
35268
35269function loadTileJSON (options, requestManager, callback) {
35270 const loaded = function (err, tileJSON) {
35271 if (err) {
35272 return callback(err);
35273 }
35274 else if (tileJSON) {
35275 const result = performance.pick(
35276 // explicit source options take precedence over TileJSON
35277 performance.extend(tileJSON, options), ['tiles', 'minzoom', 'maxzoom', 'attribution', 'bounds', 'scheme', 'tileSize', 'encoding']);
35278 if (tileJSON.vector_layers) {
35279 result.vectorLayers = tileJSON.vector_layers;
35280 result.vectorLayerIds = result.vectorLayers.map((layer) => { return layer.id; });
35281 }
35282 callback(null, result);
35283 }
35284 };
35285 if (options.url) {
35286 return performance.getJSON(requestManager.transformRequest(options.url, performance.ResourceType.Source), loaded);
35287 }
35288 else {
35289 return performance.exported.frame(() => loaded(null, options));
35290 }
35291}
35292
35293class TileBounds {
35294 constructor(bounds, minzoom, maxzoom) {
35295 this.bounds = performance.LngLatBounds.convert(this.validateBounds(bounds));
35296 this.minzoom = minzoom || 0;
35297 this.maxzoom = maxzoom || 24;
35298 }
35299 validateBounds(bounds) {
35300 // make sure the bounds property contains valid longitude and latitudes
35301 if (!Array.isArray(bounds) || bounds.length !== 4)
35302 return [-180, -90, 180, 90];
35303 return [Math.max(-180, bounds[0]), Math.max(-90, bounds[1]), Math.min(180, bounds[2]), Math.min(90, bounds[3])];
35304 }
35305 contains(tileID) {
35306 const worldSize = Math.pow(2, tileID.z);
35307 const level = {
35308 minX: Math.floor(performance.mercatorXfromLng(this.bounds.getWest()) * worldSize),
35309 minY: Math.floor(performance.mercatorYfromLat(this.bounds.getNorth()) * worldSize),
35310 maxX: Math.ceil(performance.mercatorXfromLng(this.bounds.getEast()) * worldSize),
35311 maxY: Math.ceil(performance.mercatorYfromLat(this.bounds.getSouth()) * worldSize)
35312 };
35313 const hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY;
35314 return hit;
35315 }
35316}
35317
35318/**
35319 * A source containing vector tiles in [Mapbox Vector Tile format](https://docs.mapbox.com/vector-tiles/reference/).
35320 * (See the [Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/) for detailed documentation of options.)
35321 *
35322 * @example
35323 * map.addSource('some id', {
35324 * type: 'vector',
35325 * url: 'https://demotiles.maplibre.org/tiles/tiles.json'
35326 * });
35327 *
35328 * @example
35329 * map.addSource('some id', {
35330 * type: 'vector',
35331 * tiles: ['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt'],
35332 * minzoom: 6,
35333 * maxzoom: 14
35334 * });
35335 *
35336 * @example
35337 * map.getSource('some id').setUrl("https://demotiles.maplibre.org/tiles/tiles.json");
35338 *
35339 * @example
35340 * map.getSource('some id').setTiles(['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt']);
35341 * @see [Add a vector tile source](https://maplibre.org/maplibre-gl-js-docs/example/vector-source/)
35342 * @see [Add a third party vector tile source](https://maplibre.org/maplibre-gl-js-docs/example/third-party/)
35343 */
35344class VectorTileSource extends performance.Evented {
35345 constructor(id, options, dispatcher, eventedParent) {
35346 super();
35347 this.id = id;
35348 this.dispatcher = dispatcher;
35349 this.type = 'vector';
35350 this.minzoom = 0;
35351 this.maxzoom = 22;
35352 this.scheme = 'xyz';
35353 this.tileSize = 512;
35354 this.reparseOverscaled = true;
35355 this.isTileClipped = true;
35356 this._loaded = false;
35357 performance.extend(this, performance.pick(options, ['url', 'scheme', 'tileSize', 'promoteId']));
35358 this._options = performance.extend({ type: 'vector' }, options);
35359 this._collectResourceTiming = options.collectResourceTiming;
35360 if (this.tileSize !== 512) {
35361 throw new Error('vector tile sources must have a tileSize of 512');
35362 }
35363 this.setEventedParent(eventedParent);
35364 }
35365 load() {
35366 this._loaded = false;
35367 this.fire(new performance.Event('dataloading', { dataType: 'source' }));
35368 this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, (err, tileJSON) => {
35369 this._tileJSONRequest = null;
35370 this._loaded = true;
35371 this.map.style.sourceCaches[this.id].clearTiles();
35372 if (err) {
35373 this.fire(new performance.ErrorEvent(err));
35374 }
35375 else if (tileJSON) {
35376 performance.extend(this, tileJSON);
35377 if (tileJSON.bounds)
35378 this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);
35379 // `content` is included here to prevent a race condition where `Style#_updateSources` is called
35380 // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives
35381 // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088
35382 this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'metadata' }));
35383 this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'content' }));
35384 }
35385 });
35386 }
35387 loaded() {
35388 return this._loaded;
35389 }
35390 hasTile(tileID) {
35391 return !this.tileBounds || this.tileBounds.contains(tileID.canonical);
35392 }
35393 onAdd(map) {
35394 this.map = map;
35395 this.load();
35396 }
35397 setSourceProperty(callback) {
35398 if (this._tileJSONRequest) {
35399 this._tileJSONRequest.cancel();
35400 }
35401 callback();
35402 this.load();
35403 }
35404 /**
35405 * Sets the source `tiles` property and re-renders the map.
35406 *
35407 * @param {string[]} tiles An array of one or more tile source URLs, as in the TileJSON spec.
35408 * @returns {VectorTileSource} this
35409 */
35410 setTiles(tiles) {
35411 this.setSourceProperty(() => {
35412 this._options.tiles = tiles;
35413 });
35414 return this;
35415 }
35416 /**
35417 * Sets the source `url` property and re-renders the map.
35418 *
35419 * @param {string} url A URL to a TileJSON resource. Supported protocols are `http:` and `https:`.
35420 * @returns {VectorTileSource} this
35421 */
35422 setUrl(url) {
35423 this.setSourceProperty(() => {
35424 this.url = url;
35425 this._options.url = url;
35426 });
35427 return this;
35428 }
35429 onRemove() {
35430 if (this._tileJSONRequest) {
35431 this._tileJSONRequest.cancel();
35432 this._tileJSONRequest = null;
35433 }
35434 }
35435 serialize() {
35436 return performance.extend({}, this._options);
35437 }
35438 loadTile(tile, callback) {
35439 const url = tile.tileID.canonical.url(this.tiles, this.map.getPixelRatio(), this.scheme);
35440 const params = {
35441 request: this.map._requestManager.transformRequest(url, performance.ResourceType.Tile),
35442 uid: tile.uid,
35443 tileID: tile.tileID,
35444 zoom: tile.tileID.overscaledZ,
35445 tileSize: this.tileSize * tile.tileID.overscaleFactor(),
35446 type: this.type,
35447 source: this.id,
35448 pixelRatio: this.map.getPixelRatio(),
35449 showCollisionBoxes: this.map.showCollisionBoxes,
35450 promoteId: this.promoteId
35451 };
35452 params.request.collectResourceTiming = this._collectResourceTiming;
35453 if (!tile.actor || tile.state === 'expired') {
35454 tile.actor = this.dispatcher.getActor();
35455 tile.request = tile.actor.send('loadTile', params, done.bind(this));
35456 }
35457 else if (tile.state === 'loading') {
35458 // schedule tile reloading after it has been loaded
35459 tile.reloadCallback = callback;
35460 }
35461 else {
35462 tile.request = tile.actor.send('reloadTile', params, done.bind(this));
35463 }
35464 function done(err, data) {
35465 delete tile.request;
35466 if (tile.aborted)
35467 return callback(null);
35468 if (err && err.status !== 404) {
35469 return callback(err);
35470 }
35471 if (data && data.resourceTiming)
35472 tile.resourceTiming = data.resourceTiming;
35473 if (this.map._refreshExpiredTiles && data)
35474 tile.setExpiryData(data);
35475 tile.loadVectorData(data, this.map.painter);
35476 performance.cacheEntryPossiblyAdded(this.dispatcher);
35477 callback(null);
35478 if (tile.reloadCallback) {
35479 this.loadTile(tile, tile.reloadCallback);
35480 tile.reloadCallback = null;
35481 }
35482 }
35483 }
35484 abortTile(tile) {
35485 if (tile.request) {
35486 tile.request.cancel();
35487 delete tile.request;
35488 }
35489 if (tile.actor) {
35490 tile.actor.send('abortTile', { uid: tile.uid, type: this.type, source: this.id }, undefined);
35491 }
35492 }
35493 unloadTile(tile) {
35494 tile.unloadVectorData();
35495 if (tile.actor) {
35496 tile.actor.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, undefined);
35497 }
35498 }
35499 hasTransition() {
35500 return false;
35501 }
35502}
35503
35504class RasterTileSource extends performance.Evented {
35505 constructor(id, options, dispatcher, eventedParent) {
35506 super();
35507 this.id = id;
35508 this.dispatcher = dispatcher;
35509 this.setEventedParent(eventedParent);
35510 this.type = 'raster';
35511 this.minzoom = 0;
35512 this.maxzoom = 22;
35513 this.roundZoom = true;
35514 this.scheme = 'xyz';
35515 this.tileSize = 512;
35516 this._loaded = false;
35517 this._options = performance.extend({ type: 'raster' }, options);
35518 performance.extend(this, performance.pick(options, ['url', 'scheme', 'tileSize']));
35519 }
35520 load() {
35521 this._loaded = false;
35522 this.fire(new performance.Event('dataloading', { dataType: 'source' }));
35523 this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, (err, tileJSON) => {
35524 this._tileJSONRequest = null;
35525 this._loaded = true;
35526 if (err) {
35527 this.fire(new performance.ErrorEvent(err));
35528 }
35529 else if (tileJSON) {
35530 performance.extend(this, tileJSON);
35531 if (tileJSON.bounds)
35532 this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);
35533 // `content` is included here to prevent a race condition where `Style#_updateSources` is called
35534 // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives
35535 // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088
35536 this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'metadata' }));
35537 this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'content' }));
35538 }
35539 });
35540 }
35541 loaded() {
35542 return this._loaded;
35543 }
35544 onAdd(map) {
35545 this.map = map;
35546 this.load();
35547 }
35548 onRemove() {
35549 if (this._tileJSONRequest) {
35550 this._tileJSONRequest.cancel();
35551 this._tileJSONRequest = null;
35552 }
35553 }
35554 serialize() {
35555 return performance.extend({}, this._options);
35556 }
35557 hasTile(tileID) {
35558 return !this.tileBounds || this.tileBounds.contains(tileID.canonical);
35559 }
35560 loadTile(tile, callback) {
35561 const url = tile.tileID.canonical.url(this.tiles, this.map.getPixelRatio(), this.scheme);
35562 tile.request = performance.getImage(this.map._requestManager.transformRequest(url, performance.ResourceType.Tile), (err, img, expiry) => {
35563 delete tile.request;
35564 if (tile.aborted) {
35565 tile.state = 'unloaded';
35566 callback(null);
35567 }
35568 else if (err) {
35569 tile.state = 'errored';
35570 callback(err);
35571 }
35572 else if (img) {
35573 if (this.map._refreshExpiredTiles)
35574 tile.setExpiryData(expiry);
35575 const context = this.map.painter.context;
35576 const gl = context.gl;
35577 tile.texture = this.map.painter.getTileTexture(img.width);
35578 if (tile.texture) {
35579 tile.texture.update(img, { useMipmap: true });
35580 }
35581 else {
35582 tile.texture = new Texture(context, img, gl.RGBA, { useMipmap: true });
35583 tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST);
35584 if (context.extTextureFilterAnisotropic) {
35585 gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax);
35586 }
35587 }
35588 tile.state = 'loaded';
35589 performance.cacheEntryPossiblyAdded(this.dispatcher);
35590 callback(null);
35591 }
35592 });
35593 }
35594 abortTile(tile, callback) {
35595 if (tile.request) {
35596 tile.request.cancel();
35597 delete tile.request;
35598 }
35599 callback();
35600 }
35601 unloadTile(tile, callback) {
35602 if (tile.texture)
35603 this.map.painter.saveTileTexture(tile.texture);
35604 callback();
35605 }
35606 hasTransition() {
35607 return false;
35608 }
35609}
35610
35611let supportsOffscreenCanvas;
35612function offscreenCanvasSupported() {
35613 if (supportsOffscreenCanvas == null) {
35614 supportsOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' &&
35615 new OffscreenCanvas(1, 1).getContext('2d') &&
35616 typeof createImageBitmap === 'function';
35617 }
35618 return supportsOffscreenCanvas;
35619}
35620
35621class RasterDEMTileSource extends RasterTileSource {
35622 constructor(id, options, dispatcher, eventedParent) {
35623 super(id, options, dispatcher, eventedParent);
35624 this.type = 'raster-dem';
35625 this.maxzoom = 22;
35626 this._options = performance.extend({ type: 'raster-dem' }, options);
35627 this.encoding = options.encoding || 'mapbox';
35628 }
35629 serialize() {
35630 return {
35631 type: 'raster-dem',
35632 url: this.url,
35633 tileSize: this.tileSize,
35634 tiles: this.tiles,
35635 bounds: this.bounds,
35636 encoding: this.encoding
35637 };
35638 }
35639 loadTile(tile, callback) {
35640 const url = tile.tileID.canonical.url(this.tiles, this.map.getPixelRatio(), this.scheme);
35641 tile.request = performance.getImage(this.map._requestManager.transformRequest(url, performance.ResourceType.Tile), imageLoaded.bind(this));
35642 tile.neighboringTiles = this._getNeighboringTiles(tile.tileID);
35643 function imageLoaded(err, img) {
35644 delete tile.request;
35645 if (tile.aborted) {
35646 tile.state = 'unloaded';
35647 callback(null);
35648 }
35649 else if (err) {
35650 tile.state = 'errored';
35651 callback(err);
35652 }
35653 else if (img) {
35654 if (this.map._refreshExpiredTiles)
35655 tile.setExpiryData(img);
35656 delete img.cacheControl;
35657 delete img.expires;
35658 const transfer = performance.isImageBitmap(img) && offscreenCanvasSupported();
35659 const rawImageData = transfer ? img : performance.exported.getImageData(img, 1);
35660 const params = {
35661 uid: tile.uid,
35662 coord: tile.tileID,
35663 source: this.id,
35664 rawImageData,
35665 encoding: this.encoding
35666 };
35667 if (!tile.actor || tile.state === 'expired') {
35668 tile.actor = this.dispatcher.getActor();
35669 tile.actor.send('loadDEMTile', params, done.bind(this));
35670 }
35671 }
35672 }
35673 function done(err, dem) {
35674 if (err) {
35675 tile.state = 'errored';
35676 callback(err);
35677 }
35678 if (dem) {
35679 tile.dem = dem;
35680 tile.needsHillshadePrepare = true;
35681 tile.state = 'loaded';
35682 callback(null);
35683 }
35684 }
35685 }
35686 _getNeighboringTiles(tileID) {
35687 const canonical = tileID.canonical;
35688 const dim = Math.pow(2, canonical.z);
35689 const px = (canonical.x - 1 + dim) % dim;
35690 const pxw = canonical.x === 0 ? tileID.wrap - 1 : tileID.wrap;
35691 const nx = (canonical.x + 1 + dim) % dim;
35692 const nxw = canonical.x + 1 === dim ? tileID.wrap + 1 : tileID.wrap;
35693 const neighboringTiles = {};
35694 // add adjacent tiles
35695 neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y).key] = { backfilled: false };
35696 neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y).key] = { backfilled: false };
35697 // Add upper neighboringTiles
35698 if (canonical.y > 0) {
35699 neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y - 1).key] = { backfilled: false };
35700 neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y - 1).key] = { backfilled: false };
35701 neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y - 1).key] = { backfilled: false };
35702 }
35703 // Add lower neighboringTiles
35704 if (canonical.y + 1 < dim) {
35705 neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y + 1).key] = { backfilled: false };
35706 neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y + 1).key] = { backfilled: false };
35707 neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y + 1).key] = { backfilled: false };
35708 }
35709 return neighboringTiles;
35710 }
35711 unloadTile(tile) {
35712 if (tile.demTexture)
35713 this.map.painter.saveTileTexture(tile.demTexture);
35714 if (tile.fbo) {
35715 tile.fbo.destroy();
35716 delete tile.fbo;
35717 }
35718 if (tile.dem)
35719 delete tile.dem;
35720 delete tile.neighboringTiles;
35721 tile.state = 'unloaded';
35722 if (tile.actor) {
35723 tile.actor.send('removeDEMTile', { uid: tile.uid, source: this.id });
35724 }
35725 }
35726}
35727
35728/**
35729 * A source containing GeoJSON.
35730 * (See the [Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/#sources-geojson) for detailed documentation of options.)
35731 *
35732 * @example
35733 * map.addSource('some id', {
35734 * type: 'geojson',
35735 * data: 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_ports.geojson'
35736 * });
35737 *
35738 * @example
35739 * map.addSource('some id', {
35740 * type: 'geojson',
35741 * data: {
35742 * "type": "FeatureCollection",
35743 * "features": [{
35744 * "type": "Feature",
35745 * "properties": {},
35746 * "geometry": {
35747 * "type": "Point",
35748 * "coordinates": [
35749 * -76.53063297271729,
35750 * 39.18174077994108
35751 * ]
35752 * }
35753 * }]
35754 * }
35755 * });
35756 *
35757 * @example
35758 * map.getSource('some id').setData({
35759 * "type": "FeatureCollection",
35760 * "features": [{
35761 * "type": "Feature",
35762 * "properties": { "name": "Null Island" },
35763 * "geometry": {
35764 * "type": "Point",
35765 * "coordinates": [ 0, 0 ]
35766 * }
35767 * }]
35768 * });
35769 * @see [Draw GeoJSON points](https://maplibre.org/maplibre-gl-js-docs/example/geojson-markers/)
35770 * @see [Add a GeoJSON line](https://maplibre.org/maplibre-gl-js-docs/example/geojson-line/)
35771 * @see [Create a heatmap from points](https://maplibre.org/maplibre-gl-js-docs/example/heatmap/)
35772 * @see [Create and style clusters](https://maplibre.org/maplibre-gl-js-docs/example/cluster/)
35773 */
35774class GeoJSONSource extends performance.Evented {
35775 /**
35776 * @private
35777 */
35778 constructor(id, options, dispatcher, eventedParent) {
35779 super();
35780 this.id = id;
35781 // `type` is a property rather than a constant to make it easy for 3rd
35782 // parties to use GeoJSONSource to build their own source types.
35783 this.type = 'geojson';
35784 this.minzoom = 0;
35785 this.maxzoom = 18;
35786 this.tileSize = 512;
35787 this.isTileClipped = true;
35788 this.reparseOverscaled = true;
35789 this._removed = false;
35790 this._pendingLoads = 0;
35791 this.actor = dispatcher.getActor();
35792 this.setEventedParent(eventedParent);
35793 this._data = options.data;
35794 this._options = performance.extend({}, options);
35795 this._collectResourceTiming = options.collectResourceTiming;
35796 if (options.maxzoom !== undefined)
35797 this.maxzoom = options.maxzoom;
35798 if (options.type)
35799 this.type = options.type;
35800 if (options.attribution)
35801 this.attribution = options.attribution;
35802 this.promoteId = options.promoteId;
35803 const scale = performance.EXTENT / this.tileSize;
35804 // sent to the worker, along with `url: ...` or `data: literal geojson`,
35805 // so that it can load/parse/index the geojson data
35806 // extending with `options.workerOptions` helps to make it easy for
35807 // third-party sources to hack/reuse GeoJSONSource.
35808 this.workerOptions = performance.extend({
35809 source: this.id,
35810 cluster: options.cluster || false,
35811 geojsonVtOptions: {
35812 buffer: (options.buffer !== undefined ? options.buffer : 128) * scale,
35813 tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale,
35814 extent: performance.EXTENT,
35815 maxZoom: this.maxzoom,
35816 lineMetrics: options.lineMetrics || false,
35817 generateId: options.generateId || false
35818 },
35819 superclusterOptions: {
35820 maxZoom: options.clusterMaxZoom !== undefined ? options.clusterMaxZoom : this.maxzoom - 1,
35821 minPoints: Math.max(2, options.clusterMinPoints || 2),
35822 extent: performance.EXTENT,
35823 radius: (options.clusterRadius || 50) * scale,
35824 log: false,
35825 generateId: options.generateId || false
35826 },
35827 clusterProperties: options.clusterProperties,
35828 filter: options.filter
35829 }, options.workerOptions);
35830 }
35831 load() {
35832 // although GeoJSON sources contain no metadata, we fire this event to let the SourceCache
35833 // know its ok to start requesting tiles.
35834 this._updateWorkerData('metadata');
35835 }
35836 onAdd(map) {
35837 this.map = map;
35838 this.load();
35839 }
35840 /**
35841 * Sets the GeoJSON data and re-renders the map.
35842 *
35843 * @param {Object|string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files.
35844 * @returns {GeoJSONSource} this
35845 */
35846 setData(data) {
35847 this._data = data;
35848 this._updateWorkerData('content');
35849 return this;
35850 }
35851 /**
35852 * For clustered sources, fetches the zoom at which the given cluster expands.
35853 *
35854 * @param clusterId The value of the cluster's `cluster_id` property.
35855 * @param callback A callback to be called when the zoom value is retrieved (`(error, zoom) => { ... }`).
35856 * @returns {GeoJSONSource} this
35857 */
35858 getClusterExpansionZoom(clusterId, callback) {
35859 this.actor.send('geojson.getClusterExpansionZoom', { clusterId, source: this.id }, callback);
35860 return this;
35861 }
35862 /**
35863 * For clustered sources, fetches the children of the given cluster on the next zoom level (as an array of GeoJSON features).
35864 *
35865 * @param clusterId The value of the cluster's `cluster_id` property.
35866 * @param callback A callback to be called when the features are retrieved (`(error, features) => { ... }`).
35867 * @returns {GeoJSONSource} this
35868 */
35869 getClusterChildren(clusterId, callback) {
35870 this.actor.send('geojson.getClusterChildren', { clusterId, source: this.id }, callback);
35871 return this;
35872 }
35873 /**
35874 * For clustered sources, fetches the original points that belong to the cluster (as an array of GeoJSON features).
35875 *
35876 * @param clusterId The value of the cluster's `cluster_id` property.
35877 * @param limit The maximum number of features to return.
35878 * @param offset The number of features to skip (e.g. for pagination).
35879 * @param callback A callback to be called when the features are retrieved (`(error, features) => { ... }`).
35880 * @returns {GeoJSONSource} this
35881 * @example
35882 * // Retrieve cluster leaves on click
35883 * map.on('click', 'clusters', function(e) {
35884 * var features = map.queryRenderedFeatures(e.point, {
35885 * layers: ['clusters']
35886 * });
35887 *
35888 * var clusterId = features[0].properties.cluster_id;
35889 * var pointCount = features[0].properties.point_count;
35890 * var clusterSource = map.getSource('clusters');
35891 *
35892 * clusterSource.getClusterLeaves(clusterId, pointCount, 0, function(error, features) {
35893 * // Print cluster leaves in the console
35894 * console.log('Cluster leaves:', error, features);
35895 * })
35896 * });
35897 */
35898 getClusterLeaves(clusterId, limit, offset, callback) {
35899 this.actor.send('geojson.getClusterLeaves', {
35900 source: this.id,
35901 clusterId,
35902 limit,
35903 offset
35904 }, callback);
35905 return this;
35906 }
35907 /*
35908 * Responsible for invoking WorkerSource's geojson.loadData target, which
35909 * handles loading the geojson data and preparing to serve it up as tiles,
35910 * using geojson-vt or supercluster as appropriate.
35911 */
35912 _updateWorkerData(sourceDataType) {
35913 const options = performance.extend({}, this.workerOptions);
35914 const data = this._data;
35915 if (typeof data === 'string') {
35916 options.request = this.map._requestManager.transformRequest(performance.exported.resolveURL(data), performance.ResourceType.Source);
35917 options.request.collectResourceTiming = this._collectResourceTiming;
35918 }
35919 else {
35920 options.data = JSON.stringify(data);
35921 }
35922 this._pendingLoads++;
35923 this.fire(new performance.Event('dataloading', { dataType: 'source' }));
35924 // target {this.type}.loadData rather than literally geojson.loadData,
35925 // so that other geojson-like source types can easily reuse this
35926 // implementation
35927 this.actor.send(`${this.type}.loadData`, options, (err, result) => {
35928 this._pendingLoads--;
35929 if (this._removed || (result && result.abandoned)) {
35930 return;
35931 }
35932 let resourceTiming = null;
35933 if (result && result.resourceTiming && result.resourceTiming[this.id])
35934 resourceTiming = result.resourceTiming[this.id].slice(0);
35935 // Any `loadData` calls that piled up while we were processing
35936 // this one will get coalesced into a single call when this
35937 // 'coalesce' message is processed.
35938 // We would self-send from the worker if we had access to its
35939 // message queue. Waiting instead for the 'coalesce' to round-trip
35940 // through the foreground just means we're throttling the worker
35941 // to run at a little less than full-throttle.
35942 this.actor.send(`${this.type}.coalesce`, { source: options.source }, null);
35943 if (err) {
35944 this.fire(new performance.ErrorEvent(err));
35945 return;
35946 }
35947 const data = { dataType: 'source', sourceDataType };
35948 if (this._collectResourceTiming && resourceTiming && resourceTiming.length > 0)
35949 performance.extend(data, { resourceTiming });
35950 this.fire(new performance.Event('data', data));
35951 });
35952 }
35953 loaded() {
35954 return this._pendingLoads === 0;
35955 }
35956 loadTile(tile, callback) {
35957 const message = !tile.actor ? 'loadTile' : 'reloadTile';
35958 tile.actor = this.actor;
35959 const params = {
35960 type: this.type,
35961 uid: tile.uid,
35962 tileID: tile.tileID,
35963 zoom: tile.tileID.overscaledZ,
35964 maxZoom: this.maxzoom,
35965 tileSize: this.tileSize,
35966 source: this.id,
35967 pixelRatio: this.map.getPixelRatio(),
35968 showCollisionBoxes: this.map.showCollisionBoxes,
35969 promoteId: this.promoteId
35970 };
35971 tile.request = this.actor.send(message, params, (err, data) => {
35972 delete tile.request;
35973 tile.unloadVectorData();
35974 if (tile.aborted) {
35975 return callback(null);
35976 }
35977 if (err) {
35978 return callback(err);
35979 }
35980 tile.loadVectorData(data, this.map.painter, message === 'reloadTile');
35981 return callback(null);
35982 });
35983 }
35984 abortTile(tile) {
35985 if (tile.request) {
35986 tile.request.cancel();
35987 delete tile.request;
35988 }
35989 tile.aborted = true;
35990 }
35991 unloadTile(tile) {
35992 tile.unloadVectorData();
35993 this.actor.send('removeTile', { uid: tile.uid, type: this.type, source: this.id });
35994 }
35995 onRemove() {
35996 this._removed = true;
35997 this.actor.send('removeSource', { type: this.type, source: this.id });
35998 }
35999 serialize() {
36000 return performance.extend({}, this._options, {
36001 type: this.type,
36002 data: this._data
36003 });
36004 }
36005 hasTransition() {
36006 return false;
36007 }
36008}
36009
36010var rasterBoundsAttributes = performance.createLayout([
36011 { name: 'a_pos', type: 'Int16', components: 2 },
36012 { name: 'a_texture_pos', type: 'Int16', components: 2 }
36013]);
36014
36015/**
36016 * A data source containing an image.
36017 * (See the [Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/#sources-image) for detailed documentation of options.)
36018 *
36019 * @example
36020 * // add to map
36021 * map.addSource('some id', {
36022 * type: 'image',
36023 * url: 'https://www.maplibre.org/images/foo.png',
36024 * coordinates: [
36025 * [-76.54, 39.18],
36026 * [-76.52, 39.18],
36027 * [-76.52, 39.17],
36028 * [-76.54, 39.17]
36029 * ]
36030 * });
36031 *
36032 * // update coordinates
36033 * var mySource = map.getSource('some id');
36034 * mySource.setCoordinates([
36035 * [-76.54335737228394, 39.18579907229748],
36036 * [-76.52803659439087, 39.1838364847587],
36037 * [-76.5295386314392, 39.17683392507606],
36038 * [-76.54520273208618, 39.17876344106642]
36039 * ]);
36040 *
36041 * // update url and coordinates simultaneously
36042 * mySource.updateImage({
36043 * url: 'https://www.maplibre.org/images/bar.png',
36044 * coordinates: [
36045 * [-76.54335737228394, 39.18579907229748],
36046 * [-76.52803659439087, 39.1838364847587],
36047 * [-76.5295386314392, 39.17683392507606],
36048 * [-76.54520273208618, 39.17876344106642]
36049 * ]
36050 * })
36051 *
36052 * map.removeSource('some id'); // remove
36053 */
36054class ImageSource extends performance.Evented {
36055 /**
36056 * @private
36057 */
36058 constructor(id, options, dispatcher, eventedParent) {
36059 super();
36060 this.id = id;
36061 this.dispatcher = dispatcher;
36062 this.coordinates = options.coordinates;
36063 this.type = 'image';
36064 this.minzoom = 0;
36065 this.maxzoom = 22;
36066 this.tileSize = 512;
36067 this.tiles = {};
36068 this._loaded = false;
36069 this.setEventedParent(eventedParent);
36070 this.options = options;
36071 }
36072 load(newCoordinates, successCallback) {
36073 this._loaded = false;
36074 this.fire(new performance.Event('dataloading', { dataType: 'source' }));
36075 this.url = this.options.url;
36076 performance.getImage(this.map._requestManager.transformRequest(this.url, performance.ResourceType.Image), (err, image) => {
36077 this._loaded = true;
36078 if (err) {
36079 this.fire(new performance.ErrorEvent(err));
36080 }
36081 else if (image) {
36082 this.image = image;
36083 if (newCoordinates) {
36084 this.coordinates = newCoordinates;
36085 }
36086 if (successCallback) {
36087 successCallback();
36088 }
36089 this._finishLoading();
36090 }
36091 });
36092 }
36093 loaded() {
36094 return this._loaded;
36095 }
36096 /**
36097 * Updates the image URL and, optionally, the coordinates. To avoid having the image flash after changing,
36098 * set the `raster-fade-duration` paint property on the raster layer to 0.
36099 *
36100 * @param {Object} options Options object.
36101 * @param {string} [options.url] Required image URL.
36102 * @param {Array<Array<number>>} [options.coordinates] Four geographical coordinates,
36103 * represented as arrays of longitude and latitude numbers, which define the corners of the image.
36104 * The coordinates start at the top left corner of the image and proceed in clockwise order.
36105 * They do not have to represent a rectangle.
36106 * @returns {ImageSource} this
36107 */
36108 updateImage(options) {
36109 if (!this.image || !options.url) {
36110 return this;
36111 }
36112 this.options.url = options.url;
36113 this.load(options.coordinates, () => { this.texture = null; });
36114 return this;
36115 }
36116 _finishLoading() {
36117 if (this.map) {
36118 this.setCoordinates(this.coordinates);
36119 this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'metadata' }));
36120 }
36121 }
36122 onAdd(map) {
36123 this.map = map;
36124 this.load();
36125 }
36126 /**
36127 * Sets the image's coordinates and re-renders the map.
36128 *
36129 * @param {Array<Array<number>>} coordinates Four geographical coordinates,
36130 * represented as arrays of longitude and latitude numbers, which define the corners of the image.
36131 * The coordinates start at the top left corner of the image and proceed in clockwise order.
36132 * They do not have to represent a rectangle.
36133 * @returns {ImageSource} this
36134 */
36135 setCoordinates(coordinates) {
36136 this.coordinates = coordinates;
36137 // Calculate which mercator tile is suitable for rendering the video in
36138 // and create a buffer with the corner coordinates. These coordinates
36139 // may be outside the tile, because raster tiles aren't clipped when rendering.
36140 // transform the geo coordinates into (zoom 0) tile space coordinates
36141 const cornerCoords = coordinates.map(performance.MercatorCoordinate.fromLngLat);
36142 // Compute the coordinates of the tile we'll use to hold this image's
36143 // render data
36144 this.tileID = getCoordinatesCenterTileID(cornerCoords);
36145 // Constrain min/max zoom to our tile's zoom level in order to force
36146 // SourceCache to request this tile (no matter what the map's zoom
36147 // level)
36148 this.minzoom = this.maxzoom = this.tileID.z;
36149 // Transform the corner coordinates into the coordinate space of our
36150 // tile.
36151 const tileCoords = cornerCoords.map((coord) => this.tileID.getTilePoint(coord)._round());
36152 this._boundsArray = new performance.RasterBoundsArray();
36153 this._boundsArray.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0);
36154 this._boundsArray.emplaceBack(tileCoords[1].x, tileCoords[1].y, performance.EXTENT, 0);
36155 this._boundsArray.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, performance.EXTENT);
36156 this._boundsArray.emplaceBack(tileCoords[2].x, tileCoords[2].y, performance.EXTENT, performance.EXTENT);
36157 if (this.boundsBuffer) {
36158 this.boundsBuffer.destroy();
36159 delete this.boundsBuffer;
36160 }
36161 this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'content' }));
36162 return this;
36163 }
36164 prepare() {
36165 if (Object.keys(this.tiles).length === 0 || !this.image) {
36166 return;
36167 }
36168 const context = this.map.painter.context;
36169 const gl = context.gl;
36170 if (!this.boundsBuffer) {
36171 this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members);
36172 }
36173 if (!this.boundsSegments) {
36174 this.boundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
36175 }
36176 if (!this.texture) {
36177 this.texture = new Texture(context, this.image, gl.RGBA);
36178 this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
36179 }
36180 for (const w in this.tiles) {
36181 const tile = this.tiles[w];
36182 if (tile.state !== 'loaded') {
36183 tile.state = 'loaded';
36184 tile.texture = this.texture;
36185 }
36186 }
36187 }
36188 loadTile(tile, callback) {
36189 // We have a single tile -- whoose coordinates are this.tileID -- that
36190 // covers the image we want to render. If that's the one being
36191 // requested, set it up with the image; otherwise, mark the tile as
36192 // `errored` to indicate that we have no data for it.
36193 // If the world wraps, we may have multiple "wrapped" copies of the
36194 // single tile.
36195 if (this.tileID && this.tileID.equals(tile.tileID.canonical)) {
36196 this.tiles[String(tile.tileID.wrap)] = tile;
36197 tile.buckets = {};
36198 callback(null);
36199 }
36200 else {
36201 tile.state = 'errored';
36202 callback(null);
36203 }
36204 }
36205 serialize() {
36206 return {
36207 type: 'image',
36208 url: this.options.url,
36209 coordinates: this.coordinates
36210 };
36211 }
36212 hasTransition() {
36213 return false;
36214 }
36215}
36216/**
36217 * Given a list of coordinates, get their center as a coordinate.
36218 *
36219 * @returns centerpoint
36220 * @private
36221 */
36222function getCoordinatesCenterTileID(coords) {
36223 let minX = Infinity;
36224 let minY = Infinity;
36225 let maxX = -Infinity;
36226 let maxY = -Infinity;
36227 for (const coord of coords) {
36228 minX = Math.min(minX, coord.x);
36229 minY = Math.min(minY, coord.y);
36230 maxX = Math.max(maxX, coord.x);
36231 maxY = Math.max(maxY, coord.y);
36232 }
36233 const dx = maxX - minX;
36234 const dy = maxY - minY;
36235 const dMax = Math.max(dx, dy);
36236 const zoom = Math.max(0, Math.floor(-Math.log(dMax) / Math.LN2));
36237 const tilesAtZoom = Math.pow(2, zoom);
36238 return new performance.CanonicalTileID(zoom, Math.floor((minX + maxX) / 2 * tilesAtZoom), Math.floor((minY + maxY) / 2 * tilesAtZoom));
36239}
36240
36241/**
36242 * A data source containing video.
36243 * (See the [Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/#sources-video) for detailed documentation of options.)
36244 *
36245 * @example
36246 * // add to map
36247 * map.addSource('some id', {
36248 * type: 'video',
36249 * url: [
36250 * 'https://www.mapbox.com/blog/assets/baltimore-smoke.mp4',
36251 * 'https://www.mapbox.com/blog/assets/baltimore-smoke.webm'
36252 * ],
36253 * coordinates: [
36254 * [-76.54, 39.18],
36255 * [-76.52, 39.18],
36256 * [-76.52, 39.17],
36257 * [-76.54, 39.17]
36258 * ]
36259 * });
36260 *
36261 * // update
36262 * var mySource = map.getSource('some id');
36263 * mySource.setCoordinates([
36264 * [-76.54335737228394, 39.18579907229748],
36265 * [-76.52803659439087, 39.1838364847587],
36266 * [-76.5295386314392, 39.17683392507606],
36267 * [-76.54520273208618, 39.17876344106642]
36268 * ]);
36269 *
36270 * map.removeSource('some id'); // remove
36271 * @see [Add a video](https://maplibre.org/maplibre-gl-js-docs/example/video-on-a-map/)
36272 */
36273class VideoSource extends ImageSource {
36274 /**
36275 * @private
36276 */
36277 constructor(id, options, dispatcher, eventedParent) {
36278 super(id, options, dispatcher, eventedParent);
36279 this.roundZoom = true;
36280 this.type = 'video';
36281 this.options = options;
36282 }
36283 load() {
36284 this._loaded = false;
36285 const options = this.options;
36286 this.urls = [];
36287 for (const url of options.urls) {
36288 this.urls.push(this.map._requestManager.transformRequest(url, performance.ResourceType.Source).url);
36289 }
36290 performance.getVideo(this.urls, (err, video) => {
36291 this._loaded = true;
36292 if (err) {
36293 this.fire(new performance.ErrorEvent(err));
36294 }
36295 else if (video) {
36296 this.video = video;
36297 this.video.loop = true;
36298 // Start repainting when video starts playing. hasTransition() will then return
36299 // true to trigger additional frames as long as the videos continues playing.
36300 this.video.addEventListener('playing', () => {
36301 this.map.triggerRepaint();
36302 });
36303 if (this.map) {
36304 this.video.play();
36305 }
36306 this._finishLoading();
36307 }
36308 });
36309 }
36310 /**
36311 * Pauses the video.
36312 */
36313 pause() {
36314 if (this.video) {
36315 this.video.pause();
36316 }
36317 }
36318 /**
36319 * Plays the video.
36320 */
36321 play() {
36322 if (this.video) {
36323 this.video.play();
36324 }
36325 }
36326 /**
36327 * Sets playback to a timestamp, in seconds.
36328 * @private
36329 */
36330 seek(seconds) {
36331 if (this.video) {
36332 const seekableRange = this.video.seekable;
36333 if (seconds < seekableRange.start(0) || seconds > seekableRange.end(0)) {
36334 this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${this.id}`, null, `Playback for this video can be set only between the ${seekableRange.start(0)} and ${seekableRange.end(0)}-second mark.`)));
36335 }
36336 else
36337 this.video.currentTime = seconds;
36338 }
36339 }
36340 /**
36341 * Returns the HTML `video` element.
36342 *
36343 * @returns {HTMLVideoElement} The HTML `video` element.
36344 */
36345 getVideo() {
36346 return this.video;
36347 }
36348 onAdd(map) {
36349 if (this.map)
36350 return;
36351 this.map = map;
36352 this.load();
36353 if (this.video) {
36354 this.video.play();
36355 this.setCoordinates(this.coordinates);
36356 }
36357 }
36358 /**
36359 * Sets the video's coordinates and re-renders the map.
36360 *
36361 * @method setCoordinates
36362 * @instance
36363 * @memberof VideoSource
36364 * @returns {VideoSource} this
36365 */
36366 // setCoordinates inherited from ImageSource
36367 prepare() {
36368 if (Object.keys(this.tiles).length === 0 || this.video.readyState < 2) {
36369 return; // not enough data for current position
36370 }
36371 const context = this.map.painter.context;
36372 const gl = context.gl;
36373 if (!this.boundsBuffer) {
36374 this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members);
36375 }
36376 if (!this.boundsSegments) {
36377 this.boundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
36378 }
36379 if (!this.texture) {
36380 this.texture = new Texture(context, this.video, gl.RGBA);
36381 this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
36382 }
36383 else if (!this.video.paused) {
36384 this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
36385 gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video);
36386 }
36387 for (const w in this.tiles) {
36388 const tile = this.tiles[w];
36389 if (tile.state !== 'loaded') {
36390 tile.state = 'loaded';
36391 tile.texture = this.texture;
36392 }
36393 }
36394 }
36395 serialize() {
36396 return {
36397 type: 'video',
36398 urls: this.urls,
36399 coordinates: this.coordinates
36400 };
36401 }
36402 hasTransition() {
36403 return this.video && !this.video.paused;
36404 }
36405}
36406
36407/**
36408 * Options to add a canvas source type to the map.
36409 *
36410 * @typedef {Object} CanvasSourceOptions
36411 * @property {string} type Source type. Must be `"canvas"`.
36412 * @property {string|HTMLCanvasElement} canvas Canvas source from which to read pixels. Can be a string representing the ID of the canvas element, or the `HTMLCanvasElement` itself.
36413 * @property {Array<Array<number>>} coordinates Four geographical coordinates denoting where to place the corners of the canvas, specified in `[longitude, latitude]` pairs.
36414 * @property {boolean} [animate=true] Whether the canvas source is animated. If the canvas is static (i.e. pixels do not need to be re-read on every frame), `animate` should be set to `false` to improve performance.
36415 */
36416/**
36417 * A data source containing the contents of an HTML canvas. See {@link CanvasSourceOptions} for detailed documentation of options.
36418 *
36419 * @example
36420 * // add to map
36421 * map.addSource('some id', {
36422 * type: 'canvas',
36423 * canvas: 'idOfMyHTMLCanvas',
36424 * animate: true,
36425 * coordinates: [
36426 * [-76.54, 39.18],
36427 * [-76.52, 39.18],
36428 * [-76.52, 39.17],
36429 * [-76.54, 39.17]
36430 * ]
36431 * });
36432 *
36433 * // update
36434 * var mySource = map.getSource('some id');
36435 * mySource.setCoordinates([
36436 * [-76.54335737228394, 39.18579907229748],
36437 * [-76.52803659439087, 39.1838364847587],
36438 * [-76.5295386314392, 39.17683392507606],
36439 * [-76.54520273208618, 39.17876344106642]
36440 * ]);
36441 *
36442 * map.removeSource('some id'); // remove
36443 */
36444class CanvasSource extends ImageSource {
36445 /**
36446 * @private
36447 */
36448 constructor(id, options, dispatcher, eventedParent) {
36449 super(id, options, dispatcher, eventedParent);
36450 // We build in some validation here, since canvas sources aren't included in the style spec:
36451 if (!options.coordinates) {
36452 this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${id}`, null, 'missing required property "coordinates"')));
36453 }
36454 else if (!Array.isArray(options.coordinates) || options.coordinates.length !== 4 ||
36455 options.coordinates.some(c => !Array.isArray(c) || c.length !== 2 || c.some(l => typeof l !== 'number'))) {
36456 this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${id}`, null, '"coordinates" property must be an array of 4 longitude/latitude array pairs')));
36457 }
36458 if (options.animate && typeof options.animate !== 'boolean') {
36459 this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${id}`, null, 'optional "animate" property must be a boolean value')));
36460 }
36461 if (!options.canvas) {
36462 this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${id}`, null, 'missing required property "canvas"')));
36463 }
36464 else if (typeof options.canvas !== 'string' && !(options.canvas instanceof HTMLCanvasElement)) {
36465 this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${id}`, null, '"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance')));
36466 }
36467 this.options = options;
36468 this.animate = options.animate !== undefined ? options.animate : true;
36469 }
36470 /**
36471 * Enables animation. The image will be copied from the canvas to the map on each frame.
36472 * @method play
36473 * @instance
36474 * @memberof CanvasSource
36475 */
36476 /**
36477 * Disables animation. The map will display a static copy of the canvas image.
36478 * @method pause
36479 * @instance
36480 * @memberof CanvasSource
36481 */
36482 load() {
36483 this._loaded = true;
36484 if (!this.canvas) {
36485 this.canvas = (this.options.canvas instanceof HTMLCanvasElement) ?
36486 this.options.canvas :
36487 document.getElementById(this.options.canvas);
36488 // cast to HTMLCanvasElement in else of ternary
36489 // should we do a safety check and throw if it's not actually HTMLCanvasElement?
36490 }
36491 this.width = this.canvas.width;
36492 this.height = this.canvas.height;
36493 if (this._hasInvalidDimensions()) {
36494 this.fire(new performance.ErrorEvent(new Error('Canvas dimensions cannot be less than or equal to zero.')));
36495 return;
36496 }
36497 this.play = function () {
36498 this._playing = true;
36499 this.map.triggerRepaint();
36500 };
36501 this.pause = function () {
36502 if (this._playing) {
36503 this.prepare();
36504 this._playing = false;
36505 }
36506 };
36507 this._finishLoading();
36508 }
36509 /**
36510 * Returns the HTML `canvas` element.
36511 *
36512 * @returns {HTMLCanvasElement} The HTML `canvas` element.
36513 */
36514 getCanvas() {
36515 return this.canvas;
36516 }
36517 onAdd(map) {
36518 this.map = map;
36519 this.load();
36520 if (this.canvas) {
36521 if (this.animate)
36522 this.play();
36523 }
36524 }
36525 onRemove() {
36526 this.pause();
36527 }
36528 // /**
36529 // * Sets the canvas's coordinates and re-renders the map.
36530 // *
36531 // * @method setCoordinates
36532 // * @instance
36533 // * @memberof CanvasSource
36534 // * @param {Array<Array<number>>} coordinates Four geographical coordinates,
36535 // * represented as arrays of longitude and latitude numbers, which define the corners of the canvas.
36536 // * The coordinates start at the top left corner of the canvas and proceed in clockwise order.
36537 // * They do not have to represent a rectangle.
36538 // * @returns {CanvasSource} this
36539 // */
36540 // setCoordinates inherited from ImageSource
36541 prepare() {
36542 let resize = false;
36543 if (this.canvas.width !== this.width) {
36544 this.width = this.canvas.width;
36545 resize = true;
36546 }
36547 if (this.canvas.height !== this.height) {
36548 this.height = this.canvas.height;
36549 resize = true;
36550 }
36551 if (this._hasInvalidDimensions())
36552 return;
36553 if (Object.keys(this.tiles).length === 0)
36554 return; // not enough data for current position
36555 const context = this.map.painter.context;
36556 const gl = context.gl;
36557 if (!this.boundsBuffer) {
36558 this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members);
36559 }
36560 if (!this.boundsSegments) {
36561 this.boundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
36562 }
36563 if (!this.texture) {
36564 this.texture = new Texture(context, this.canvas, gl.RGBA, { premultiply: true });
36565 }
36566 else if (resize || this._playing) {
36567 this.texture.update(this.canvas, { premultiply: true });
36568 }
36569 for (const w in this.tiles) {
36570 const tile = this.tiles[w];
36571 if (tile.state !== 'loaded') {
36572 tile.state = 'loaded';
36573 tile.texture = this.texture;
36574 }
36575 }
36576 }
36577 serialize() {
36578 return {
36579 type: 'canvas',
36580 coordinates: this.coordinates
36581 };
36582 }
36583 hasTransition() {
36584 return this._playing;
36585 }
36586 _hasInvalidDimensions() {
36587 for (const x of [this.canvas.width, this.canvas.height]) {
36588 if (isNaN(x) || x <= 0)
36589 return true;
36590 }
36591 return false;
36592 }
36593}
36594
36595const sourceTypes = {
36596 vector: VectorTileSource,
36597 raster: RasterTileSource,
36598 'raster-dem': RasterDEMTileSource,
36599 geojson: GeoJSONSource,
36600 video: VideoSource,
36601 image: ImageSource,
36602 canvas: CanvasSource
36603};
36604/*
36605 * Creates a tiled data source instance given an options object.
36606 *
36607 * @param id
36608 * @param {Object} source A source definition object compliant with
36609 * [`maplibre-gl-style-spec`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#sources) or, for a third-party source type,
36610 * with that type's requirements.
36611 * @param {Dispatcher} dispatcher
36612 * @returns {Source}
36613 */
36614const create = function (id, specification, dispatcher, eventedParent) {
36615 const source = new sourceTypes[specification.type](id, specification, dispatcher, eventedParent);
36616 if (source.id !== id) {
36617 throw new Error(`Expected Source id to be ${id} instead of ${source.id}`);
36618 }
36619 performance.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source);
36620 return source;
36621};
36622const getSourceType = function (name) {
36623 return sourceTypes[name];
36624};
36625const setSourceType = function (name, type) {
36626 sourceTypes[name] = type;
36627};
36628
36629/*
36630 * Returns a matrix that can be used to convert from tile coordinates to viewport pixel coordinates.
36631 */
36632function getPixelPosMatrix(transform, tileID) {
36633 const t = performance.create();
36634 performance.translate(t, t, [1, 1, 0]);
36635 performance.scale(t, t, [transform.width * 0.5, transform.height * 0.5, 1]);
36636 return performance.multiply(t, t, transform.calculatePosMatrix(tileID.toUnwrapped()));
36637}
36638function queryIncludes3DLayer(layers, styleLayers, sourceID) {
36639 if (layers) {
36640 for (const layerID of layers) {
36641 const layer = styleLayers[layerID];
36642 if (layer && layer.source === sourceID && layer.type === 'fill-extrusion') {
36643 return true;
36644 }
36645 }
36646 }
36647 else {
36648 for (const key in styleLayers) {
36649 const layer = styleLayers[key];
36650 if (layer.source === sourceID && layer.type === 'fill-extrusion') {
36651 return true;
36652 }
36653 }
36654 }
36655 return false;
36656}
36657function queryRenderedFeatures(sourceCache, styleLayers, serializedLayers, queryGeometry, params, transform) {
36658 const has3DLayer = queryIncludes3DLayer(params && params.layers, styleLayers, sourceCache.id);
36659 const maxPitchScaleFactor = transform.maxPitchScaleFactor();
36660 const tilesIn = sourceCache.tilesIn(queryGeometry, maxPitchScaleFactor, has3DLayer);
36661 tilesIn.sort(sortTilesIn);
36662 const renderedFeatureLayers = [];
36663 for (const tileIn of tilesIn) {
36664 renderedFeatureLayers.push({
36665 wrappedTileID: tileIn.tileID.wrapped().key,
36666 queryResults: tileIn.tile.queryRenderedFeatures(styleLayers, serializedLayers, sourceCache._state, tileIn.queryGeometry, tileIn.cameraQueryGeometry, tileIn.scale, params, transform, maxPitchScaleFactor, getPixelPosMatrix(sourceCache.transform, tileIn.tileID))
36667 });
36668 }
36669 const result = mergeRenderedFeatureLayers(renderedFeatureLayers);
36670 // Merge state from SourceCache into the results
36671 for (const layerID in result) {
36672 result[layerID].forEach((featureWrapper) => {
36673 const feature = featureWrapper.feature;
36674 const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id);
36675 feature.source = feature.layer.source;
36676 if (feature.layer['source-layer']) {
36677 feature.sourceLayer = feature.layer['source-layer'];
36678 }
36679 feature.state = state;
36680 });
36681 }
36682 return result;
36683}
36684function queryRenderedSymbols(styleLayers, serializedLayers, sourceCaches, queryGeometry, params, collisionIndex, retainedQueryData) {
36685 const result = {};
36686 const renderedSymbols = collisionIndex.queryRenderedSymbols(queryGeometry);
36687 const bucketQueryData = [];
36688 for (const bucketInstanceId of Object.keys(renderedSymbols).map(Number)) {
36689 bucketQueryData.push(retainedQueryData[bucketInstanceId]);
36690 }
36691 bucketQueryData.sort(sortTilesIn);
36692 for (const queryData of bucketQueryData) {
36693 const bucketSymbols = queryData.featureIndex.lookupSymbolFeatures(renderedSymbols[queryData.bucketInstanceId], serializedLayers, queryData.bucketIndex, queryData.sourceLayerIndex, params.filter, params.layers, params.availableImages, styleLayers);
36694 for (const layerID in bucketSymbols) {
36695 const resultFeatures = result[layerID] = result[layerID] || [];
36696 const layerSymbols = bucketSymbols[layerID];
36697 layerSymbols.sort((a, b) => {
36698 // Match topDownFeatureComparator from FeatureIndex, but using
36699 // most recent sorting of features from bucket.sortFeatures
36700 const featureSortOrder = queryData.featureSortOrder;
36701 if (featureSortOrder) {
36702 // queryRenderedSymbols documentation says we'll return features in
36703 // "top-to-bottom" rendering order (aka last-to-first).
36704 // Actually there can be multiple symbol instances per feature, so
36705 // we sort each feature based on the first matching symbol instance.
36706 const sortedA = featureSortOrder.indexOf(a.featureIndex);
36707 const sortedB = featureSortOrder.indexOf(b.featureIndex);
36708 performance.assert(sortedA >= 0);
36709 performance.assert(sortedB >= 0);
36710 return sortedB - sortedA;
36711 }
36712 else {
36713 // Bucket hasn't been re-sorted based on angle, so use the
36714 // reverse of the order the features appeared in the data.
36715 return b.featureIndex - a.featureIndex;
36716 }
36717 });
36718 for (const symbolFeature of layerSymbols) {
36719 resultFeatures.push(symbolFeature);
36720 }
36721 }
36722 }
36723 // Merge state from SourceCache into the results
36724 for (const layerName in result) {
36725 result[layerName].forEach((featureWrapper) => {
36726 const feature = featureWrapper.feature;
36727 const layer = styleLayers[layerName];
36728 const sourceCache = sourceCaches[layer.source];
36729 const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id);
36730 feature.source = feature.layer.source;
36731 if (feature.layer['source-layer']) {
36732 feature.sourceLayer = feature.layer['source-layer'];
36733 }
36734 feature.state = state;
36735 });
36736 }
36737 return result;
36738}
36739function querySourceFeatures(sourceCache, params) {
36740 const tiles = sourceCache.getRenderableIds().map((id) => {
36741 return sourceCache.getTileByID(id);
36742 });
36743 const result = [];
36744 const dataTiles = {};
36745 for (let i = 0; i < tiles.length; i++) {
36746 const tile = tiles[i];
36747 const dataID = tile.tileID.canonical.key;
36748 if (!dataTiles[dataID]) {
36749 dataTiles[dataID] = true;
36750 tile.querySourceFeatures(result, params);
36751 }
36752 }
36753 return result;
36754}
36755function sortTilesIn(a, b) {
36756 const idA = a.tileID;
36757 const idB = b.tileID;
36758 return (idA.overscaledZ - idB.overscaledZ) || (idA.canonical.y - idB.canonical.y) || (idA.wrap - idB.wrap) || (idA.canonical.x - idB.canonical.x);
36759}
36760function mergeRenderedFeatureLayers(tiles) {
36761 // Merge results from all tiles, but if two tiles share the same
36762 // wrapped ID, don't duplicate features between the two tiles
36763 const result = {};
36764 const wrappedIDLayerMap = {};
36765 for (const tile of tiles) {
36766 const queryResults = tile.queryResults;
36767 const wrappedID = tile.wrappedTileID;
36768 const wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {};
36769 for (const layerID in queryResults) {
36770 const tileFeatures = queryResults[layerID];
36771 const wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {};
36772 const resultFeatures = result[layerID] = result[layerID] || [];
36773 for (const tileFeature of tileFeatures) {
36774 if (!wrappedIDFeatures[tileFeature.featureIndex]) {
36775 wrappedIDFeatures[tileFeature.featureIndex] = true;
36776 resultFeatures.push(tileFeature);
36777 }
36778 }
36779 }
36780 }
36781 return result;
36782}
36783
36784function deserialize(input, style) {
36785 const output = {};
36786 // Guard against the case where the map's style has been set to null while
36787 // this bucket has been parsing.
36788 if (!style)
36789 return output;
36790 for (const bucket of input) {
36791 const layers = bucket.layerIds
36792 .map((id) => style.getLayer(id))
36793 .filter(Boolean);
36794 if (layers.length === 0) {
36795 continue;
36796 }
36797 // look up StyleLayer objects from layer ids (since we don't
36798 // want to waste time serializing/copying them from the worker)
36799 bucket.layers = layers;
36800 if (bucket.stateDependentLayerIds) {
36801 bucket.stateDependentLayers = bucket.stateDependentLayerIds.map((lId) => layers.filter((l) => l.id === lId)[0]);
36802 }
36803 for (const layer of layers) {
36804 output[layer.id] = bucket;
36805 }
36806 }
36807 return output;
36808}
36809
36810const CLOCK_SKEW_RETRY_TIMEOUT = 30000;
36811/**
36812 * A tile object is the combination of a Coordinate, which defines
36813 * its place, as well as a unique ID and data tracking for its content
36814 *
36815 * @private
36816 */
36817class Tile {
36818 /**
36819 * @param {OverscaledTileID} tileID
36820 * @param size
36821 * @private
36822 */
36823 constructor(tileID, size) {
36824 this.tileID = tileID;
36825 this.uid = performance.uniqueId();
36826 this.uses = 0;
36827 this.tileSize = size;
36828 this.buckets = {};
36829 this.expirationTime = null;
36830 this.queryPadding = 0;
36831 this.hasSymbolBuckets = false;
36832 this.hasRTLText = false;
36833 this.dependencies = {};
36834 // Counts the number of times a response was already expired when
36835 // received. We're using this to add a delay when making a new request
36836 // so we don't have to keep retrying immediately in case of a server
36837 // serving expired tiles.
36838 this.expiredRequestCount = 0;
36839 this.state = 'loading';
36840 }
36841 registerFadeDuration(duration) {
36842 const fadeEndTime = duration + this.timeAdded;
36843 if (fadeEndTime < performance.exported.now())
36844 return;
36845 if (this.fadeEndTime && fadeEndTime < this.fadeEndTime)
36846 return;
36847 this.fadeEndTime = fadeEndTime;
36848 }
36849 wasRequested() {
36850 return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading';
36851 }
36852 /**
36853 * Given a data object with a 'buffers' property, load it into
36854 * this tile's elementGroups and buffers properties and set loaded
36855 * to true. If the data is null, like in the case of an empty
36856 * GeoJSON tile, no-op but still set loaded to true.
36857 * @param {Object} data
36858 * @param painter
36859 * @returns {undefined}
36860 * @private
36861 */
36862 loadVectorData(data, painter, justReloaded) {
36863 if (this.hasData()) {
36864 this.unloadVectorData();
36865 }
36866 this.state = 'loaded';
36867 // empty GeoJSON tile
36868 if (!data) {
36869 this.collisionBoxArray = new performance.CollisionBoxArray();
36870 return;
36871 }
36872 if (data.featureIndex) {
36873 this.latestFeatureIndex = data.featureIndex;
36874 if (data.rawTileData) {
36875 // Only vector tiles have rawTileData, and they won't update it for
36876 // 'reloadTile'
36877 this.latestRawTileData = data.rawTileData;
36878 this.latestFeatureIndex.rawTileData = data.rawTileData;
36879 }
36880 else if (this.latestRawTileData) {
36881 // If rawTileData hasn't updated, hold onto a pointer to the last
36882 // one we received
36883 this.latestFeatureIndex.rawTileData = this.latestRawTileData;
36884 }
36885 }
36886 this.collisionBoxArray = data.collisionBoxArray;
36887 this.buckets = deserialize(data.buckets, painter.style);
36888 this.hasSymbolBuckets = false;
36889 for (const id in this.buckets) {
36890 const bucket = this.buckets[id];
36891 if (bucket instanceof performance.SymbolBucket) {
36892 this.hasSymbolBuckets = true;
36893 if (justReloaded) {
36894 bucket.justReloaded = true;
36895 }
36896 else {
36897 break;
36898 }
36899 }
36900 }
36901 this.hasRTLText = false;
36902 if (this.hasSymbolBuckets) {
36903 for (const id in this.buckets) {
36904 const bucket = this.buckets[id];
36905 if (bucket instanceof performance.SymbolBucket) {
36906 if (bucket.hasRTLText) {
36907 this.hasRTLText = true;
36908 performance.lazyLoadRTLTextPlugin();
36909 break;
36910 }
36911 }
36912 }
36913 }
36914 this.queryPadding = 0;
36915 for (const id in this.buckets) {
36916 const bucket = this.buckets[id];
36917 this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id).queryRadius(bucket));
36918 }
36919 if (data.imageAtlas) {
36920 this.imageAtlas = data.imageAtlas;
36921 }
36922 if (data.glyphAtlasImage) {
36923 this.glyphAtlasImage = data.glyphAtlasImage;
36924 }
36925 }
36926 /**
36927 * Release any data or WebGL resources referenced by this tile.
36928 * @returns {undefined}
36929 * @private
36930 */
36931 unloadVectorData() {
36932 for (const id in this.buckets) {
36933 this.buckets[id].destroy();
36934 }
36935 this.buckets = {};
36936 if (this.imageAtlasTexture) {
36937 this.imageAtlasTexture.destroy();
36938 }
36939 if (this.imageAtlas) {
36940 this.imageAtlas = null;
36941 }
36942 if (this.glyphAtlasTexture) {
36943 this.glyphAtlasTexture.destroy();
36944 }
36945 this.latestFeatureIndex = null;
36946 this.state = 'unloaded';
36947 }
36948 getBucket(layer) {
36949 return this.buckets[layer.id];
36950 }
36951 upload(context) {
36952 for (const id in this.buckets) {
36953 const bucket = this.buckets[id];
36954 if (bucket.uploadPending()) {
36955 bucket.upload(context);
36956 }
36957 }
36958 const gl = context.gl;
36959 if (this.imageAtlas && !this.imageAtlas.uploaded) {
36960 this.imageAtlasTexture = new Texture(context, this.imageAtlas.image, gl.RGBA);
36961 this.imageAtlas.uploaded = true;
36962 }
36963 if (this.glyphAtlasImage) {
36964 this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.ALPHA);
36965 this.glyphAtlasImage = null;
36966 }
36967 }
36968 prepare(imageManager) {
36969 if (this.imageAtlas) {
36970 this.imageAtlas.patchUpdatedImages(imageManager, this.imageAtlasTexture);
36971 }
36972 }
36973 // Queries non-symbol features rendered for this tile.
36974 // Symbol features are queried globally
36975 queryRenderedFeatures(layers, serializedLayers, sourceFeatureState, queryGeometry, cameraQueryGeometry, scale, params, transform, maxPitchScaleFactor, pixelPosMatrix) {
36976 if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData)
36977 return {};
36978 return this.latestFeatureIndex.query({
36979 queryGeometry,
36980 cameraQueryGeometry,
36981 scale,
36982 tileSize: this.tileSize,
36983 pixelPosMatrix,
36984 transform,
36985 params,
36986 queryPadding: this.queryPadding * maxPitchScaleFactor
36987 }, layers, serializedLayers, sourceFeatureState);
36988 }
36989 querySourceFeatures(result, params) {
36990 const featureIndex = this.latestFeatureIndex;
36991 if (!featureIndex || !featureIndex.rawTileData)
36992 return;
36993 const vtLayers = featureIndex.loadVTLayers();
36994 const sourceLayer = params ? params.sourceLayer : '';
36995 const layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer];
36996 if (!layer)
36997 return;
36998 const filter = performance.createFilter(params && params.filter);
36999 const { z, x, y } = this.tileID.canonical;
37000 const coord = { z, x, y };
37001 for (let i = 0; i < layer.length; i++) {
37002 const feature = layer.feature(i);
37003 if (filter.needGeometry) {
37004 const evaluationFeature = performance.toEvaluationFeature(feature, true);
37005 if (!filter.filter(new performance.EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical))
37006 continue;
37007 }
37008 else if (!filter.filter(new performance.EvaluationParameters(this.tileID.overscaledZ), feature)) {
37009 continue;
37010 }
37011 const id = featureIndex.getId(feature, sourceLayer);
37012 const geojsonFeature = new performance.GeoJSONFeature(feature, z, x, y, id);
37013 geojsonFeature.tile = coord;
37014 result.push(geojsonFeature);
37015 }
37016 }
37017 hasData() {
37018 return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired';
37019 }
37020 patternsLoaded() {
37021 return this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length;
37022 }
37023 setExpiryData(data) {
37024 const prior = this.expirationTime;
37025 if (data.cacheControl) {
37026 const parsedCC = performance.parseCacheControl(data.cacheControl);
37027 if (parsedCC['max-age'])
37028 this.expirationTime = Date.now() + parsedCC['max-age'] * 1000;
37029 }
37030 else if (data.expires) {
37031 this.expirationTime = new Date(data.expires).getTime();
37032 }
37033 if (this.expirationTime) {
37034 const now = Date.now();
37035 let isExpired = false;
37036 if (this.expirationTime > now) {
37037 isExpired = false;
37038 }
37039 else if (!prior) {
37040 isExpired = true;
37041 }
37042 else if (this.expirationTime < prior) {
37043 // Expiring date is going backwards:
37044 // fall back to exponential backoff
37045 isExpired = true;
37046 }
37047 else {
37048 const delta = this.expirationTime - prior;
37049 if (!delta) {
37050 // Server is serving the same expired resource over and over: fall
37051 // back to exponential backoff.
37052 isExpired = true;
37053 }
37054 else {
37055 // Assume that either the client or the server clock is wrong and
37056 // try to interpolate a valid expiration date (from the client POV)
37057 // observing a minimum timeout.
37058 this.expirationTime = now + Math.max(delta, CLOCK_SKEW_RETRY_TIMEOUT);
37059 }
37060 }
37061 if (isExpired) {
37062 this.expiredRequestCount++;
37063 this.state = 'expired';
37064 }
37065 else {
37066 this.expiredRequestCount = 0;
37067 }
37068 }
37069 }
37070 getExpiryTimeout() {
37071 if (this.expirationTime) {
37072 if (this.expiredRequestCount) {
37073 return 1000 * (1 << Math.min(this.expiredRequestCount - 1, 31));
37074 }
37075 else {
37076 // Max value for `setTimeout` implementations is a 32 bit integer; cap this accordingly
37077 return Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1);
37078 }
37079 }
37080 }
37081 setFeatureState(states, painter) {
37082 if (!this.latestFeatureIndex ||
37083 !this.latestFeatureIndex.rawTileData ||
37084 Object.keys(states).length === 0) {
37085 return;
37086 }
37087 const vtLayers = this.latestFeatureIndex.loadVTLayers();
37088 for (const id in this.buckets) {
37089 if (!painter.style.hasLayer(id))
37090 continue;
37091 const bucket = this.buckets[id];
37092 // Buckets are grouped by common source-layer
37093 const sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer';
37094 const sourceLayer = vtLayers[sourceLayerId];
37095 const sourceLayerStates = states[sourceLayerId];
37096 if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0)
37097 continue;
37098 bucket.update(sourceLayerStates, sourceLayer, this.imageAtlas && this.imageAtlas.patternPositions || {});
37099 const layer = painter && painter.style && painter.style.getLayer(id);
37100 if (layer) {
37101 this.queryPadding = Math.max(this.queryPadding, layer.queryRadius(bucket));
37102 }
37103 }
37104 }
37105 holdingForFade() {
37106 return this.symbolFadeHoldUntil !== undefined;
37107 }
37108 symbolFadeFinished() {
37109 return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < performance.exported.now();
37110 }
37111 clearFadeHold() {
37112 this.symbolFadeHoldUntil = undefined;
37113 }
37114 setHoldDuration(duration) {
37115 this.symbolFadeHoldUntil = performance.exported.now() + duration;
37116 }
37117 setDependencies(namespace, dependencies) {
37118 const index = {};
37119 for (const dep of dependencies) {
37120 index[dep] = true;
37121 }
37122 this.dependencies[namespace] = index;
37123 }
37124 hasDependency(namespaces, keys) {
37125 for (const namespace of namespaces) {
37126 const dependencies = this.dependencies[namespace];
37127 if (dependencies) {
37128 for (const key of keys) {
37129 if (dependencies[key]) {
37130 return true;
37131 }
37132 }
37133 }
37134 }
37135 return false;
37136 }
37137}
37138
37139/**
37140 * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)
37141 * with hash lookup made possible by keeping a list of keys in parallel to
37142 * an array of dictionary of values
37143 *
37144 * @private
37145 */
37146class TileCache {
37147 /**
37148 * @param {number} max number of permitted values
37149 * @param {Function} onRemove callback called with items when they expire
37150 */
37151 constructor(max, onRemove) {
37152 this.max = max;
37153 this.onRemove = onRemove;
37154 this.reset();
37155 }
37156 /**
37157 * Clear the cache
37158 *
37159 * @returns {TileCache} this cache
37160 * @private
37161 */
37162 reset() {
37163 for (const key in this.data) {
37164 for (const removedData of this.data[key]) {
37165 if (removedData.timeout)
37166 clearTimeout(removedData.timeout);
37167 this.onRemove(removedData.value);
37168 }
37169 }
37170 this.data = {};
37171 this.order = [];
37172 return this;
37173 }
37174 /**
37175 * Add a key, value combination to the cache, trimming its size if this pushes
37176 * it over max length.
37177 *
37178 * @param {OverscaledTileID} tileID lookup key for the item
37179 * @param {*} data any value
37180 *
37181 * @returns {TileCache} this cache
37182 * @private
37183 */
37184 add(tileID, data, expiryTimeout) {
37185 const key = tileID.wrapped().key;
37186 if (this.data[key] === undefined) {
37187 this.data[key] = [];
37188 }
37189 const dataWrapper = {
37190 value: data,
37191 timeout: undefined
37192 };
37193 if (expiryTimeout !== undefined) {
37194 dataWrapper.timeout = setTimeout(() => {
37195 this.remove(tileID, dataWrapper);
37196 }, expiryTimeout);
37197 }
37198 this.data[key].push(dataWrapper);
37199 this.order.push(key);
37200 if (this.order.length > this.max) {
37201 const removedData = this._getAndRemoveByKey(this.order[0]);
37202 if (removedData)
37203 this.onRemove(removedData);
37204 }
37205 return this;
37206 }
37207 /**
37208 * Determine whether the value attached to `key` is present
37209 *
37210 * @param {OverscaledTileID} tileID the key to be looked-up
37211 * @returns {boolean} whether the cache has this value
37212 * @private
37213 */
37214 has(tileID) {
37215 return tileID.wrapped().key in this.data;
37216 }
37217 /**
37218 * Get the value attached to a specific key and remove data from cache.
37219 * If the key is not found, returns `null`
37220 *
37221 * @param {OverscaledTileID} tileID the key to look up
37222 * @returns {*} the data, or null if it isn't found
37223 * @private
37224 */
37225 getAndRemove(tileID) {
37226 if (!this.has(tileID)) {
37227 return null;
37228 }
37229 return this._getAndRemoveByKey(tileID.wrapped().key);
37230 }
37231 /*
37232 * Get and remove the value with the specified key.
37233 */
37234 _getAndRemoveByKey(key) {
37235 const data = this.data[key].shift();
37236 if (data.timeout)
37237 clearTimeout(data.timeout);
37238 if (this.data[key].length === 0) {
37239 delete this.data[key];
37240 }
37241 this.order.splice(this.order.indexOf(key), 1);
37242 return data.value;
37243 }
37244 /*
37245 * Get the value with the specified (wrapped tile) key.
37246 */
37247 getByKey(key) {
37248 const data = this.data[key];
37249 return data ? data[0].value : null;
37250 }
37251 /**
37252 * Get the value attached to a specific key without removing data
37253 * from the cache. If the key is not found, returns `null`
37254 *
37255 * @param {OverscaledTileID} tileID the key to look up
37256 * @returns {*} the data, or null if it isn't found
37257 * @private
37258 */
37259 get(tileID) {
37260 if (!this.has(tileID)) {
37261 return null;
37262 }
37263 const data = this.data[tileID.wrapped().key][0];
37264 return data.value;
37265 }
37266 /**
37267 * Remove a key/value combination from the cache.
37268 *
37269 * @param {OverscaledTileID} tileID the key for the pair to delete
37270 * @param {Tile} value If a value is provided, remove that exact version of the value.
37271 * @returns {TileCache} this cache
37272 * @private
37273 */
37274 remove(tileID, value) {
37275 if (!this.has(tileID)) {
37276 return this;
37277 }
37278 const key = tileID.wrapped().key;
37279 const dataIndex = value === undefined ? 0 : this.data[key].indexOf(value);
37280 const data = this.data[key][dataIndex];
37281 this.data[key].splice(dataIndex, 1);
37282 if (data.timeout)
37283 clearTimeout(data.timeout);
37284 if (this.data[key].length === 0) {
37285 delete this.data[key];
37286 }
37287 this.onRemove(data.value);
37288 this.order.splice(this.order.indexOf(key), 1);
37289 return this;
37290 }
37291 /**
37292 * Change the max size of the cache.
37293 *
37294 * @param {number} max the max size of the cache
37295 * @returns {TileCache} this cache
37296 * @private
37297 */
37298 setMaxSize(max) {
37299 this.max = max;
37300 while (this.order.length > this.max) {
37301 const removedData = this._getAndRemoveByKey(this.order[0]);
37302 if (removedData)
37303 this.onRemove(removedData);
37304 }
37305 return this;
37306 }
37307 /**
37308 * Remove entries that do not pass a filter function. Used for removing
37309 * stale tiles from the cache.
37310 *
37311 * @param {function} filterFn Determines whether the tile is filtered. If the supplied function returns false, the tile will be filtered out.
37312 */
37313 filter(filterFn) {
37314 const removed = [];
37315 for (const key in this.data) {
37316 for (const entry of this.data[key]) {
37317 if (!filterFn(entry.value)) {
37318 removed.push(entry);
37319 }
37320 }
37321 }
37322 for (const r of removed) {
37323 this.remove(r.value.tileID, r);
37324 }
37325 }
37326}
37327
37328/**
37329 * SourceFeatureState manages the state and pending changes
37330 * to features in a source, separated by source layer.
37331 * stateChanges and deletedStates batch all changes to the tile (updates and removes, respectively)
37332 * between coalesce() events. addFeatureState() and removeFeatureState() also update their counterpart's
37333 * list of changes, such that coalesce() can apply the proper state changes while agnostic to the order of operations.
37334 * In deletedStates, all null's denote complete removal of state at that scope
37335 * @private
37336*/
37337class SourceFeatureState {
37338 constructor() {
37339 this.state = {};
37340 this.stateChanges = {};
37341 this.deletedStates = {};
37342 }
37343 updateState(sourceLayer, featureId, newState) {
37344 const feature = String(featureId);
37345 this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {};
37346 this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {};
37347 performance.extend(this.stateChanges[sourceLayer][feature], newState);
37348 if (this.deletedStates[sourceLayer] === null) {
37349 this.deletedStates[sourceLayer] = {};
37350 for (const ft in this.state[sourceLayer]) {
37351 if (ft !== feature)
37352 this.deletedStates[sourceLayer][ft] = null;
37353 }
37354 }
37355 else {
37356 const featureDeletionQueued = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] === null;
37357 if (featureDeletionQueued) {
37358 this.deletedStates[sourceLayer][feature] = {};
37359 for (const prop in this.state[sourceLayer][feature]) {
37360 if (!newState[prop])
37361 this.deletedStates[sourceLayer][feature][prop] = null;
37362 }
37363 }
37364 else {
37365 for (const key in newState) {
37366 const deletionInQueue = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] && this.deletedStates[sourceLayer][feature][key] === null;
37367 if (deletionInQueue)
37368 delete this.deletedStates[sourceLayer][feature][key];
37369 }
37370 }
37371 }
37372 }
37373 removeFeatureState(sourceLayer, featureId, key) {
37374 const sourceLayerDeleted = this.deletedStates[sourceLayer] === null;
37375 if (sourceLayerDeleted)
37376 return;
37377 const feature = String(featureId);
37378 this.deletedStates[sourceLayer] = this.deletedStates[sourceLayer] || {};
37379 if (key && featureId !== undefined) {
37380 if (this.deletedStates[sourceLayer][feature] !== null) {
37381 this.deletedStates[sourceLayer][feature] = this.deletedStates[sourceLayer][feature] || {};
37382 this.deletedStates[sourceLayer][feature][key] = null;
37383 }
37384 }
37385 else if (featureId !== undefined) {
37386 const updateInQueue = this.stateChanges[sourceLayer] && this.stateChanges[sourceLayer][feature];
37387 if (updateInQueue) {
37388 this.deletedStates[sourceLayer][feature] = {};
37389 for (key in this.stateChanges[sourceLayer][feature])
37390 this.deletedStates[sourceLayer][feature][key] = null;
37391 }
37392 else {
37393 this.deletedStates[sourceLayer][feature] = null;
37394 }
37395 }
37396 else {
37397 this.deletedStates[sourceLayer] = null;
37398 }
37399 }
37400 getState(sourceLayer, featureId) {
37401 const feature = String(featureId);
37402 const base = this.state[sourceLayer] || {};
37403 const changes = this.stateChanges[sourceLayer] || {};
37404 const reconciledState = performance.extend({}, base[feature], changes[feature]);
37405 //return empty object if the whole source layer is awaiting deletion
37406 if (this.deletedStates[sourceLayer] === null)
37407 return {};
37408 else if (this.deletedStates[sourceLayer]) {
37409 const featureDeletions = this.deletedStates[sourceLayer][featureId];
37410 if (featureDeletions === null)
37411 return {};
37412 for (const prop in featureDeletions)
37413 delete reconciledState[prop];
37414 }
37415 return reconciledState;
37416 }
37417 initializeTileState(tile, painter) {
37418 tile.setFeatureState(this.state, painter);
37419 }
37420 coalesceChanges(tiles, painter) {
37421 //track changes with full state objects, but only for features that got modified
37422 const featuresChanged = {};
37423 for (const sourceLayer in this.stateChanges) {
37424 this.state[sourceLayer] = this.state[sourceLayer] || {};
37425 const layerStates = {};
37426 for (const feature in this.stateChanges[sourceLayer]) {
37427 if (!this.state[sourceLayer][feature])
37428 this.state[sourceLayer][feature] = {};
37429 performance.extend(this.state[sourceLayer][feature], this.stateChanges[sourceLayer][feature]);
37430 layerStates[feature] = this.state[sourceLayer][feature];
37431 }
37432 featuresChanged[sourceLayer] = layerStates;
37433 }
37434 for (const sourceLayer in this.deletedStates) {
37435 this.state[sourceLayer] = this.state[sourceLayer] || {};
37436 const layerStates = {};
37437 if (this.deletedStates[sourceLayer] === null) {
37438 for (const ft in this.state[sourceLayer]) {
37439 layerStates[ft] = {};
37440 this.state[sourceLayer][ft] = {};
37441 }
37442 }
37443 else {
37444 for (const feature in this.deletedStates[sourceLayer]) {
37445 const deleteWholeFeatureState = this.deletedStates[sourceLayer][feature] === null;
37446 if (deleteWholeFeatureState)
37447 this.state[sourceLayer][feature] = {};
37448 else {
37449 for (const key of Object.keys(this.deletedStates[sourceLayer][feature])) {
37450 delete this.state[sourceLayer][feature][key];
37451 }
37452 }
37453 layerStates[feature] = this.state[sourceLayer][feature];
37454 }
37455 }
37456 featuresChanged[sourceLayer] = featuresChanged[sourceLayer] || {};
37457 performance.extend(featuresChanged[sourceLayer], layerStates);
37458 }
37459 this.stateChanges = {};
37460 this.deletedStates = {};
37461 if (Object.keys(featuresChanged).length === 0)
37462 return;
37463 for (const id in tiles) {
37464 const tile = tiles[id];
37465 tile.setFeatureState(featuresChanged, painter);
37466 }
37467 }
37468}
37469
37470/**
37471 * `SourceCache` is responsible for
37472 *
37473 * - creating an instance of `Source`
37474 * - forwarding events from `Source`
37475 * - caching tiles loaded from an instance of `Source`
37476 * - loading the tiles needed to render a given viewport
37477 * - unloading the cached tiles not needed to render a given viewport
37478 *
37479 * @private
37480 */
37481class SourceCache extends performance.Evented {
37482 constructor(id, options, dispatcher) {
37483 super();
37484 this.id = id;
37485 this.dispatcher = dispatcher;
37486 this.on('data', (e) => {
37487 // this._sourceLoaded signifies that the TileJSON is loaded if applicable.
37488 // if the source type does not come with a TileJSON, the flag signifies the
37489 // source data has loaded (i.e geojson has been tiled on the worker and is ready)
37490 if (e.dataType === 'source' && e.sourceDataType === 'metadata')
37491 this._sourceLoaded = true;
37492 // for sources with mutable data, this event fires when the underlying data
37493 // to a source is changed. (i.e. GeoJSONSource#setData and ImageSource#serCoordinates)
37494 if (this._sourceLoaded && !this._paused && e.dataType === 'source' && e.sourceDataType === 'content') {
37495 this.reload();
37496 if (this.transform) {
37497 this.update(this.transform);
37498 }
37499 }
37500 });
37501 this.on('dataloading', () => {
37502 this._sourceErrored = false;
37503 });
37504 this.on('error', () => {
37505 // Only set _sourceErrored if the source does not have pending loads.
37506 this._sourceErrored = this._source.loaded();
37507 });
37508 this._source = create(id, options, dispatcher, this);
37509 this._tiles = {};
37510 this._cache = new TileCache(0, this._unloadTile.bind(this));
37511 this._timers = {};
37512 this._cacheTimers = {};
37513 this._maxTileCacheSize = null;
37514 this._loadedParentTiles = {};
37515 this._coveredTiles = {};
37516 this._state = new SourceFeatureState();
37517 }
37518 onAdd(map) {
37519 this.map = map;
37520 this._maxTileCacheSize = map ? map._maxTileCacheSize : null;
37521 if (this._source && this._source.onAdd) {
37522 this._source.onAdd(map);
37523 }
37524 }
37525 onRemove(map) {
37526 this.clearTiles();
37527 if (this._source && this._source.onRemove) {
37528 this._source.onRemove(map);
37529 }
37530 }
37531 /**
37532 * Return true if no tile data is pending, tiles will not change unless
37533 * an additional API call is received.
37534 * @private
37535 */
37536 loaded() {
37537 if (this._sourceErrored) {
37538 return true;
37539 }
37540 if (!this._sourceLoaded) {
37541 return false;
37542 }
37543 if (!this._source.loaded()) {
37544 return false;
37545 }
37546 for (const t in this._tiles) {
37547 const tile = this._tiles[t];
37548 if (tile.state !== 'loaded' && tile.state !== 'errored')
37549 return false;
37550 }
37551 return true;
37552 }
37553 getSource() {
37554 return this._source;
37555 }
37556 pause() {
37557 this._paused = true;
37558 }
37559 resume() {
37560 if (!this._paused)
37561 return;
37562 const shouldReload = this._shouldReloadOnResume;
37563 this._paused = false;
37564 this._shouldReloadOnResume = false;
37565 if (shouldReload)
37566 this.reload();
37567 if (this.transform)
37568 this.update(this.transform);
37569 }
37570 _loadTile(tile, callback) {
37571 return this._source.loadTile(tile, callback);
37572 }
37573 _unloadTile(tile) {
37574 if (this._source.unloadTile)
37575 return this._source.unloadTile(tile, () => { });
37576 }
37577 _abortTile(tile) {
37578 if (this._source.abortTile)
37579 this._source.abortTile(tile, () => { });
37580 this._source.fire(new performance.Event('dataabort', { tile, coord: tile.tileID, dataType: 'source' }));
37581 }
37582 serialize() {
37583 return this._source.serialize();
37584 }
37585 prepare(context) {
37586 if (this._source.prepare) {
37587 this._source.prepare();
37588 }
37589 this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null);
37590 for (const i in this._tiles) {
37591 const tile = this._tiles[i];
37592 tile.upload(context);
37593 tile.prepare(this.map.style.imageManager);
37594 }
37595 }
37596 /**
37597 * Return all tile ids ordered with z-order, and cast to numbers
37598 * @private
37599 */
37600 getIds() {
37601 return Object.values(this._tiles).map((tile) => tile.tileID).sort(compareTileId).map(id => id.key);
37602 }
37603 getRenderableIds(symbolLayer) {
37604 const renderables = [];
37605 for (const id in this._tiles) {
37606 if (this._isIdRenderable(id, symbolLayer))
37607 renderables.push(this._tiles[id]);
37608 }
37609 if (symbolLayer) {
37610 return renderables.sort((a_, b_) => {
37611 const a = a_.tileID;
37612 const b = b_.tileID;
37613 const rotatedA = (new performance.pointGeometry(a.canonical.x, a.canonical.y))._rotate(this.transform.angle);
37614 const rotatedB = (new performance.pointGeometry(b.canonical.x, b.canonical.y))._rotate(this.transform.angle);
37615 return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x;
37616 }).map(tile => tile.tileID.key);
37617 }
37618 return renderables.map(tile => tile.tileID).sort(compareTileId).map(id => id.key);
37619 }
37620 hasRenderableParent(tileID) {
37621 const parentTile = this.findLoadedParent(tileID, 0);
37622 if (parentTile) {
37623 return this._isIdRenderable(parentTile.tileID.key);
37624 }
37625 return false;
37626 }
37627 _isIdRenderable(id, symbolLayer) {
37628 return this._tiles[id] && this._tiles[id].hasData() &&
37629 !this._coveredTiles[id] && (symbolLayer || !this._tiles[id].holdingForFade());
37630 }
37631 reload() {
37632 if (this._paused) {
37633 this._shouldReloadOnResume = true;
37634 return;
37635 }
37636 this._cache.reset();
37637 for (const i in this._tiles) {
37638 if (this._tiles[i].state !== 'errored')
37639 this._reloadTile(i, 'reloading');
37640 }
37641 }
37642 _reloadTile(id, state) {
37643 const tile = this._tiles[id];
37644 // this potentially does not address all underlying
37645 // issues https://github.com/mapbox/mapbox-gl-js/issues/4252
37646 // - hard to tell without repro steps
37647 if (!tile)
37648 return;
37649 // The difference between "loading" tiles and "reloading" or "expired"
37650 // tiles is that "reloading"/"expired" tiles are "renderable".
37651 // Therefore, a "loading" tile cannot become a "reloading" tile without
37652 // first becoming a "loaded" tile.
37653 if (tile.state !== 'loading') {
37654 tile.state = state;
37655 }
37656 this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state));
37657 }
37658 _tileLoaded(tile, id, previousState, err) {
37659 if (err) {
37660 tile.state = 'errored';
37661 if (err.status !== 404)
37662 this._source.fire(new performance.ErrorEvent(err, { tile }));
37663 // continue to try loading parent/children tiles if a tile doesn't exist (404)
37664 else
37665 this.update(this.transform);
37666 return;
37667 }
37668 tile.timeAdded = performance.exported.now();
37669 if (previousState === 'expired')
37670 tile.refreshedUponExpiration = true;
37671 this._setTileReloadTimer(id, tile);
37672 if (this.getSource().type === 'raster-dem' && tile.dem)
37673 this._backfillDEM(tile);
37674 this._state.initializeTileState(tile, this.map ? this.map.painter : null);
37675 if (!tile.aborted) {
37676 this._source.fire(new performance.Event('data', { dataType: 'source', tile, coord: tile.tileID }));
37677 }
37678 }
37679 /**
37680 * For raster terrain source, backfill DEM to eliminate visible tile boundaries
37681 * @private
37682 */
37683 _backfillDEM(tile) {
37684 const renderables = this.getRenderableIds();
37685 for (let i = 0; i < renderables.length; i++) {
37686 const borderId = renderables[i];
37687 if (tile.neighboringTiles && tile.neighboringTiles[borderId]) {
37688 const borderTile = this.getTileByID(borderId);
37689 fillBorder(tile, borderTile);
37690 fillBorder(borderTile, tile);
37691 }
37692 }
37693 function fillBorder(tile, borderTile) {
37694 tile.needsHillshadePrepare = true;
37695 let dx = borderTile.tileID.canonical.x - tile.tileID.canonical.x;
37696 const dy = borderTile.tileID.canonical.y - tile.tileID.canonical.y;
37697 const dim = Math.pow(2, tile.tileID.canonical.z);
37698 const borderId = borderTile.tileID.key;
37699 if (dx === 0 && dy === 0)
37700 return;
37701 if (Math.abs(dy) > 1) {
37702 return;
37703 }
37704 if (Math.abs(dx) > 1) {
37705 // Adjust the delta coordinate for world wraparound.
37706 if (Math.abs(dx + dim) === 1) {
37707 dx += dim;
37708 }
37709 else if (Math.abs(dx - dim) === 1) {
37710 dx -= dim;
37711 }
37712 }
37713 if (!borderTile.dem || !tile.dem)
37714 return;
37715 tile.dem.backfillBorder(borderTile.dem, dx, dy);
37716 if (tile.neighboringTiles && tile.neighboringTiles[borderId])
37717 tile.neighboringTiles[borderId].backfilled = true;
37718 }
37719 }
37720 /**
37721 * Get a specific tile by TileID
37722 * @private
37723 */
37724 getTile(tileID) {
37725 return this.getTileByID(tileID.key);
37726 }
37727 /**
37728 * Get a specific tile by id
37729 * @private
37730 */
37731 getTileByID(id) {
37732 return this._tiles[id];
37733 }
37734 /**
37735 * For a given set of tiles, retain children that are loaded and have a zoom
37736 * between `zoom` (exclusive) and `maxCoveringZoom` (inclusive)
37737 * @private
37738 */
37739 _retainLoadedChildren(idealTiles, zoom, maxCoveringZoom, retain) {
37740 for (const id in this._tiles) {
37741 let tile = this._tiles[id];
37742 // only consider renderable tiles up to maxCoveringZoom
37743 if (retain[id] ||
37744 !tile.hasData() ||
37745 tile.tileID.overscaledZ <= zoom ||
37746 tile.tileID.overscaledZ > maxCoveringZoom)
37747 continue;
37748 // loop through parents and retain the topmost loaded one if found
37749 let topmostLoadedID = tile.tileID;
37750 while (tile && tile.tileID.overscaledZ > zoom + 1) {
37751 const parentID = tile.tileID.scaledTo(tile.tileID.overscaledZ - 1);
37752 tile = this._tiles[parentID.key];
37753 if (tile && tile.hasData()) {
37754 topmostLoadedID = parentID;
37755 }
37756 }
37757 // loop through ancestors of the topmost loaded child to see if there's one that needed it
37758 let tileID = topmostLoadedID;
37759 while (tileID.overscaledZ > zoom) {
37760 tileID = tileID.scaledTo(tileID.overscaledZ - 1);
37761 if (idealTiles[tileID.key]) {
37762 // found a parent that needed a loaded child; retain that child
37763 retain[topmostLoadedID.key] = topmostLoadedID;
37764 break;
37765 }
37766 }
37767 }
37768 }
37769 /**
37770 * Find a loaded parent of the given tile (up to minCoveringZoom)
37771 * @private
37772 */
37773 findLoadedParent(tileID, minCoveringZoom) {
37774 if (tileID.key in this._loadedParentTiles) {
37775 const parent = this._loadedParentTiles[tileID.key];
37776 if (parent && parent.tileID.overscaledZ >= minCoveringZoom) {
37777 return parent;
37778 }
37779 else {
37780 return null;
37781 }
37782 }
37783 for (let z = tileID.overscaledZ - 1; z >= minCoveringZoom; z--) {
37784 const parentTileID = tileID.scaledTo(z);
37785 const tile = this._getLoadedTile(parentTileID);
37786 if (tile) {
37787 return tile;
37788 }
37789 }
37790 }
37791 _getLoadedTile(tileID) {
37792 const tile = this._tiles[tileID.key];
37793 if (tile && tile.hasData()) {
37794 return tile;
37795 }
37796 // TileCache ignores wrap in lookup.
37797 const cachedTile = this._cache.getByKey(tileID.wrapped().key);
37798 return cachedTile;
37799 }
37800 /**
37801 * Resizes the tile cache based on the current viewport's size
37802 * or the maxTileCacheSize option passed during map creation
37803 *
37804 * Larger viewports use more tiles and need larger caches. Larger viewports
37805 * are more likely to be found on devices with more memory and on pages where
37806 * the map is more important.
37807 * @private
37808 */
37809 updateCacheSize(transform) {
37810 const widthInTiles = Math.ceil(transform.width / this._source.tileSize) + 1;
37811 const heightInTiles = Math.ceil(transform.height / this._source.tileSize) + 1;
37812 const approxTilesInView = widthInTiles * heightInTiles;
37813 const commonZoomRange = 5;
37814 const viewDependentMaxSize = Math.floor(approxTilesInView * commonZoomRange);
37815 const maxSize = typeof this._maxTileCacheSize === 'number' ? Math.min(this._maxTileCacheSize, viewDependentMaxSize) : viewDependentMaxSize;
37816 this._cache.setMaxSize(maxSize);
37817 }
37818 handleWrapJump(lng) {
37819 // On top of the regular z/x/y values, TileIDs have a `wrap` value that specify
37820 // which cppy of the world the tile belongs to. For example, at `lng: 10` you
37821 // might render z/x/y/0 while at `lng: 370` you would render z/x/y/1.
37822 //
37823 // When lng values get wrapped (going from `lng: 370` to `long: 10`) you expect
37824 // to see the same thing on the screen (370 degrees and 10 degrees is the same
37825 // place in the world) but all the TileIDs will have different wrap values.
37826 //
37827 // In order to make this transition seamless, we calculate the rounded difference of
37828 // "worlds" between the last frame and the current frame. If the map panned by
37829 // a world, then we can assign all the tiles new TileIDs with updated wrap values.
37830 // For example, assign z/x/y/1 a new id: z/x/y/0. It is the same tile, just rendered
37831 // in a different position.
37832 //
37833 // This enables us to reuse the tiles at more ideal locations and prevent flickering.
37834 const prevLng = this._prevLng === undefined ? lng : this._prevLng;
37835 const lngDifference = lng - prevLng;
37836 const worldDifference = lngDifference / 360;
37837 const wrapDelta = Math.round(worldDifference);
37838 this._prevLng = lng;
37839 if (wrapDelta) {
37840 const tiles = {};
37841 for (const key in this._tiles) {
37842 const tile = this._tiles[key];
37843 tile.tileID = tile.tileID.unwrapTo(tile.tileID.wrap + wrapDelta);
37844 tiles[tile.tileID.key] = tile;
37845 }
37846 this._tiles = tiles;
37847 // Reset tile reload timers
37848 for (const id in this._timers) {
37849 clearTimeout(this._timers[id]);
37850 delete this._timers[id];
37851 }
37852 for (const id in this._tiles) {
37853 const tile = this._tiles[id];
37854 this._setTileReloadTimer(id, tile);
37855 }
37856 }
37857 }
37858 /**
37859 * Removes tiles that are outside the viewport and adds new tiles that
37860 * are inside the viewport.
37861 * @private
37862 */
37863 update(transform) {
37864 this.transform = transform;
37865 if (!this._sourceLoaded || this._paused) {
37866 return;
37867 }
37868 this.updateCacheSize(transform);
37869 this.handleWrapJump(this.transform.center.lng);
37870 // Covered is a list of retained tiles who's areas are fully covered by other,
37871 // better, retained tiles. They are not drawn separately.
37872 this._coveredTiles = {};
37873 let idealTileIDs;
37874 if (!this.used) {
37875 idealTileIDs = [];
37876 }
37877 else if (this._source.tileID) {
37878 idealTileIDs = transform.getVisibleUnwrappedCoordinates(this._source.tileID)
37879 .map((unwrapped) => new performance.OverscaledTileID(unwrapped.canonical.z, unwrapped.wrap, unwrapped.canonical.z, unwrapped.canonical.x, unwrapped.canonical.y));
37880 }
37881 else {
37882 idealTileIDs = transform.coveringTiles({
37883 tileSize: this._source.tileSize,
37884 minzoom: this._source.minzoom,
37885 maxzoom: this._source.maxzoom,
37886 roundZoom: this._source.roundZoom,
37887 reparseOverscaled: this._source.reparseOverscaled
37888 });
37889 if (this._source.hasTile) {
37890 idealTileIDs = idealTileIDs.filter((coord) => this._source.hasTile(coord));
37891 }
37892 }
37893 // Determine the overzooming/underzooming amounts.
37894 const zoom = transform.coveringZoomLevel(this._source);
37895 const minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom);
37896 const maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom);
37897 // Retain is a list of tiles that we shouldn't delete, even if they are not
37898 // the most ideal tile for the current viewport. This may include tiles like
37899 // parent or child tiles that are *already* loaded.
37900 const retain = this._updateRetainedTiles(idealTileIDs, zoom);
37901 if (isRasterType(this._source.type)) {
37902 const parentsForFading = {};
37903 const fadingTiles = {};
37904 const ids = Object.keys(retain);
37905 for (const id of ids) {
37906 const tileID = retain[id];
37907 performance.assert(tileID.key === id);
37908 const tile = this._tiles[id];
37909 if (!tile || tile.fadeEndTime && tile.fadeEndTime <= performance.exported.now())
37910 continue;
37911 // if the tile is loaded but still fading in, find parents to cross-fade with it
37912 const parentTile = this.findLoadedParent(tileID, minCoveringZoom);
37913 if (parentTile) {
37914 this._addTile(parentTile.tileID);
37915 parentsForFading[parentTile.tileID.key] = parentTile.tileID;
37916 }
37917 fadingTiles[id] = tileID;
37918 }
37919 // for tiles that are still fading in, also find children to cross-fade with
37920 this._retainLoadedChildren(fadingTiles, zoom, maxCoveringZoom, retain);
37921 for (const id in parentsForFading) {
37922 if (!retain[id]) {
37923 // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own.
37924 this._coveredTiles[id] = true;
37925 retain[id] = parentsForFading[id];
37926 }
37927 }
37928 }
37929 for (const retainedId in retain) {
37930 // Make sure retained tiles always clear any existing fade holds
37931 // so that if they're removed again their fade timer starts fresh.
37932 this._tiles[retainedId].clearFadeHold();
37933 }
37934 // Remove the tiles we don't need anymore.
37935 const remove = performance.keysDifference(this._tiles, retain);
37936 for (const tileID of remove) {
37937 const tile = this._tiles[tileID];
37938 if (tile.hasSymbolBuckets && !tile.holdingForFade()) {
37939 tile.setHoldDuration(this.map._fadeDuration);
37940 }
37941 else if (!tile.hasSymbolBuckets || tile.symbolFadeFinished()) {
37942 this._removeTile(tileID);
37943 }
37944 }
37945 // Construct a cache of loaded parents
37946 this._updateLoadedParentTileCache();
37947 }
37948 releaseSymbolFadeTiles() {
37949 for (const id in this._tiles) {
37950 if (this._tiles[id].holdingForFade()) {
37951 this._removeTile(id);
37952 }
37953 }
37954 }
37955 _updateRetainedTiles(idealTileIDs, zoom) {
37956 const retain = {};
37957 const checked = {};
37958 const minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom);
37959 const maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom);
37960 const missingTiles = {};
37961 for (const tileID of idealTileIDs) {
37962 const tile = this._addTile(tileID);
37963 // retain the tile even if it's not loaded because it's an ideal tile.
37964 retain[tileID.key] = tileID;
37965 if (tile.hasData())
37966 continue;
37967 if (zoom < this._source.maxzoom) {
37968 // save missing tiles that potentially have loaded children
37969 missingTiles[tileID.key] = tileID;
37970 }
37971 }
37972 // retain any loaded children of ideal tiles up to maxCoveringZoom
37973 this._retainLoadedChildren(missingTiles, zoom, maxCoveringZoom, retain);
37974 for (const tileID of idealTileIDs) {
37975 let tile = this._tiles[tileID.key];
37976 if (tile.hasData())
37977 continue;
37978 // The tile we require is not yet loaded or does not exist;
37979 // Attempt to find children that fully cover it.
37980 if (zoom + 1 > this._source.maxzoom) {
37981 // We're looking for an overzoomed child tile.
37982 const childCoord = tileID.children(this._source.maxzoom)[0];
37983 const childTile = this.getTile(childCoord);
37984 if (!!childTile && childTile.hasData()) {
37985 retain[childCoord.key] = childCoord;
37986 continue; // tile is covered by overzoomed child
37987 }
37988 }
37989 else {
37990 // check if all 4 immediate children are loaded (i.e. the missing ideal tile is covered)
37991 const children = tileID.children(this._source.maxzoom);
37992 if (retain[children[0].key] &&
37993 retain[children[1].key] &&
37994 retain[children[2].key] &&
37995 retain[children[3].key])
37996 continue; // tile is covered by children
37997 }
37998 // We couldn't find child tiles that entirely cover the ideal tile; look for parents now.
37999 // As we ascend up the tile pyramid of the ideal tile, we check whether the parent
38000 // tile has been previously requested (and errored because we only loop over tiles with no data)
38001 // in order to determine if we need to request its parent.
38002 let parentWasRequested = tile.wasRequested();
38003 for (let overscaledZ = tileID.overscaledZ - 1; overscaledZ >= minCoveringZoom; --overscaledZ) {
38004 const parentId = tileID.scaledTo(overscaledZ);
38005 // Break parent tile ascent if this route has been previously checked by another child.
38006 if (checked[parentId.key])
38007 break;
38008 checked[parentId.key] = true;
38009 tile = this.getTile(parentId);
38010 if (!tile && parentWasRequested) {
38011 tile = this._addTile(parentId);
38012 }
38013 if (tile) {
38014 retain[parentId.key] = parentId;
38015 // Save the current values, since they're the parent of the next iteration
38016 // of the parent tile ascent loop.
38017 parentWasRequested = tile.wasRequested();
38018 if (tile.hasData())
38019 break;
38020 }
38021 }
38022 }
38023 return retain;
38024 }
38025 _updateLoadedParentTileCache() {
38026 this._loadedParentTiles = {};
38027 for (const tileKey in this._tiles) {
38028 const path = [];
38029 let parentTile;
38030 let currentId = this._tiles[tileKey].tileID;
38031 // Find the closest loaded ancestor by traversing the tile tree towards the root and
38032 // caching results along the way
38033 while (currentId.overscaledZ > 0) {
38034 // Do we have a cached result from previous traversals?
38035 if (currentId.key in this._loadedParentTiles) {
38036 parentTile = this._loadedParentTiles[currentId.key];
38037 break;
38038 }
38039 path.push(currentId.key);
38040 // Is the parent loaded?
38041 const parentId = currentId.scaledTo(currentId.overscaledZ - 1);
38042 parentTile = this._getLoadedTile(parentId);
38043 if (parentTile) {
38044 break;
38045 }
38046 currentId = parentId;
38047 }
38048 // Cache the result of this traversal to all newly visited tiles
38049 for (const key of path) {
38050 this._loadedParentTiles[key] = parentTile;
38051 }
38052 }
38053 }
38054 /**
38055 * Add a tile, given its coordinate, to the pyramid.
38056 * @private
38057 */
38058 _addTile(tileID) {
38059 let tile = this._tiles[tileID.key];
38060 if (tile)
38061 return tile;
38062 tile = this._cache.getAndRemove(tileID);
38063 if (tile) {
38064 this._setTileReloadTimer(tileID.key, tile);
38065 // set the tileID because the cached tile could have had a different wrap value
38066 tile.tileID = tileID;
38067 this._state.initializeTileState(tile, this.map ? this.map.painter : null);
38068 if (this._cacheTimers[tileID.key]) {
38069 clearTimeout(this._cacheTimers[tileID.key]);
38070 delete this._cacheTimers[tileID.key];
38071 this._setTileReloadTimer(tileID.key, tile);
38072 }
38073 }
38074 const cached = tile;
38075 if (!tile) {
38076 tile = new Tile(tileID, this._source.tileSize * tileID.overscaleFactor());
38077 this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state));
38078 }
38079 tile.uses++;
38080 this._tiles[tileID.key] = tile;
38081 if (!cached) {
38082 this._source.fire(new performance.Event('dataloading', { tile, coord: tile.tileID, dataType: 'source' }));
38083 }
38084 return tile;
38085 }
38086 _setTileReloadTimer(id, tile) {
38087 if (id in this._timers) {
38088 clearTimeout(this._timers[id]);
38089 delete this._timers[id];
38090 }
38091 const expiryTimeout = tile.getExpiryTimeout();
38092 if (expiryTimeout) {
38093 this._timers[id] = setTimeout(() => {
38094 this._reloadTile(id, 'expired');
38095 delete this._timers[id];
38096 }, expiryTimeout);
38097 }
38098 }
38099 /**
38100 * Remove a tile, given its id, from the pyramid
38101 * @private
38102 */
38103 _removeTile(id) {
38104 const tile = this._tiles[id];
38105 if (!tile)
38106 return;
38107 tile.uses--;
38108 delete this._tiles[id];
38109 if (this._timers[id]) {
38110 clearTimeout(this._timers[id]);
38111 delete this._timers[id];
38112 }
38113 if (tile.uses > 0)
38114 return;
38115 if (tile.hasData() && tile.state !== 'reloading') {
38116 this._cache.add(tile.tileID, tile, tile.getExpiryTimeout());
38117 }
38118 else {
38119 tile.aborted = true;
38120 this._abortTile(tile);
38121 this._unloadTile(tile);
38122 }
38123 }
38124 /**
38125 * Remove all tiles from this pyramid
38126 */
38127 clearTiles() {
38128 this._shouldReloadOnResume = false;
38129 this._paused = false;
38130 for (const id in this._tiles)
38131 this._removeTile(id);
38132 this._cache.reset();
38133 }
38134 /**
38135 * Search through our current tiles and attempt to find the tiles that
38136 * cover the given bounds.
38137 * @param pointQueryGeometry coordinates of the corners of bounding rectangle
38138 * @returns {Array<Object>} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile.
38139 * @private
38140 */
38141 tilesIn(pointQueryGeometry, maxPitchScaleFactor, has3DLayer) {
38142 const tileResults = [];
38143 const transform = this.transform;
38144 if (!transform)
38145 return tileResults;
38146 const cameraPointQueryGeometry = has3DLayer ?
38147 transform.getCameraQueryGeometry(pointQueryGeometry) :
38148 pointQueryGeometry;
38149 const queryGeometry = pointQueryGeometry.map((p) => transform.pointCoordinate(p));
38150 const cameraQueryGeometry = cameraPointQueryGeometry.map((p) => transform.pointCoordinate(p));
38151 const ids = this.getIds();
38152 let minX = Infinity;
38153 let minY = Infinity;
38154 let maxX = -Infinity;
38155 let maxY = -Infinity;
38156 for (const p of cameraQueryGeometry) {
38157 minX = Math.min(minX, p.x);
38158 minY = Math.min(minY, p.y);
38159 maxX = Math.max(maxX, p.x);
38160 maxY = Math.max(maxY, p.y);
38161 }
38162 for (let i = 0; i < ids.length; i++) {
38163 const tile = this._tiles[ids[i]];
38164 if (tile.holdingForFade()) {
38165 // Tiles held for fading are covered by tiles that are closer to ideal
38166 continue;
38167 }
38168 const tileID = tile.tileID;
38169 const scale = Math.pow(2, transform.zoom - tile.tileID.overscaledZ);
38170 const queryPadding = maxPitchScaleFactor * tile.queryPadding * performance.EXTENT / tile.tileSize / scale;
38171 const tileSpaceBounds = [
38172 tileID.getTilePoint(new performance.MercatorCoordinate(minX, minY)),
38173 tileID.getTilePoint(new performance.MercatorCoordinate(maxX, maxY))
38174 ];
38175 if (tileSpaceBounds[0].x - queryPadding < performance.EXTENT && tileSpaceBounds[0].y - queryPadding < performance.EXTENT &&
38176 tileSpaceBounds[1].x + queryPadding >= 0 && tileSpaceBounds[1].y + queryPadding >= 0) {
38177 const tileSpaceQueryGeometry = queryGeometry.map((c) => tileID.getTilePoint(c));
38178 const tileSpaceCameraQueryGeometry = cameraQueryGeometry.map((c) => tileID.getTilePoint(c));
38179 tileResults.push({
38180 tile,
38181 tileID,
38182 queryGeometry: tileSpaceQueryGeometry,
38183 cameraQueryGeometry: tileSpaceCameraQueryGeometry,
38184 scale
38185 });
38186 }
38187 }
38188 return tileResults;
38189 }
38190 getVisibleCoordinates(symbolLayer) {
38191 const coords = this.getRenderableIds(symbolLayer).map((id) => this._tiles[id].tileID);
38192 for (const coord of coords) {
38193 coord.posMatrix = this.transform.calculatePosMatrix(coord.toUnwrapped());
38194 }
38195 return coords;
38196 }
38197 hasTransition() {
38198 if (this._source.hasTransition()) {
38199 return true;
38200 }
38201 if (isRasterType(this._source.type)) {
38202 for (const id in this._tiles) {
38203 const tile = this._tiles[id];
38204 if (tile.fadeEndTime !== undefined && tile.fadeEndTime >= performance.exported.now()) {
38205 return true;
38206 }
38207 }
38208 }
38209 return false;
38210 }
38211 /**
38212 * Set the value of a particular state for a feature
38213 * @private
38214 */
38215 setFeatureState(sourceLayer, featureId, state) {
38216 sourceLayer = sourceLayer || '_geojsonTileLayer';
38217 this._state.updateState(sourceLayer, featureId, state);
38218 }
38219 /**
38220 * Resets the value of a particular state key for a feature
38221 * @private
38222 */
38223 removeFeatureState(sourceLayer, featureId, key) {
38224 sourceLayer = sourceLayer || '_geojsonTileLayer';
38225 this._state.removeFeatureState(sourceLayer, featureId, key);
38226 }
38227 /**
38228 * Get the entire state object for a feature
38229 * @private
38230 */
38231 getFeatureState(sourceLayer, featureId) {
38232 sourceLayer = sourceLayer || '_geojsonTileLayer';
38233 return this._state.getState(sourceLayer, featureId);
38234 }
38235 /**
38236 * Sets the set of keys that the tile depends on. This allows tiles to
38237 * be reloaded when their dependencies change.
38238 * @private
38239 */
38240 setDependencies(tileKey, namespace, dependencies) {
38241 const tile = this._tiles[tileKey];
38242 if (tile) {
38243 tile.setDependencies(namespace, dependencies);
38244 }
38245 }
38246 /**
38247 * Reloads all tiles that depend on the given keys.
38248 * @private
38249 */
38250 reloadTilesForDependencies(namespaces, keys) {
38251 for (const id in this._tiles) {
38252 const tile = this._tiles[id];
38253 if (tile.hasDependency(namespaces, keys)) {
38254 this._reloadTile(id, 'reloading');
38255 }
38256 }
38257 this._cache.filter(tile => !tile.hasDependency(namespaces, keys));
38258 }
38259}
38260SourceCache.maxOverzooming = 10;
38261SourceCache.maxUnderzooming = 3;
38262function compareTileId(a, b) {
38263 // Different copies of the world are sorted based on their distance to the center.
38264 // Wrap values are converted to unsigned distances by reserving odd number for copies
38265 // with negative wrap and even numbers for copies with positive wrap.
38266 const aWrap = Math.abs(a.wrap * 2) - +(a.wrap < 0);
38267 const bWrap = Math.abs(b.wrap * 2) - +(b.wrap < 0);
38268 return a.overscaledZ - b.overscaledZ || bWrap - aWrap || b.canonical.y - a.canonical.y || b.canonical.x - a.canonical.x;
38269}
38270function isRasterType(type) {
38271 return type === 'raster' || type === 'image' || type === 'video';
38272}
38273
38274function workerFactory() {
38275 return new Worker(maplibregl.workerUrl);
38276}
38277
38278const PRELOAD_POOL_ID = 'mapboxgl_preloaded_worker_pool';
38279/**
38280 * Constructs a worker pool.
38281 * @private
38282 */
38283class WorkerPool {
38284 constructor() {
38285 this.active = {};
38286 }
38287 acquire(mapId) {
38288 if (!this.workers) {
38289 // Lazily look up the value of mapboxgl.workerCount so that
38290 // client code has had a chance to set it.
38291 this.workers = [];
38292 while (this.workers.length < WorkerPool.workerCount) {
38293 this.workers.push(workerFactory());
38294 }
38295 }
38296 this.active[mapId] = true;
38297 return this.workers.slice();
38298 }
38299 release(mapId) {
38300 delete this.active[mapId];
38301 if (this.numActive() === 0) {
38302 this.workers.forEach((w) => {
38303 w.terminate();
38304 });
38305 this.workers = null;
38306 }
38307 }
38308 isPreloaded() {
38309 return !!this.active[PRELOAD_POOL_ID];
38310 }
38311 numActive() {
38312 return Object.keys(this.active).length;
38313 }
38314}
38315const availableLogicalProcessors = Math.floor(performance.exported.hardwareConcurrency / 2);
38316WorkerPool.workerCount = Math.max(Math.min(availableLogicalProcessors, 6), 1);
38317
38318let globalWorkerPool;
38319/**
38320 * Creates (if necessary) and returns the single, global WorkerPool instance
38321 * to be shared across each Map
38322 * @private
38323 */
38324function getGlobalWorkerPool() {
38325 if (!globalWorkerPool) {
38326 globalWorkerPool = new WorkerPool();
38327 }
38328 return globalWorkerPool;
38329}
38330function prewarm() {
38331 const workerPool = getGlobalWorkerPool();
38332 workerPool.acquire(PRELOAD_POOL_ID);
38333}
38334function clearPrewarmedResources() {
38335 const pool = globalWorkerPool;
38336 if (pool) {
38337 // Remove the pool only if all maps that referenced the preloaded global worker pool have been removed.
38338 if (pool.isPreloaded() && pool.numActive() === 1) {
38339 pool.release(PRELOAD_POOL_ID);
38340 globalWorkerPool = null;
38341 }
38342 else {
38343 console.warn('Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()');
38344 }
38345 }
38346}
38347
38348function deref(layer, parent) {
38349 const result = {};
38350 for (const k in layer) {
38351 if (k !== 'ref') {
38352 result[k] = layer[k];
38353 }
38354 }
38355 performance.refProperties.forEach((k) => {
38356 if (k in parent) {
38357 result[k] = parent[k];
38358 }
38359 });
38360 return result;
38361}
38362/**
38363 * Given an array of layers, some of which may contain `ref` properties
38364 * whose value is the `id` of another property, return a new array where
38365 * such layers have been augmented with the 'type', 'source', etc. properties
38366 * from the parent layer, and the `ref` property has been removed.
38367 *
38368 * The input is not modified. The output may contain references to portions
38369 * of the input.
38370 *
38371 * @private
38372 * @param {Array<Layer>} layers
38373 * @returns {Array<Layer>}
38374 */
38375function derefLayers(layers) {
38376 layers = layers.slice();
38377 const map = Object.create(null);
38378 for (let i = 0; i < layers.length; i++) {
38379 map[layers[i].id] = layers[i];
38380 }
38381 for (let i = 0; i < layers.length; i++) {
38382 if ('ref' in layers[i]) {
38383 layers[i] = deref(layers[i], map[layers[i].ref]);
38384 }
38385 }
38386 return layers;
38387}
38388
38389function emptyStyle() {
38390 const style = {};
38391 const version = performance.spec['$version'];
38392 for (const styleKey in performance.spec['$root']) {
38393 const spec = performance.spec['$root'][styleKey];
38394 if (spec.required) {
38395 let value = null;
38396 if (styleKey === 'version') {
38397 value = version;
38398 }
38399 else {
38400 if (spec.type === 'array') {
38401 value = [];
38402 }
38403 else {
38404 value = {};
38405 }
38406 }
38407 if (value != null) {
38408 style[styleKey] = value;
38409 }
38410 }
38411 }
38412 return style;
38413}
38414
38415const operations = {
38416 /*
38417 * { command: 'setStyle', args: [stylesheet] }
38418 */
38419 setStyle: 'setStyle',
38420 /*
38421 * { command: 'addLayer', args: [layer, 'beforeLayerId'] }
38422 */
38423 addLayer: 'addLayer',
38424 /*
38425 * { command: 'removeLayer', args: ['layerId'] }
38426 */
38427 removeLayer: 'removeLayer',
38428 /*
38429 * { command: 'setPaintProperty', args: ['layerId', 'prop', value] }
38430 */
38431 setPaintProperty: 'setPaintProperty',
38432 /*
38433 * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] }
38434 */
38435 setLayoutProperty: 'setLayoutProperty',
38436 /*
38437 * { command: 'setFilter', args: ['layerId', filter] }
38438 */
38439 setFilter: 'setFilter',
38440 /*
38441 * { command: 'addSource', args: ['sourceId', source] }
38442 */
38443 addSource: 'addSource',
38444 /*
38445 * { command: 'removeSource', args: ['sourceId'] }
38446 */
38447 removeSource: 'removeSource',
38448 /*
38449 * { command: 'setGeoJSONSourceData', args: ['sourceId', data] }
38450 */
38451 setGeoJSONSourceData: 'setGeoJSONSourceData',
38452 /*
38453 * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] }
38454 */
38455 setLayerZoomRange: 'setLayerZoomRange',
38456 /*
38457 * { command: 'setLayerProperty', args: ['layerId', 'prop', value] }
38458 */
38459 setLayerProperty: 'setLayerProperty',
38460 /*
38461 * { command: 'setCenter', args: [[lon, lat]] }
38462 */
38463 setCenter: 'setCenter',
38464 /*
38465 * { command: 'setZoom', args: [zoom] }
38466 */
38467 setZoom: 'setZoom',
38468 /*
38469 * { command: 'setBearing', args: [bearing] }
38470 */
38471 setBearing: 'setBearing',
38472 /*
38473 * { command: 'setPitch', args: [pitch] }
38474 */
38475 setPitch: 'setPitch',
38476 /*
38477 * { command: 'setSprite', args: ['spriteUrl'] }
38478 */
38479 setSprite: 'setSprite',
38480 /*
38481 * { command: 'setGlyphs', args: ['glyphsUrl'] }
38482 */
38483 setGlyphs: 'setGlyphs',
38484 /*
38485 * { command: 'setTransition', args: [transition] }
38486 */
38487 setTransition: 'setTransition',
38488 /*
38489 * { command: 'setLighting', args: [lightProperties] }
38490 */
38491 setLight: 'setLight'
38492};
38493function addSource(sourceId, after, commands) {
38494 commands.push({ command: operations.addSource, args: [sourceId, after[sourceId]] });
38495}
38496function removeSource(sourceId, commands, sourcesRemoved) {
38497 commands.push({ command: operations.removeSource, args: [sourceId] });
38498 sourcesRemoved[sourceId] = true;
38499}
38500function updateSource(sourceId, after, commands, sourcesRemoved) {
38501 removeSource(sourceId, commands, sourcesRemoved);
38502 addSource(sourceId, after, commands);
38503}
38504function canUpdateGeoJSON(before, after, sourceId) {
38505 let prop;
38506 for (prop in before[sourceId]) {
38507 if (!Object.prototype.hasOwnProperty.call(before[sourceId], prop))
38508 continue;
38509 if (prop !== 'data' && !performance.deepEqual(before[sourceId][prop], after[sourceId][prop])) {
38510 return false;
38511 }
38512 }
38513 for (prop in after[sourceId]) {
38514 if (!Object.prototype.hasOwnProperty.call(after[sourceId], prop))
38515 continue;
38516 if (prop !== 'data' && !performance.deepEqual(before[sourceId][prop], after[sourceId][prop])) {
38517 return false;
38518 }
38519 }
38520 return true;
38521}
38522function diffSources(before, after, commands, sourcesRemoved) {
38523 before = before || {};
38524 after = after || {};
38525 let sourceId;
38526 // look for sources to remove
38527 for (sourceId in before) {
38528 if (!Object.prototype.hasOwnProperty.call(before, sourceId))
38529 continue;
38530 if (!Object.prototype.hasOwnProperty.call(after, sourceId)) {
38531 removeSource(sourceId, commands, sourcesRemoved);
38532 }
38533 }
38534 // look for sources to add/update
38535 for (sourceId in after) {
38536 if (!Object.prototype.hasOwnProperty.call(after, sourceId))
38537 continue;
38538 if (!Object.prototype.hasOwnProperty.call(before, sourceId)) {
38539 addSource(sourceId, after, commands);
38540 }
38541 else if (!performance.deepEqual(before[sourceId], after[sourceId])) {
38542 if (before[sourceId].type === 'geojson' && after[sourceId].type === 'geojson' && canUpdateGeoJSON(before, after, sourceId)) {
38543 commands.push({ command: operations.setGeoJSONSourceData, args: [sourceId, after[sourceId].data] });
38544 }
38545 else {
38546 // no update command, must remove then add
38547 updateSource(sourceId, after, commands, sourcesRemoved);
38548 }
38549 }
38550 }
38551}
38552function diffLayerPropertyChanges(before, after, commands, layerId, klass, command) {
38553 before = before || {};
38554 after = after || {};
38555 let prop;
38556 for (prop in before) {
38557 if (!Object.prototype.hasOwnProperty.call(before, prop))
38558 continue;
38559 if (!performance.deepEqual(before[prop], after[prop])) {
38560 commands.push({ command, args: [layerId, prop, after[prop], klass] });
38561 }
38562 }
38563 for (prop in after) {
38564 if (!Object.prototype.hasOwnProperty.call(after, prop) || Object.prototype.hasOwnProperty.call(before, prop))
38565 continue;
38566 if (!performance.deepEqual(before[prop], after[prop])) {
38567 commands.push({ command, args: [layerId, prop, after[prop], klass] });
38568 }
38569 }
38570}
38571function pluckId(layer) {
38572 return layer.id;
38573}
38574function indexById(group, layer) {
38575 group[layer.id] = layer;
38576 return group;
38577}
38578function diffLayers(before, after, commands) {
38579 before = before || [];
38580 after = after || [];
38581 // order of layers by id
38582 const beforeOrder = before.map(pluckId);
38583 const afterOrder = after.map(pluckId);
38584 // index of layer by id
38585 const beforeIndex = before.reduce(indexById, {});
38586 const afterIndex = after.reduce(indexById, {});
38587 // track order of layers as if they have been mutated
38588 const tracker = beforeOrder.slice();
38589 // layers that have been added do not need to be diffed
38590 const clean = Object.create(null);
38591 let i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop;
38592 // remove layers
38593 for (i = 0, d = 0; i < beforeOrder.length; i++) {
38594 layerId = beforeOrder[i];
38595 if (!Object.prototype.hasOwnProperty.call(afterIndex, layerId)) {
38596 commands.push({ command: operations.removeLayer, args: [layerId] });
38597 tracker.splice(tracker.indexOf(layerId, d), 1);
38598 }
38599 else {
38600 // limit where in tracker we need to look for a match
38601 d++;
38602 }
38603 }
38604 // add/reorder layers
38605 for (i = 0, d = 0; i < afterOrder.length; i++) {
38606 // work backwards as insert is before an existing layer
38607 layerId = afterOrder[afterOrder.length - 1 - i];
38608 if (tracker[tracker.length - 1 - i] === layerId)
38609 continue;
38610 if (Object.prototype.hasOwnProperty.call(beforeIndex, layerId)) {
38611 // remove the layer before we insert at the correct position
38612 commands.push({ command: operations.removeLayer, args: [layerId] });
38613 tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1);
38614 }
38615 else {
38616 // limit where in tracker we need to look for a match
38617 d++;
38618 }
38619 // add layer at correct position
38620 insertBeforeLayerId = tracker[tracker.length - i];
38621 commands.push({ command: operations.addLayer, args: [afterIndex[layerId], insertBeforeLayerId] });
38622 tracker.splice(tracker.length - i, 0, layerId);
38623 clean[layerId] = true;
38624 }
38625 // update layers
38626 for (i = 0; i < afterOrder.length; i++) {
38627 layerId = afterOrder[i];
38628 beforeLayer = beforeIndex[layerId];
38629 afterLayer = afterIndex[layerId];
38630 // no need to update if previously added (new or moved)
38631 if (clean[layerId] || performance.deepEqual(beforeLayer, afterLayer))
38632 continue;
38633 // If source, source-layer, or type have changes, then remove the layer
38634 // and add it back 'from scratch'.
38635 if (!performance.deepEqual(beforeLayer.source, afterLayer.source) || !performance.deepEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !performance.deepEqual(beforeLayer.type, afterLayer.type)) {
38636 commands.push({ command: operations.removeLayer, args: [layerId] });
38637 // we add the layer back at the same position it was already in, so
38638 // there's no need to update the `tracker`
38639 insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1];
38640 commands.push({ command: operations.addLayer, args: [afterLayer, insertBeforeLayerId] });
38641 continue;
38642 }
38643 // layout, paint, filter, minzoom, maxzoom
38644 diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty);
38645 diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty);
38646 if (!performance.deepEqual(beforeLayer.filter, afterLayer.filter)) {
38647 commands.push({ command: operations.setFilter, args: [layerId, afterLayer.filter] });
38648 }
38649 if (!performance.deepEqual(beforeLayer.minzoom, afterLayer.minzoom) || !performance.deepEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) {
38650 commands.push({ command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom] });
38651 }
38652 // handle all other layer props, including paint.*
38653 for (prop in beforeLayer) {
38654 if (!Object.prototype.hasOwnProperty.call(beforeLayer, prop))
38655 continue;
38656 if (prop === 'layout' || prop === 'paint' || prop === 'filter' ||
38657 prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom')
38658 continue;
38659 if (prop.indexOf('paint.') === 0) {
38660 diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);
38661 }
38662 else if (!performance.deepEqual(beforeLayer[prop], afterLayer[prop])) {
38663 commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] });
38664 }
38665 }
38666 for (prop in afterLayer) {
38667 if (!Object.prototype.hasOwnProperty.call(afterLayer, prop) || Object.prototype.hasOwnProperty.call(beforeLayer, prop))
38668 continue;
38669 if (prop === 'layout' || prop === 'paint' || prop === 'filter' ||
38670 prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom')
38671 continue;
38672 if (prop.indexOf('paint.') === 0) {
38673 diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);
38674 }
38675 else if (!performance.deepEqual(beforeLayer[prop], afterLayer[prop])) {
38676 commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] });
38677 }
38678 }
38679 }
38680}
38681/**
38682 * Diff two stylesheet
38683 *
38684 * Creates semanticly aware diffs that can easily be applied at runtime.
38685 * Operations produced by the diff closely resemble the maplibre-gl-js API. Any
38686 * error creating the diff will fall back to the 'setStyle' operation.
38687 *
38688 * Example diff:
38689 * [
38690 * { command: 'setConstant', args: ['@water', '#0000FF'] },
38691 * { command: 'setPaintProperty', args: ['background', 'background-color', 'black'] }
38692 * ]
38693 *
38694 * @private
38695 * @param {*} [before] stylesheet to compare from
38696 * @param {*} after stylesheet to compare to
38697 * @returns Array list of changes
38698 */
38699function diffStyles(before, after) {
38700 if (!before)
38701 return [{ command: operations.setStyle, args: [after] }];
38702 let commands = [];
38703 try {
38704 // Handle changes to top-level properties
38705 if (!performance.deepEqual(before.version, after.version)) {
38706 return [{ command: operations.setStyle, args: [after] }];
38707 }
38708 if (!performance.deepEqual(before.center, after.center)) {
38709 commands.push({ command: operations.setCenter, args: [after.center] });
38710 }
38711 if (!performance.deepEqual(before.zoom, after.zoom)) {
38712 commands.push({ command: operations.setZoom, args: [after.zoom] });
38713 }
38714 if (!performance.deepEqual(before.bearing, after.bearing)) {
38715 commands.push({ command: operations.setBearing, args: [after.bearing] });
38716 }
38717 if (!performance.deepEqual(before.pitch, after.pitch)) {
38718 commands.push({ command: operations.setPitch, args: [after.pitch] });
38719 }
38720 if (!performance.deepEqual(before.sprite, after.sprite)) {
38721 commands.push({ command: operations.setSprite, args: [after.sprite] });
38722 }
38723 if (!performance.deepEqual(before.glyphs, after.glyphs)) {
38724 commands.push({ command: operations.setGlyphs, args: [after.glyphs] });
38725 }
38726 if (!performance.deepEqual(before.transition, after.transition)) {
38727 commands.push({ command: operations.setTransition, args: [after.transition] });
38728 }
38729 if (!performance.deepEqual(before.light, after.light)) {
38730 commands.push({ command: operations.setLight, args: [after.light] });
38731 }
38732 // Handle changes to `sources`
38733 // If a source is to be removed, we also--before the removeSource
38734 // command--need to remove all the style layers that depend on it.
38735 const sourcesRemoved = {};
38736 // First collect the {add,remove}Source commands
38737 const removeOrAddSourceCommands = [];
38738 diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved);
38739 // Push a removeLayer command for each style layer that depends on a
38740 // source that's being removed.
38741 // Also, exclude any such layers them from the input to `diffLayers`
38742 // below, so that diffLayers produces the appropriate `addLayers`
38743 // command
38744 const beforeLayers = [];
38745 if (before.layers) {
38746 before.layers.forEach((layer) => {
38747 if (sourcesRemoved[layer.source]) {
38748 commands.push({ command: operations.removeLayer, args: [layer.id] });
38749 }
38750 else {
38751 beforeLayers.push(layer);
38752 }
38753 });
38754 }
38755 commands = commands.concat(removeOrAddSourceCommands);
38756 // Handle changes to `layers`
38757 diffLayers(beforeLayers, after.layers, commands);
38758 }
38759 catch (e) {
38760 // fall back to setStyle
38761 console.warn('Unable to compute style diff:', e);
38762 commands = [{ command: operations.setStyle, args: [after] }];
38763 }
38764 return commands;
38765}
38766
38767class PathInterpolator {
38768 constructor(points_, padding_) {
38769 this.reset(points_, padding_);
38770 }
38771 reset(points_, padding_) {
38772 this.points = points_ || [];
38773 // Compute cumulative distance from first point to every other point in the segment.
38774 // Last entry in the array is total length of the path
38775 this._distances = [0.0];
38776 for (let i = 1; i < this.points.length; i++) {
38777 this._distances[i] = this._distances[i - 1] + this.points[i].dist(this.points[i - 1]);
38778 }
38779 this.length = this._distances[this._distances.length - 1];
38780 this.padding = Math.min(padding_ || 0, this.length * 0.5);
38781 this.paddedLength = this.length - this.padding * 2.0;
38782 }
38783 lerp(t) {
38784 performance.assert(this.points.length > 0);
38785 if (this.points.length === 1) {
38786 return this.points[0];
38787 }
38788 t = performance.clamp(t, 0, 1);
38789 // Find the correct segment [p0, p1] where p0 <= x < p1
38790 let currentIndex = 1;
38791 let distOfCurrentIdx = this._distances[currentIndex];
38792 const distToTarget = t * this.paddedLength + this.padding;
38793 while (distOfCurrentIdx < distToTarget && currentIndex < this._distances.length) {
38794 distOfCurrentIdx = this._distances[++currentIndex];
38795 }
38796 // Interpolate between the two points of the segment
38797 const idxOfPrevPoint = currentIndex - 1;
38798 const distOfPrevIdx = this._distances[idxOfPrevPoint];
38799 const segmentLength = distOfCurrentIdx - distOfPrevIdx;
38800 const segmentT = segmentLength > 0 ? (distToTarget - distOfPrevIdx) / segmentLength : 0;
38801 return this.points[idxOfPrevPoint].mult(1.0 - segmentT).add(this.points[currentIndex].mult(segmentT));
38802 }
38803}
38804
38805function overlapAllowed(overlapA, overlapB) {
38806 let allowed = true;
38807 if (overlapA === 'always') {
38808 // symbol A using 'always' overlap - allowed to overlap anything.
38809 }
38810 else if (overlapA === 'never' || overlapB === 'never') {
38811 // symbol A using 'never' overlap - can't overlap anything
38812 // symbol A using 'cooperative' overlap - can overlap 'always' or 'cooperative' symbol; can't overlap 'never'
38813 allowed = false;
38814 }
38815 return allowed;
38816}
38817/**
38818 * GridIndex is a data structure for testing the intersection of
38819 * circles and rectangles in a 2d plane.
38820 * It is optimized for rapid insertion and querying.
38821 * GridIndex splits the plane into a set of "cells" and keeps track
38822 * of which geometries intersect with each cell. At query time,
38823 * full geometry comparisons are only done for items that share
38824 * at least one cell. As long as the geometries are relatively
38825 * uniformly distributed across the plane, this greatly reduces
38826 * the number of comparisons necessary.
38827 *
38828 * @private
38829 */
38830class GridIndex {
38831 constructor(width, height, cellSize) {
38832 const boxCells = this.boxCells = [];
38833 const circleCells = this.circleCells = [];
38834 // More cells -> fewer geometries to check per cell, but items tend
38835 // to be split across more cells.
38836 // Sweet spot allows most small items to fit in one cell
38837 this.xCellCount = Math.ceil(width / cellSize);
38838 this.yCellCount = Math.ceil(height / cellSize);
38839 for (let i = 0; i < this.xCellCount * this.yCellCount; i++) {
38840 boxCells.push([]);
38841 circleCells.push([]);
38842 }
38843 this.circleKeys = [];
38844 this.boxKeys = [];
38845 this.bboxes = [];
38846 this.circles = [];
38847 this.width = width;
38848 this.height = height;
38849 this.xScale = this.xCellCount / width;
38850 this.yScale = this.yCellCount / height;
38851 this.boxUid = 0;
38852 this.circleUid = 0;
38853 }
38854 keysLength() {
38855 return this.boxKeys.length + this.circleKeys.length;
38856 }
38857 insert(key, x1, y1, x2, y2) {
38858 this._forEachCell(x1, y1, x2, y2, this._insertBoxCell, this.boxUid++);
38859 this.boxKeys.push(key);
38860 this.bboxes.push(x1);
38861 this.bboxes.push(y1);
38862 this.bboxes.push(x2);
38863 this.bboxes.push(y2);
38864 }
38865 insertCircle(key, x, y, radius) {
38866 // Insert circle into grid for all cells in the circumscribing square
38867 // It's more than necessary (by a factor of 4/PI), but fast to insert
38868 this._forEachCell(x - radius, y - radius, x + radius, y + radius, this._insertCircleCell, this.circleUid++);
38869 this.circleKeys.push(key);
38870 this.circles.push(x);
38871 this.circles.push(y);
38872 this.circles.push(radius);
38873 }
38874 _insertBoxCell(x1, y1, x2, y2, cellIndex, uid) {
38875 this.boxCells[cellIndex].push(uid);
38876 }
38877 _insertCircleCell(x1, y1, x2, y2, cellIndex, uid) {
38878 this.circleCells[cellIndex].push(uid);
38879 }
38880 _query(x1, y1, x2, y2, hitTest, overlapMode, predicate) {
38881 if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) {
38882 return [];
38883 }
38884 const result = [];
38885 if (x1 <= 0 && y1 <= 0 && this.width <= x2 && this.height <= y2) {
38886 if (hitTest) {
38887 // Covers the entire grid, so collides with everything
38888 return [{
38889 key: null,
38890 x1,
38891 y1,
38892 x2,
38893 y2
38894 }];
38895 }
38896 for (let boxUid = 0; boxUid < this.boxKeys.length; boxUid++) {
38897 result.push({
38898 key: this.boxKeys[boxUid],
38899 x1: this.bboxes[boxUid * 4],
38900 y1: this.bboxes[boxUid * 4 + 1],
38901 x2: this.bboxes[boxUid * 4 + 2],
38902 y2: this.bboxes[boxUid * 4 + 3]
38903 });
38904 }
38905 for (let circleUid = 0; circleUid < this.circleKeys.length; circleUid++) {
38906 const x = this.circles[circleUid * 3];
38907 const y = this.circles[circleUid * 3 + 1];
38908 const radius = this.circles[circleUid * 3 + 2];
38909 result.push({
38910 key: this.circleKeys[circleUid],
38911 x1: x - radius,
38912 y1: y - radius,
38913 x2: x + radius,
38914 y2: y + radius
38915 });
38916 }
38917 }
38918 else {
38919 const queryArgs = {
38920 hitTest,
38921 overlapMode,
38922 seenUids: { box: {}, circle: {} }
38923 };
38924 this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate);
38925 }
38926 return result;
38927 }
38928 query(x1, y1, x2, y2) {
38929 return this._query(x1, y1, x2, y2, false, null);
38930 }
38931 hitTest(x1, y1, x2, y2, overlapMode, predicate) {
38932 return this._query(x1, y1, x2, y2, true, overlapMode, predicate).length > 0;
38933 }
38934 hitTestCircle(x, y, radius, overlapMode, predicate) {
38935 // Insert circle into grid for all cells in the circumscribing square
38936 // It's more than necessary (by a factor of 4/PI), but fast to insert
38937 const x1 = x - radius;
38938 const x2 = x + radius;
38939 const y1 = y - radius;
38940 const y2 = y + radius;
38941 if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) {
38942 return false;
38943 }
38944 // Box query early exits if the bounding box is larger than the grid, but we don't do
38945 // the equivalent calculation for circle queries because early exit is less likely
38946 // and the calculation is more expensive
38947 const result = [];
38948 const queryArgs = {
38949 hitTest: true,
38950 overlapMode,
38951 circle: { x, y, radius },
38952 seenUids: { box: {}, circle: {} }
38953 };
38954 this._forEachCell(x1, y1, x2, y2, this._queryCellCircle, result, queryArgs, predicate);
38955 return result.length > 0;
38956 }
38957 _queryCell(x1, y1, x2, y2, cellIndex, result, queryArgs, predicate) {
38958 const { seenUids, hitTest, overlapMode } = queryArgs;
38959 const boxCell = this.boxCells[cellIndex];
38960 if (boxCell !== null) {
38961 const bboxes = this.bboxes;
38962 for (const boxUid of boxCell) {
38963 if (!seenUids.box[boxUid]) {
38964 seenUids.box[boxUid] = true;
38965 const offset = boxUid * 4;
38966 const key = this.boxKeys[boxUid];
38967 if ((x1 <= bboxes[offset + 2]) &&
38968 (y1 <= bboxes[offset + 3]) &&
38969 (x2 >= bboxes[offset + 0]) &&
38970 (y2 >= bboxes[offset + 1]) &&
38971 (!predicate || predicate(key))) {
38972 if (!hitTest || !overlapAllowed(overlapMode, key.overlapMode)) {
38973 result.push({
38974 key,
38975 x1: bboxes[offset],
38976 y1: bboxes[offset + 1],
38977 x2: bboxes[offset + 2],
38978 y2: bboxes[offset + 3]
38979 });
38980 if (hitTest) {
38981 // true return value stops the query after first match
38982 return true;
38983 }
38984 }
38985 }
38986 }
38987 }
38988 }
38989 const circleCell = this.circleCells[cellIndex];
38990 if (circleCell !== null) {
38991 const circles = this.circles;
38992 for (const circleUid of circleCell) {
38993 if (!seenUids.circle[circleUid]) {
38994 seenUids.circle[circleUid] = true;
38995 const offset = circleUid * 3;
38996 const key = this.circleKeys[circleUid];
38997 if (this._circleAndRectCollide(circles[offset], circles[offset + 1], circles[offset + 2], x1, y1, x2, y2) &&
38998 (!predicate || predicate(key))) {
38999 if (!hitTest || !overlapAllowed(overlapMode, key.overlapMode)) {
39000 const x = circles[offset];
39001 const y = circles[offset + 1];
39002 const radius = circles[offset + 2];
39003 result.push({
39004 key,
39005 x1: x - radius,
39006 y1: y - radius,
39007 x2: x + radius,
39008 y2: y + radius
39009 });
39010 if (hitTest) {
39011 // true return value stops the query after first match
39012 return true;
39013 }
39014 }
39015 }
39016 }
39017 }
39018 }
39019 // false return to continue query
39020 return false;
39021 }
39022 _queryCellCircle(x1, y1, x2, y2, cellIndex, result, queryArgs, predicate) {
39023 const { circle, seenUids, overlapMode } = queryArgs;
39024 const boxCell = this.boxCells[cellIndex];
39025 if (boxCell !== null) {
39026 const bboxes = this.bboxes;
39027 for (const boxUid of boxCell) {
39028 if (!seenUids.box[boxUid]) {
39029 seenUids.box[boxUid] = true;
39030 const offset = boxUid * 4;
39031 const key = this.boxKeys[boxUid];
39032 if (this._circleAndRectCollide(circle.x, circle.y, circle.radius, bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) &&
39033 (!predicate || predicate(key)) &&
39034 !overlapAllowed(overlapMode, key.overlapMode)) {
39035 result.push(true);
39036 return true;
39037 }
39038 }
39039 }
39040 }
39041 const circleCell = this.circleCells[cellIndex];
39042 if (circleCell !== null) {
39043 const circles = this.circles;
39044 for (const circleUid of circleCell) {
39045 if (!seenUids.circle[circleUid]) {
39046 seenUids.circle[circleUid] = true;
39047 const offset = circleUid * 3;
39048 const key = this.circleKeys[circleUid];
39049 if (this._circlesCollide(circles[offset], circles[offset + 1], circles[offset + 2], circle.x, circle.y, circle.radius) &&
39050 (!predicate || predicate(key)) &&
39051 !overlapAllowed(overlapMode, key.overlapMode)) {
39052 result.push(true);
39053 return true;
39054 }
39055 }
39056 }
39057 }
39058 }
39059 _forEachCell(x1, y1, x2, y2, fn, arg1, arg2, predicate) {
39060 const cx1 = this._convertToXCellCoord(x1);
39061 const cy1 = this._convertToYCellCoord(y1);
39062 const cx2 = this._convertToXCellCoord(x2);
39063 const cy2 = this._convertToYCellCoord(y2);
39064 for (let x = cx1; x <= cx2; x++) {
39065 for (let y = cy1; y <= cy2; y++) {
39066 const cellIndex = this.xCellCount * y + x;
39067 if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, predicate))
39068 return;
39069 }
39070 }
39071 }
39072 _convertToXCellCoord(x) {
39073 return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(x * this.xScale)));
39074 }
39075 _convertToYCellCoord(y) {
39076 return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(y * this.yScale)));
39077 }
39078 _circlesCollide(x1, y1, r1, x2, y2, r2) {
39079 const dx = x2 - x1;
39080 const dy = y2 - y1;
39081 const bothRadii = r1 + r2;
39082 return (bothRadii * bothRadii) > (dx * dx + dy * dy);
39083 }
39084 _circleAndRectCollide(circleX, circleY, radius, x1, y1, x2, y2) {
39085 const halfRectWidth = (x2 - x1) / 2;
39086 const distX = Math.abs(circleX - (x1 + halfRectWidth));
39087 if (distX > (halfRectWidth + radius)) {
39088 return false;
39089 }
39090 const halfRectHeight = (y2 - y1) / 2;
39091 const distY = Math.abs(circleY - (y1 + halfRectHeight));
39092 if (distY > (halfRectHeight + radius)) {
39093 return false;
39094 }
39095 if (distX <= halfRectWidth || distY <= halfRectHeight) {
39096 return true;
39097 }
39098 const dx = distX - halfRectWidth;
39099 const dy = distY - halfRectHeight;
39100 return (dx * dx + dy * dy <= (radius * radius));
39101 }
39102}
39103
39104/*
39105 * # Overview of coordinate spaces
39106 *
39107 * ## Tile coordinate spaces
39108 * Each label has an anchor. Some labels have corresponding line geometries.
39109 * The points for both anchors and lines are stored in tile units. Each tile has it's own
39110 * coordinate space going from (0, 0) at the top left to (EXTENT, EXTENT) at the bottom right.
39111 *
39112 * ## GL coordinate space
39113 * At the end of everything, the vertex shader needs to produce a position in GL coordinate space,
39114 * which is (-1, 1) at the top left and (1, -1) in the bottom right.
39115 *
39116 * ## Map pixel coordinate spaces
39117 * Each tile has a pixel coordinate space. It's just the tile units scaled so that one unit is
39118 * whatever counts as 1 pixel at the current zoom.
39119 * This space is used for pitch-alignment=map, rotation-alignment=map
39120 *
39121 * ## Rotated map pixel coordinate spaces
39122 * Like the above, but rotated so axis of the space are aligned with the viewport instead of the tile.
39123 * This space is used for pitch-alignment=map, rotation-alignment=viewport
39124 *
39125 * ## Viewport pixel coordinate space
39126 * (0, 0) is at the top left of the canvas and (pixelWidth, pixelHeight) is at the bottom right corner
39127 * of the canvas. This space is used for pitch-alignment=viewport
39128 *
39129 *
39130 * # Vertex projection
39131 * It goes roughly like this:
39132 * 1. project the anchor and line from tile units into the correct label coordinate space
39133 * - map pixel space pitch-alignment=map rotation-alignment=map
39134 * - rotated map pixel space pitch-alignment=map rotation-alignment=viewport
39135 * - viewport pixel space pitch-alignment=viewport rotation-alignment=*
39136 * 2. if the label follows a line, find the point along the line that is the correct distance from the anchor.
39137 * 3. add the glyph's corner offset to the point from step 3
39138 * 4. convert from the label coordinate space to gl coordinates
39139 *
39140 * For horizontal labels we want to do step 1 in the shader for performance reasons (no cpu work).
39141 * This is what `u_label_plane_matrix` is used for.
39142 * For labels aligned with lines we have to steps 1 and 2 on the cpu since we need access to the line geometry.
39143 * This is what `updateLineLabels(...)` does.
39144 * Since the conversion is handled on the cpu we just set `u_label_plane_matrix` to an identity matrix.
39145 *
39146 * Steps 3 and 4 are done in the shaders for all labels.
39147 */
39148/*
39149 * Returns a matrix for converting from tile units to the correct label coordinate space.
39150 */
39151function getLabelPlaneMatrix(posMatrix, pitchWithMap, rotateWithMap, transform, pixelsToTileUnits) {
39152 const m = performance.create();
39153 if (pitchWithMap) {
39154 performance.scale(m, m, [1 / pixelsToTileUnits, 1 / pixelsToTileUnits, 1]);
39155 if (!rotateWithMap) {
39156 performance.rotateZ(m, m, transform.angle);
39157 }
39158 }
39159 else {
39160 performance.multiply(m, transform.labelPlaneMatrix, posMatrix);
39161 }
39162 return m;
39163}
39164/*
39165 * Returns a matrix for converting from the correct label coordinate space to gl coords.
39166 */
39167function getGlCoordMatrix(posMatrix, pitchWithMap, rotateWithMap, transform, pixelsToTileUnits) {
39168 if (pitchWithMap) {
39169 const m = performance.clone(posMatrix);
39170 performance.scale(m, m, [pixelsToTileUnits, pixelsToTileUnits, 1]);
39171 if (!rotateWithMap) {
39172 performance.rotateZ(m, m, -transform.angle);
39173 }
39174 return m;
39175 }
39176 else {
39177 return transform.glCoordMatrix;
39178 }
39179}
39180function project(point, matrix) {
39181 const pos = [point.x, point.y, 0, 1];
39182 xyTransformMat4(pos, pos, matrix);
39183 const w = pos[3];
39184 return {
39185 point: new performance.pointGeometry(pos[0] / w, pos[1] / w),
39186 signedDistanceFromCamera: w
39187 };
39188}
39189function getPerspectiveRatio(cameraToCenterDistance, signedDistanceFromCamera) {
39190 return 0.5 + 0.5 * (cameraToCenterDistance / signedDistanceFromCamera);
39191}
39192function isVisible(anchorPos, clippingBuffer) {
39193 const x = anchorPos[0] / anchorPos[3];
39194 const y = anchorPos[1] / anchorPos[3];
39195 const inPaddedViewport = (x >= -clippingBuffer[0] &&
39196 x <= clippingBuffer[0] &&
39197 y >= -clippingBuffer[1] &&
39198 y <= clippingBuffer[1]);
39199 return inPaddedViewport;
39200}
39201/*
39202 * Update the `dynamicLayoutVertexBuffer` for the buffer with the correct glyph positions for the current map view.
39203 * This is only run on labels that are aligned with lines. Horizontal labels are handled entirely in the shader.
39204 */
39205function updateLineLabels(bucket, posMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright, rotateToLine) {
39206 const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData;
39207 const partiallyEvaluatedSize = performance.evaluateSizeForZoom(sizeData, painter.transform.zoom);
39208 const clippingBuffer = [256 / painter.width * 2 + 1, 256 / painter.height * 2 + 1];
39209 const dynamicLayoutVertexArray = isText ?
39210 bucket.text.dynamicLayoutVertexArray :
39211 bucket.icon.dynamicLayoutVertexArray;
39212 dynamicLayoutVertexArray.clear();
39213 const lineVertexArray = bucket.lineVertexArray;
39214 const placedSymbols = isText ? bucket.text.placedSymbolArray : bucket.icon.placedSymbolArray;
39215 const aspectRatio = painter.transform.width / painter.transform.height;
39216 let useVertical = false;
39217 for (let s = 0; s < placedSymbols.length; s++) {
39218 const symbol = placedSymbols.get(s);
39219 // Don't do calculations for vertical glyphs unless the previous symbol was horizontal
39220 // and we determined that vertical glyphs were necessary.
39221 // Also don't do calculations for symbols that are collided and fully faded out
39222 if (symbol.hidden || symbol.writingMode === performance.WritingMode.vertical && !useVertical) {
39223 hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray);
39224 continue;
39225 }
39226 // Awkward... but we're counting on the paired "vertical" symbol coming immediately after its horizontal counterpart
39227 useVertical = false;
39228 const anchorPos = [symbol.anchorX, symbol.anchorY, 0, 1];
39229 performance.transformMat4(anchorPos, anchorPos, posMatrix);
39230 // Don't bother calculating the correct point for invisible labels.
39231 if (!isVisible(anchorPos, clippingBuffer)) {
39232 hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray);
39233 continue;
39234 }
39235 const cameraToAnchorDistance = anchorPos[3];
39236 const perspectiveRatio = getPerspectiveRatio(painter.transform.cameraToCenterDistance, cameraToAnchorDistance);
39237 const fontSize = performance.evaluateSizeForFeature(sizeData, partiallyEvaluatedSize, symbol);
39238 const pitchScaledFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio;
39239 const tileAnchorPoint = new performance.pointGeometry(symbol.anchorX, symbol.anchorY);
39240 const anchorPoint = project(tileAnchorPoint, labelPlaneMatrix).point;
39241 const projectionCache = {};
39242 const placeUnflipped = placeGlyphsAlongLine(symbol, pitchScaledFontSize, false /*unflipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, rotateToLine);
39243 useVertical = placeUnflipped.useVertical;
39244 if (placeUnflipped.notEnoughRoom || useVertical ||
39245 (placeUnflipped.needsFlipping &&
39246 placeGlyphsAlongLine(symbol, pitchScaledFontSize, true /*flipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, rotateToLine).notEnoughRoom)) {
39247 hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray);
39248 }
39249 }
39250 if (isText) {
39251 bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray);
39252 }
39253 else {
39254 bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray);
39255 }
39256}
39257function placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine) {
39258 const glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs;
39259 const lineStartIndex = symbol.lineStartIndex;
39260 const lineEndIndex = symbol.lineStartIndex + symbol.lineLength;
39261 const firstGlyphOffset = glyphOffsetArray.getoffsetX(symbol.glyphStartIndex);
39262 const lastGlyphOffset = glyphOffsetArray.getoffsetX(glyphEndIndex - 1);
39263 const firstPlacedGlyph = placeGlyphAlongLine(fontScale * firstGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine);
39264 if (!firstPlacedGlyph)
39265 return null;
39266 const lastPlacedGlyph = placeGlyphAlongLine(fontScale * lastGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine);
39267 if (!lastPlacedGlyph)
39268 return null;
39269 return { first: firstPlacedGlyph, last: lastPlacedGlyph };
39270}
39271function requiresOrientationChange(writingMode, firstPoint, lastPoint, aspectRatio) {
39272 if (writingMode === performance.WritingMode.horizontal) {
39273 // On top of choosing whether to flip, choose whether to render this version of the glyphs or the alternate
39274 // vertical glyphs. We can't just filter out vertical glyphs in the horizontal range because the horizontal
39275 // and vertical versions can have slightly different projections which could lead to angles where both or
39276 // neither showed.
39277 const rise = Math.abs(lastPoint.y - firstPoint.y);
39278 const run = Math.abs(lastPoint.x - firstPoint.x) * aspectRatio;
39279 if (rise > run) {
39280 return { useVertical: true };
39281 }
39282 }
39283 if (writingMode === performance.WritingMode.vertical ? firstPoint.y < lastPoint.y : firstPoint.x > lastPoint.x) {
39284 // Includes "horizontalOnly" case for labels without vertical glyphs
39285 return { needsFlipping: true };
39286 }
39287 return null;
39288}
39289function placeGlyphsAlongLine(symbol, fontSize, flip, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, rotateToLine) {
39290 const fontScale = fontSize / 24;
39291 const lineOffsetX = symbol.lineOffsetX * fontScale;
39292 const lineOffsetY = symbol.lineOffsetY * fontScale;
39293 let placedGlyphs;
39294 if (symbol.numGlyphs > 1) {
39295 const glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs;
39296 const lineStartIndex = symbol.lineStartIndex;
39297 const lineEndIndex = symbol.lineStartIndex + symbol.lineLength;
39298 // Place the first and the last glyph in the label first, so we can figure out
39299 // the overall orientation of the label and determine whether it needs to be flipped in keepUpright mode
39300 const firstAndLastGlyph = placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine);
39301 if (!firstAndLastGlyph) {
39302 return { notEnoughRoom: true };
39303 }
39304 const firstPoint = project(firstAndLastGlyph.first.point, glCoordMatrix).point;
39305 const lastPoint = project(firstAndLastGlyph.last.point, glCoordMatrix).point;
39306 if (keepUpright && !flip) {
39307 const orientationChange = requiresOrientationChange(symbol.writingMode, firstPoint, lastPoint, aspectRatio);
39308 if (orientationChange) {
39309 return orientationChange;
39310 }
39311 }
39312 placedGlyphs = [firstAndLastGlyph.first];
39313 for (let glyphIndex = symbol.glyphStartIndex + 1; glyphIndex < glyphEndIndex - 1; glyphIndex++) {
39314 // Since first and last glyph fit on the line, we're sure that the rest of the glyphs can be placed
39315 // $FlowFixMe
39316 placedGlyphs.push(placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(glyphIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine));
39317 }
39318 placedGlyphs.push(firstAndLastGlyph.last);
39319 }
39320 else {
39321 // Only a single glyph to place
39322 // So, determine whether to flip based on projected angle of the line segment it's on
39323 if (keepUpright && !flip) {
39324 const a = project(tileAnchorPoint, posMatrix).point;
39325 const tileVertexIndex = (symbol.lineStartIndex + symbol.segment + 1);
39326 // $FlowFixMe
39327 const tileSegmentEnd = new performance.pointGeometry(lineVertexArray.getx(tileVertexIndex), lineVertexArray.gety(tileVertexIndex));
39328 const projectedVertex = project(tileSegmentEnd, posMatrix);
39329 // We know the anchor will be in the viewport, but the end of the line segment may be
39330 // behind the plane of the camera, in which case we can use a point at any arbitrary (closer)
39331 // point on the segment.
39332 const b = (projectedVertex.signedDistanceFromCamera > 0) ?
39333 projectedVertex.point :
39334 projectTruncatedLineSegment(tileAnchorPoint, tileSegmentEnd, a, 1, posMatrix);
39335 const orientationChange = requiresOrientationChange(symbol.writingMode, a, b, aspectRatio);
39336 if (orientationChange) {
39337 return orientationChange;
39338 }
39339 }
39340 // $FlowFixMe
39341 const singleGlyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(symbol.glyphStartIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, symbol.lineStartIndex, symbol.lineStartIndex + symbol.lineLength, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine);
39342 if (!singleGlyph)
39343 return { notEnoughRoom: true };
39344 placedGlyphs = [singleGlyph];
39345 }
39346 for (const glyph of placedGlyphs) {
39347 performance.addDynamicAttributes(dynamicLayoutVertexArray, glyph.point, glyph.angle);
39348 }
39349 return {};
39350}
39351function projectTruncatedLineSegment(previousTilePoint, currentTilePoint, previousProjectedPoint, minimumLength, projectionMatrix) {
39352 // We are assuming "previousTilePoint" won't project to a point within one unit of the camera plane
39353 // If it did, that would mean our label extended all the way out from within the viewport to a (very distant)
39354 // point near the plane of the camera. We wouldn't be able to render the label anyway once it crossed the
39355 // plane of the camera.
39356 const projectedUnitVertex = project(previousTilePoint.add(previousTilePoint.sub(currentTilePoint)._unit()), projectionMatrix).point;
39357 const projectedUnitSegment = previousProjectedPoint.sub(projectedUnitVertex);
39358 return previousProjectedPoint.add(projectedUnitSegment._mult(minimumLength / projectedUnitSegment.mag()));
39359}
39360function placeGlyphAlongLine(offsetX, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, anchorSegment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine) {
39361 const combinedOffsetX = flip ?
39362 offsetX - lineOffsetX :
39363 offsetX + lineOffsetX;
39364 let dir = combinedOffsetX > 0 ? 1 : -1;
39365 let angle = 0;
39366 if (flip) {
39367 // The label needs to be flipped to keep text upright.
39368 // Iterate in the reverse direction.
39369 dir *= -1;
39370 angle = Math.PI;
39371 }
39372 if (dir < 0)
39373 angle += Math.PI;
39374 let currentIndex = dir > 0 ?
39375 lineStartIndex + anchorSegment :
39376 lineStartIndex + anchorSegment + 1;
39377 let current = anchorPoint;
39378 let prev = anchorPoint;
39379 let distanceToPrev = 0;
39380 let currentSegmentDistance = 0;
39381 const absOffsetX = Math.abs(combinedOffsetX);
39382 const pathVertices = [];
39383 while (distanceToPrev + currentSegmentDistance <= absOffsetX) {
39384 currentIndex += dir;
39385 // offset does not fit on the projected line
39386 if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex)
39387 return null;
39388 prev = current;
39389 pathVertices.push(current);
39390 current = projectionCache[currentIndex];
39391 if (current === undefined) {
39392 const currentVertex = new performance.pointGeometry(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex));
39393 const projection = project(currentVertex, labelPlaneMatrix);
39394 if (projection.signedDistanceFromCamera > 0) {
39395 current = projectionCache[currentIndex] = projection.point;
39396 }
39397 else {
39398 // The vertex is behind the plane of the camera, so we can't project it
39399 // Instead, we'll create a vertex along the line that's far enough to include the glyph
39400 const previousLineVertexIndex = currentIndex - dir;
39401 const previousTilePoint = distanceToPrev === 0 ?
39402 tileAnchorPoint :
39403 new performance.pointGeometry(lineVertexArray.getx(previousLineVertexIndex), lineVertexArray.gety(previousLineVertexIndex));
39404 // Don't cache because the new vertex might not be far enough out for future glyphs on the same segment
39405 current = projectTruncatedLineSegment(previousTilePoint, currentVertex, prev, absOffsetX - distanceToPrev + 1, labelPlaneMatrix);
39406 }
39407 }
39408 distanceToPrev += currentSegmentDistance;
39409 currentSegmentDistance = prev.dist(current);
39410 }
39411 // The point is on the current segment. Interpolate to find it.
39412 const segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance;
39413 const prevToCurrent = current.sub(prev);
39414 const p = prevToCurrent.mult(segmentInterpolationT)._add(prev);
39415 // offset the point from the line to text-offset and icon-offset
39416 p._add(prevToCurrent._unit()._perp()._mult(lineOffsetY * dir));
39417 const segmentAngle = angle + Math.atan2(current.y - prev.y, current.x - prev.x);
39418 pathVertices.push(p);
39419 return {
39420 point: p,
39421 angle: rotateToLine ? segmentAngle : 0.0,
39422 path: pathVertices
39423 };
39424}
39425const hiddenGlyphAttributes = new Float32Array([-Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0]);
39426// Hide them by moving them offscreen. We still need to add them to the buffer
39427// because the dynamic buffer is paired with a static buffer that doesn't get updated.
39428function hideGlyphs(num, dynamicLayoutVertexArray) {
39429 for (let i = 0; i < num; i++) {
39430 const offset = dynamicLayoutVertexArray.length;
39431 dynamicLayoutVertexArray.resize(offset + 4);
39432 // Since all hidden glyphs have the same attributes, we can build up the array faster with a single call to Float32Array.set
39433 // for each set of four vertices, instead of calling addDynamicAttributes for each vertex.
39434 dynamicLayoutVertexArray.float32.set(hiddenGlyphAttributes, offset * 3);
39435 }
39436}
39437// For line label layout, we're not using z output and our w input is always 1
39438// This custom matrix transformation ignores those components to make projection faster
39439function xyTransformMat4(out, a, m) {
39440 const x = a[0], y = a[1];
39441 out[0] = m[0] * x + m[4] * y + m[12];
39442 out[1] = m[1] * x + m[5] * y + m[13];
39443 out[3] = m[3] * x + m[7] * y + m[15];
39444 return out;
39445}
39446
39447// When a symbol crosses the edge that causes it to be included in
39448// collision detection, it will cause changes in the symbols around
39449// it. This constant specifies how many pixels to pad the edge of
39450// the viewport for collision detection so that the bulk of the changes
39451// occur offscreen. Making this constant greater increases label
39452// stability, but it's expensive.
39453const viewportPadding = 100;
39454/**
39455 * A collision index used to prevent symbols from overlapping. It keep tracks of
39456 * where previous symbols have been placed and is used to check if a new
39457 * symbol overlaps with any previously added symbols.
39458 *
39459 * There are two steps to insertion: first placeCollisionBox/Circles checks if
39460 * there's room for a symbol, then insertCollisionBox/Circles actually puts the
39461 * symbol in the index. The two step process allows paired symbols to be inserted
39462 * together even if they overlap.
39463 *
39464 * @private
39465 */
39466class CollisionIndex {
39467 constructor(transform, grid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25), ignoredGrid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25)) {
39468 this.transform = transform;
39469 this.grid = grid;
39470 this.ignoredGrid = ignoredGrid;
39471 this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance;
39472 this.screenRightBoundary = transform.width + viewportPadding;
39473 this.screenBottomBoundary = transform.height + viewportPadding;
39474 this.gridRightBoundary = transform.width + 2 * viewportPadding;
39475 this.gridBottomBoundary = transform.height + 2 * viewportPadding;
39476 }
39477 placeCollisionBox(collisionBox, overlapMode, textPixelRatio, posMatrix, collisionGroupPredicate) {
39478 const projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, collisionBox.anchorPointX, collisionBox.anchorPointY);
39479 const tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio;
39480 const tlX = collisionBox.x1 * tileToViewport + projectedPoint.point.x;
39481 const tlY = collisionBox.y1 * tileToViewport + projectedPoint.point.y;
39482 const brX = collisionBox.x2 * tileToViewport + projectedPoint.point.x;
39483 const brY = collisionBox.y2 * tileToViewport + projectedPoint.point.y;
39484 if (!this.isInsideGrid(tlX, tlY, brX, brY) ||
39485 (overlapMode !== 'always' && this.grid.hitTest(tlX, tlY, brX, brY, overlapMode, collisionGroupPredicate))) {
39486 return {
39487 box: [],
39488 offscreen: false
39489 };
39490 }
39491 return {
39492 box: [tlX, tlY, brX, brY],
39493 offscreen: this.isOffscreen(tlX, tlY, brX, brY)
39494 };
39495 }
39496 placeCollisionCircles(overlapMode, symbol, lineVertexArray, glyphOffsetArray, fontSize, posMatrix, labelPlaneMatrix, labelToScreenMatrix, showCollisionCircles, pitchWithMap, collisionGroupPredicate, circlePixelDiameter, textPixelPadding) {
39497 const placedCollisionCircles = [];
39498 const tileUnitAnchorPoint = new performance.pointGeometry(symbol.anchorX, symbol.anchorY);
39499 const screenAnchorPoint = project(tileUnitAnchorPoint, posMatrix);
39500 const perspectiveRatio = getPerspectiveRatio(this.transform.cameraToCenterDistance, screenAnchorPoint.signedDistanceFromCamera);
39501 const labelPlaneFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio;
39502 const labelPlaneFontScale = labelPlaneFontSize / performance.ONE_EM;
39503 const labelPlaneAnchorPoint = project(tileUnitAnchorPoint, labelPlaneMatrix).point;
39504 const projectionCache = {};
39505 const lineOffsetX = symbol.lineOffsetX * labelPlaneFontScale;
39506 const lineOffsetY = symbol.lineOffsetY * labelPlaneFontScale;
39507 const firstAndLastGlyph = placeFirstAndLastGlyph(labelPlaneFontScale, glyphOffsetArray, lineOffsetX, lineOffsetY,
39508 /*flip*/ false, labelPlaneAnchorPoint, tileUnitAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, false);
39509 let collisionDetected = false;
39510 let inGrid = false;
39511 let entirelyOffscreen = true;
39512 if (firstAndLastGlyph) {
39513 const radius = circlePixelDiameter * 0.5 * perspectiveRatio + textPixelPadding;
39514 const screenPlaneMin = new performance.pointGeometry(-viewportPadding, -viewportPadding);
39515 const screenPlaneMax = new performance.pointGeometry(this.screenRightBoundary, this.screenBottomBoundary);
39516 const interpolator = new PathInterpolator();
39517 // Construct a projected path from projected line vertices. Anchor points are ignored and removed
39518 const first = firstAndLastGlyph.first;
39519 const last = firstAndLastGlyph.last;
39520 let projectedPath = [];
39521 for (let i = first.path.length - 1; i >= 1; i--) {
39522 projectedPath.push(first.path[i]);
39523 }
39524 for (let i = 1; i < last.path.length; i++) {
39525 projectedPath.push(last.path[i]);
39526 }
39527 performance.assert(projectedPath.length >= 2);
39528 // Tolerate a slightly longer distance than one diameter between two adjacent circles
39529 const circleDist = radius * 2.5;
39530 // The path might need to be converted into screen space if a pitched map is used as the label space
39531 if (labelToScreenMatrix) {
39532 const screenSpacePath = projectedPath.map(p => project(p, labelToScreenMatrix));
39533 // Do not try to place collision circles if even of the points is behind the camera.
39534 // This is a plausible scenario with big camera pitch angles
39535 if (screenSpacePath.some(point => point.signedDistanceFromCamera <= 0)) {
39536 projectedPath = [];
39537 }
39538 else {
39539 projectedPath = screenSpacePath.map(p => p.point);
39540 }
39541 }
39542 let segments = [];
39543 if (projectedPath.length > 0) {
39544 // Quickly check if the path is fully inside or outside of the padded collision region.
39545 // For overlapping paths we'll only create collision circles for the visible segments
39546 const minPoint = projectedPath[0].clone();
39547 const maxPoint = projectedPath[0].clone();
39548 for (let i = 1; i < projectedPath.length; i++) {
39549 minPoint.x = Math.min(minPoint.x, projectedPath[i].x);
39550 minPoint.y = Math.min(minPoint.y, projectedPath[i].y);
39551 maxPoint.x = Math.max(maxPoint.x, projectedPath[i].x);
39552 maxPoint.y = Math.max(maxPoint.y, projectedPath[i].y);
39553 }
39554 if (minPoint.x >= screenPlaneMin.x && maxPoint.x <= screenPlaneMax.x &&
39555 minPoint.y >= screenPlaneMin.y && maxPoint.y <= screenPlaneMax.y) {
39556 // Quad fully visible
39557 segments = [projectedPath];
39558 }
39559 else if (maxPoint.x < screenPlaneMin.x || minPoint.x > screenPlaneMax.x ||
39560 maxPoint.y < screenPlaneMin.y || minPoint.y > screenPlaneMax.y) {
39561 // Not visible
39562 segments = [];
39563 }
39564 else {
39565 segments = performance.clipLine([projectedPath], screenPlaneMin.x, screenPlaneMin.y, screenPlaneMax.x, screenPlaneMax.y);
39566 }
39567 }
39568 for (const seg of segments) {
39569 // interpolate positions for collision circles. Add a small padding to both ends of the segment
39570 performance.assert(seg.length > 0);
39571 interpolator.reset(seg, radius * 0.25);
39572 let numCircles = 0;
39573 if (interpolator.length <= 0.5 * radius) {
39574 numCircles = 1;
39575 }
39576 else {
39577 numCircles = Math.ceil(interpolator.paddedLength / circleDist) + 1;
39578 }
39579 for (let i = 0; i < numCircles; i++) {
39580 const t = i / Math.max(numCircles - 1, 1);
39581 const circlePosition = interpolator.lerp(t);
39582 // add viewport padding to the position and perform initial collision check
39583 const centerX = circlePosition.x + viewportPadding;
39584 const centerY = circlePosition.y + viewportPadding;
39585 placedCollisionCircles.push(centerX, centerY, radius, 0);
39586 const x1 = centerX - radius;
39587 const y1 = centerY - radius;
39588 const x2 = centerX + radius;
39589 const y2 = centerY + radius;
39590 entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2);
39591 inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2);
39592 if (overlapMode !== 'always' && this.grid.hitTestCircle(centerX, centerY, radius, overlapMode, collisionGroupPredicate)) {
39593 // Don't early exit if we're showing the debug circles because we still want to calculate
39594 // which circles are in use
39595 collisionDetected = true;
39596 if (!showCollisionCircles) {
39597 return {
39598 circles: [],
39599 offscreen: false,
39600 collisionDetected
39601 };
39602 }
39603 }
39604 }
39605 }
39606 }
39607 return {
39608 circles: ((!showCollisionCircles && collisionDetected) || !inGrid) ? [] : placedCollisionCircles,
39609 offscreen: entirelyOffscreen,
39610 collisionDetected
39611 };
39612 }
39613 /**
39614 * Because the geometries in the CollisionIndex are an approximation of the shape of
39615 * symbols on the map, we use the CollisionIndex to look up the symbol part of
39616 * `queryRenderedFeatures`.
39617 *
39618 * @private
39619 */
39620 queryRenderedSymbols(viewportQueryGeometry) {
39621 if (viewportQueryGeometry.length === 0 || (this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0)) {
39622 return {};
39623 }
39624 const query = [];
39625 let minX = Infinity;
39626 let minY = Infinity;
39627 let maxX = -Infinity;
39628 let maxY = -Infinity;
39629 for (const point of viewportQueryGeometry) {
39630 const gridPoint = new performance.pointGeometry(point.x + viewportPadding, point.y + viewportPadding);
39631 minX = Math.min(minX, gridPoint.x);
39632 minY = Math.min(minY, gridPoint.y);
39633 maxX = Math.max(maxX, gridPoint.x);
39634 maxY = Math.max(maxY, gridPoint.y);
39635 query.push(gridPoint);
39636 }
39637 const features = this.grid.query(minX, minY, maxX, maxY)
39638 .concat(this.ignoredGrid.query(minX, minY, maxX, maxY));
39639 const seenFeatures = {};
39640 const result = {};
39641 for (const feature of features) {
39642 const featureKey = feature.key;
39643 // Skip already seen features.
39644 if (seenFeatures[featureKey.bucketInstanceId] === undefined) {
39645 seenFeatures[featureKey.bucketInstanceId] = {};
39646 }
39647 if (seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex]) {
39648 continue;
39649 }
39650 // Check if query intersects with the feature box
39651 // "Collision Circles" for line labels are treated as boxes here
39652 // Since there's no actual collision taking place, the circle vs. square
39653 // distinction doesn't matter as much, and box geometry is easier
39654 // to work with.
39655 const bbox = [
39656 new performance.pointGeometry(feature.x1, feature.y1),
39657 new performance.pointGeometry(feature.x2, feature.y1),
39658 new performance.pointGeometry(feature.x2, feature.y2),
39659 new performance.pointGeometry(feature.x1, feature.y2)
39660 ];
39661 if (!performance.polygonIntersectsPolygon(query, bbox)) {
39662 continue;
39663 }
39664 seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex] = true;
39665 if (result[featureKey.bucketInstanceId] === undefined) {
39666 result[featureKey.bucketInstanceId] = [];
39667 }
39668 result[featureKey.bucketInstanceId].push(featureKey.featureIndex);
39669 }
39670 return result;
39671 }
39672 insertCollisionBox(collisionBox, overlapMode, ignorePlacement, bucketInstanceId, featureIndex, collisionGroupID) {
39673 const grid = ignorePlacement ? this.ignoredGrid : this.grid;
39674 const key = { bucketInstanceId, featureIndex, collisionGroupID, overlapMode };
39675 grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]);
39676 }
39677 insertCollisionCircles(collisionCircles, overlapMode, ignorePlacement, bucketInstanceId, featureIndex, collisionGroupID) {
39678 const grid = ignorePlacement ? this.ignoredGrid : this.grid;
39679 const key = { bucketInstanceId, featureIndex, collisionGroupID, overlapMode };
39680 for (let k = 0; k < collisionCircles.length; k += 4) {
39681 grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]);
39682 }
39683 }
39684 projectAndGetPerspectiveRatio(posMatrix, x, y) {
39685 const p = [x, y, 0, 1];
39686 xyTransformMat4(p, p, posMatrix);
39687 const a = new performance.pointGeometry((((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding, (((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding);
39688 return {
39689 point: a,
39690 // See perspective ratio comment in symbol_sdf.vertex
39691 // We're doing collision detection in viewport space so we need
39692 // to scale down boxes in the distance
39693 perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3])
39694 };
39695 }
39696 isOffscreen(x1, y1, x2, y2) {
39697 return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary;
39698 }
39699 isInsideGrid(x1, y1, x2, y2) {
39700 return x2 >= 0 && x1 < this.gridRightBoundary && y2 >= 0 && y1 < this.gridBottomBoundary;
39701 }
39702 /*
39703 * Returns a matrix for transforming collision shapes to viewport coordinate space.
39704 * Use this function to render e.g. collision circles on the screen.
39705 * example transformation: clipPos = glCoordMatrix * viewportMatrix * circle_pos
39706 */
39707 getViewportMatrix() {
39708 const m = performance.identity([]);
39709 performance.translate(m, m, [-viewportPadding, -viewportPadding, 0.0]);
39710 return m;
39711 }
39712}
39713
39714/**
39715 * Converts a pixel value at a the given zoom level to tile units.
39716 *
39717 * The shaders mostly calculate everything in tile units so style
39718 * properties need to be converted from pixels to tile units using this.
39719 *
39720 * For example, a translation by 30 pixels at zoom 6.5 will be a
39721 * translation by pixelsToTileUnits(30, 6.5) tile units.
39722 *
39723 * @returns value in tile units
39724 * @private
39725 */
39726function pixelsToTileUnits (tile, pixelValue, z) {
39727 return pixelValue * (performance.EXTENT / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ)));
39728}
39729
39730class OpacityState {
39731 constructor(prevState, increment, placed, skipFade) {
39732 if (prevState) {
39733 this.opacity = Math.max(0, Math.min(1, prevState.opacity + (prevState.placed ? increment : -increment)));
39734 }
39735 else {
39736 this.opacity = (skipFade && placed) ? 1 : 0;
39737 }
39738 this.placed = placed;
39739 }
39740 isHidden() {
39741 return this.opacity === 0 && !this.placed;
39742 }
39743}
39744class JointOpacityState {
39745 constructor(prevState, increment, placedText, placedIcon, skipFade) {
39746 this.text = new OpacityState(prevState ? prevState.text : null, increment, placedText, skipFade);
39747 this.icon = new OpacityState(prevState ? prevState.icon : null, increment, placedIcon, skipFade);
39748 }
39749 isHidden() {
39750 return this.text.isHidden() && this.icon.isHidden();
39751 }
39752}
39753class JointPlacement {
39754 constructor(text, icon, skipFade) {
39755 this.text = text;
39756 this.icon = icon;
39757 this.skipFade = skipFade;
39758 }
39759}
39760class CollisionCircleArray {
39761 constructor() {
39762 this.invProjMatrix = performance.create();
39763 this.viewportMatrix = performance.create();
39764 this.circles = [];
39765 }
39766}
39767class RetainedQueryData {
39768 constructor(bucketInstanceId, featureIndex, sourceLayerIndex, bucketIndex, tileID) {
39769 this.bucketInstanceId = bucketInstanceId;
39770 this.featureIndex = featureIndex;
39771 this.sourceLayerIndex = sourceLayerIndex;
39772 this.bucketIndex = bucketIndex;
39773 this.tileID = tileID;
39774 }
39775}
39776class CollisionGroups {
39777 constructor(crossSourceCollisions) {
39778 this.crossSourceCollisions = crossSourceCollisions;
39779 this.maxGroupID = 0;
39780 this.collisionGroups = {};
39781 }
39782 get(sourceID) {
39783 // The predicate/groupID mechanism allows for arbitrary grouping,
39784 // but the current interface defines one source == one group when
39785 // crossSourceCollisions == true.
39786 if (!this.crossSourceCollisions) {
39787 if (!this.collisionGroups[sourceID]) {
39788 const nextGroupID = ++this.maxGroupID;
39789 this.collisionGroups[sourceID] = {
39790 ID: nextGroupID,
39791 predicate: (key) => {
39792 return key.collisionGroupID === nextGroupID;
39793 }
39794 };
39795 }
39796 return this.collisionGroups[sourceID];
39797 }
39798 else {
39799 return { ID: 0, predicate: null };
39800 }
39801 }
39802}
39803function calculateVariableLayoutShift(anchor, width, height, textOffset, textBoxScale) {
39804 const { horizontalAlign, verticalAlign } = performance.getAnchorAlignment(anchor);
39805 const shiftX = -(horizontalAlign - 0.5) * width;
39806 const shiftY = -(verticalAlign - 0.5) * height;
39807 const offset = performance.evaluateVariableOffset(anchor, textOffset);
39808 return new performance.pointGeometry(shiftX + offset[0] * textBoxScale, shiftY + offset[1] * textBoxScale);
39809}
39810function shiftVariableCollisionBox(collisionBox, shiftX, shiftY, rotateWithMap, pitchWithMap, angle) {
39811 const { x1, x2, y1, y2, anchorPointX, anchorPointY } = collisionBox;
39812 const rotatedOffset = new performance.pointGeometry(shiftX, shiftY);
39813 if (rotateWithMap) {
39814 rotatedOffset._rotate(pitchWithMap ? angle : -angle);
39815 }
39816 return {
39817 x1: x1 + rotatedOffset.x,
39818 y1: y1 + rotatedOffset.y,
39819 x2: x2 + rotatedOffset.x,
39820 y2: y2 + rotatedOffset.y,
39821 // symbol anchor point stays the same regardless of text-anchor
39822 anchorPointX,
39823 anchorPointY
39824 };
39825}
39826class Placement {
39827 constructor(transform, fadeDuration, crossSourceCollisions, prevPlacement) {
39828 this.transform = transform.clone();
39829 this.collisionIndex = new CollisionIndex(this.transform);
39830 this.placements = {};
39831 this.opacities = {};
39832 this.variableOffsets = {};
39833 this.stale = false;
39834 this.commitTime = 0;
39835 this.fadeDuration = fadeDuration;
39836 this.retainedQueryData = {};
39837 this.collisionGroups = new CollisionGroups(crossSourceCollisions);
39838 this.collisionCircleArrays = {};
39839 this.prevPlacement = prevPlacement;
39840 if (prevPlacement) {
39841 prevPlacement.prevPlacement = undefined; // Only hold on to one placement back
39842 }
39843 this.placedOrientations = {};
39844 }
39845 getBucketParts(results, styleLayer, tile, sortAcrossTiles) {
39846 const symbolBucket = tile.getBucket(styleLayer);
39847 const bucketFeatureIndex = tile.latestFeatureIndex;
39848 if (!symbolBucket || !bucketFeatureIndex || styleLayer.id !== symbolBucket.layerIds[0])
39849 return;
39850 const collisionBoxArray = tile.collisionBoxArray;
39851 const layout = symbolBucket.layers[0].layout;
39852 const scale = Math.pow(2, this.transform.zoom - tile.tileID.overscaledZ);
39853 const textPixelRatio = tile.tileSize / performance.EXTENT;
39854 const posMatrix = this.transform.calculatePosMatrix(tile.tileID.toUnwrapped());
39855 const pitchWithMap = layout.get('text-pitch-alignment') === 'map';
39856 const rotateWithMap = layout.get('text-rotation-alignment') === 'map';
39857 const pixelsToTiles = pixelsToTileUnits(tile, 1, this.transform.zoom);
39858 const textLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, pitchWithMap, rotateWithMap, this.transform, pixelsToTiles);
39859 let labelToScreenMatrix = null;
39860 if (pitchWithMap) {
39861 const glMatrix = getGlCoordMatrix(posMatrix, pitchWithMap, rotateWithMap, this.transform, pixelsToTiles);
39862 labelToScreenMatrix = performance.multiply([], this.transform.labelPlaneMatrix, glMatrix);
39863 }
39864 // As long as this placement lives, we have to hold onto this bucket's
39865 // matching FeatureIndex/data for querying purposes
39866 this.retainedQueryData[symbolBucket.bucketInstanceId] = new RetainedQueryData(symbolBucket.bucketInstanceId, bucketFeatureIndex, symbolBucket.sourceLayerIndex, symbolBucket.index, tile.tileID);
39867 const parameters = {
39868 bucket: symbolBucket,
39869 layout,
39870 posMatrix,
39871 textLabelPlaneMatrix,
39872 labelToScreenMatrix,
39873 scale,
39874 textPixelRatio,
39875 holdingForFade: tile.holdingForFade(),
39876 collisionBoxArray,
39877 partiallyEvaluatedTextSize: performance.evaluateSizeForZoom(symbolBucket.textSizeData, this.transform.zoom),
39878 collisionGroup: this.collisionGroups.get(symbolBucket.sourceID)
39879 };
39880 if (sortAcrossTiles) {
39881 for (const range of symbolBucket.sortKeyRanges) {
39882 const { sortKey, symbolInstanceStart, symbolInstanceEnd } = range;
39883 results.push({ sortKey, symbolInstanceStart, symbolInstanceEnd, parameters });
39884 }
39885 }
39886 else {
39887 results.push({
39888 symbolInstanceStart: 0,
39889 symbolInstanceEnd: symbolBucket.symbolInstances.length,
39890 parameters
39891 });
39892 }
39893 }
39894 attemptAnchorPlacement(anchor, textBox, width, height, textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix, collisionGroup, textOverlapMode, symbolInstance, bucket, orientation, iconBox) {
39895 const textOffset = [symbolInstance.textOffset0, symbolInstance.textOffset1];
39896 const shift = calculateVariableLayoutShift(anchor, width, height, textOffset, textBoxScale);
39897 const placedGlyphBoxes = this.collisionIndex.placeCollisionBox(shiftVariableCollisionBox(textBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), textOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
39898 if (iconBox) {
39899 const placedIconBoxes = this.collisionIndex.placeCollisionBox(shiftVariableCollisionBox(iconBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), textOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
39900 if (placedIconBoxes.box.length === 0)
39901 return;
39902 }
39903 if (placedGlyphBoxes.box.length > 0) {
39904 let prevAnchor;
39905 // If this label was placed in the previous placement, record the anchor position
39906 // to allow us to animate the transition
39907 if (this.prevPlacement &&
39908 this.prevPlacement.variableOffsets[symbolInstance.crossTileID] &&
39909 this.prevPlacement.placements[symbolInstance.crossTileID] &&
39910 this.prevPlacement.placements[symbolInstance.crossTileID].text) {
39911 prevAnchor = this.prevPlacement.variableOffsets[symbolInstance.crossTileID].anchor;
39912 }
39913 performance.assert(symbolInstance.crossTileID !== 0);
39914 this.variableOffsets[symbolInstance.crossTileID] = {
39915 textOffset,
39916 width,
39917 height,
39918 anchor,
39919 textBoxScale,
39920 prevAnchor
39921 };
39922 this.markUsedJustification(bucket, anchor, symbolInstance, orientation);
39923 if (bucket.allowVerticalPlacement) {
39924 this.markUsedOrientation(bucket, orientation, symbolInstance);
39925 this.placedOrientations[symbolInstance.crossTileID] = orientation;
39926 }
39927 return { shift, placedGlyphBoxes };
39928 }
39929 }
39930 placeLayerBucketPart(bucketPart, seenCrossTileIDs, showCollisionBoxes) {
39931 const { bucket, layout, posMatrix, textLabelPlaneMatrix, labelToScreenMatrix, textPixelRatio, holdingForFade, collisionBoxArray, partiallyEvaluatedTextSize, collisionGroup } = bucketPart.parameters;
39932 const textOptional = layout.get('text-optional');
39933 const iconOptional = layout.get('icon-optional');
39934 const textOverlapMode = performance.getOverlapMode(layout, 'text-overlap', 'text-allow-overlap');
39935 const textAlwaysOverlap = textOverlapMode === 'always';
39936 const iconOverlapMode = performance.getOverlapMode(layout, 'icon-overlap', 'icon-allow-overlap');
39937 const iconAlwaysOverlap = iconOverlapMode === 'always';
39938 const rotateWithMap = layout.get('text-rotation-alignment') === 'map';
39939 const pitchWithMap = layout.get('text-pitch-alignment') === 'map';
39940 const hasIconTextFit = layout.get('icon-text-fit') !== 'none';
39941 const zOrderByViewportY = layout.get('symbol-z-order') === 'viewport-y';
39942 // This logic is similar to the "defaultOpacityState" logic below in updateBucketOpacities
39943 // If we know a symbol is always supposed to show, force it to be marked visible even if
39944 // it wasn't placed into the collision index (because some or all of it was outside the range
39945 // of the collision grid).
39946 // There is a subtle edge case here we're accepting:
39947 // Symbol A has text-allow-overlap: true, icon-allow-overlap: true, icon-optional: false
39948 // A's icon is outside the grid, so doesn't get placed
39949 // A's text would be inside grid, but doesn't get placed because of icon-optional: false
39950 // We still show A because of the allow-overlap settings.
39951 // Symbol B has allow-overlap: false, and gets placed where A's text would be
39952 // On panning in, there is a short period when Symbol B and Symbol A will overlap
39953 // This is the reverse of our normal policy of "fade in on pan", but should look like any other
39954 // collision and hopefully not be too noticeable.
39955 // See https://github.com/mapbox/mapbox-gl-js/issues/7172
39956 const alwaysShowText = textAlwaysOverlap && (iconAlwaysOverlap || !bucket.hasIconData() || iconOptional);
39957 const alwaysShowIcon = iconAlwaysOverlap && (textAlwaysOverlap || !bucket.hasTextData() || textOptional);
39958 if (!bucket.collisionArrays && collisionBoxArray) {
39959 bucket.deserializeCollisionBoxes(collisionBoxArray);
39960 }
39961 const placeSymbol = (symbolInstance, collisionArrays) => {
39962 if (seenCrossTileIDs[symbolInstance.crossTileID])
39963 return;
39964 if (holdingForFade) {
39965 // Mark all symbols from this tile as "not placed", but don't add to seenCrossTileIDs, because we don't
39966 // know yet if we have a duplicate in a parent tile that _should_ be placed.
39967 this.placements[symbolInstance.crossTileID] = new JointPlacement(false, false, false);
39968 return;
39969 }
39970 let placeText = false;
39971 let placeIcon = false;
39972 let offscreen = true;
39973 let shift = null;
39974 let placed = { box: null, offscreen: null };
39975 let placedVerticalText = { box: null, offscreen: null };
39976 let placedGlyphBoxes = null;
39977 let placedGlyphCircles = null;
39978 let placedIconBoxes = null;
39979 let textFeatureIndex = 0;
39980 let verticalTextFeatureIndex = 0;
39981 let iconFeatureIndex = 0;
39982 if (collisionArrays.textFeatureIndex) {
39983 textFeatureIndex = collisionArrays.textFeatureIndex;
39984 }
39985 else if (symbolInstance.useRuntimeCollisionCircles) {
39986 textFeatureIndex = symbolInstance.featureIndex;
39987 }
39988 if (collisionArrays.verticalTextFeatureIndex) {
39989 verticalTextFeatureIndex = collisionArrays.verticalTextFeatureIndex;
39990 }
39991 const textBox = collisionArrays.textBox;
39992 if (textBox) {
39993 const updatePreviousOrientationIfNotPlaced = (isPlaced) => {
39994 let previousOrientation = performance.WritingMode.horizontal;
39995 if (bucket.allowVerticalPlacement && !isPlaced && this.prevPlacement) {
39996 const prevPlacedOrientation = this.prevPlacement.placedOrientations[symbolInstance.crossTileID];
39997 if (prevPlacedOrientation) {
39998 this.placedOrientations[symbolInstance.crossTileID] = prevPlacedOrientation;
39999 previousOrientation = prevPlacedOrientation;
40000 this.markUsedOrientation(bucket, previousOrientation, symbolInstance);
40001 }
40002 }
40003 return previousOrientation;
40004 };
40005 const placeTextForPlacementModes = (placeHorizontalFn, placeVerticalFn) => {
40006 if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && collisionArrays.verticalTextBox) {
40007 for (const placementMode of bucket.writingModes) {
40008 if (placementMode === performance.WritingMode.vertical) {
40009 placed = placeVerticalFn();
40010 placedVerticalText = placed;
40011 }
40012 else {
40013 placed = placeHorizontalFn();
40014 }
40015 if (placed && placed.box && placed.box.length)
40016 break;
40017 }
40018 }
40019 else {
40020 placed = placeHorizontalFn();
40021 }
40022 };
40023 if (!layout.get('text-variable-anchor')) {
40024 const placeBox = (collisionTextBox, orientation) => {
40025 const placedFeature = this.collisionIndex.placeCollisionBox(collisionTextBox, textOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
40026 if (placedFeature && placedFeature.box && placedFeature.box.length) {
40027 this.markUsedOrientation(bucket, orientation, symbolInstance);
40028 this.placedOrientations[symbolInstance.crossTileID] = orientation;
40029 }
40030 return placedFeature;
40031 };
40032 const placeHorizontal = () => {
40033 return placeBox(textBox, performance.WritingMode.horizontal);
40034 };
40035 const placeVertical = () => {
40036 const verticalTextBox = collisionArrays.verticalTextBox;
40037 if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) {
40038 return placeBox(verticalTextBox, performance.WritingMode.vertical);
40039 }
40040 return { box: null, offscreen: null };
40041 };
40042 placeTextForPlacementModes(placeHorizontal, placeVertical);
40043 updatePreviousOrientationIfNotPlaced(placed && placed.box && placed.box.length);
40044 }
40045 else {
40046 let anchors = layout.get('text-variable-anchor');
40047 // If this symbol was in the last placement, shift the previously used
40048 // anchor to the front of the anchor list, only if the previous anchor
40049 // is still in the anchor list
40050 if (this.prevPlacement && this.prevPlacement.variableOffsets[symbolInstance.crossTileID]) {
40051 const prevOffsets = this.prevPlacement.variableOffsets[symbolInstance.crossTileID];
40052 if (anchors.indexOf(prevOffsets.anchor) > 0) {
40053 anchors = anchors.filter(anchor => anchor !== prevOffsets.anchor);
40054 anchors.unshift(prevOffsets.anchor);
40055 }
40056 }
40057 const placeBoxForVariableAnchors = (collisionTextBox, collisionIconBox, orientation) => {
40058 const width = collisionTextBox.x2 - collisionTextBox.x1;
40059 const height = collisionTextBox.y2 - collisionTextBox.y1;
40060 const textBoxScale = symbolInstance.textBoxScale;
40061 const variableIconBox = hasIconTextFit && (iconOverlapMode === 'never') ? collisionIconBox : null;
40062 let placedBox = { box: [], offscreen: false };
40063 const placementAttempts = (textOverlapMode !== 'never') ? anchors.length * 2 : anchors.length;
40064 for (let i = 0; i < placementAttempts; ++i) {
40065 const anchor = anchors[i % anchors.length];
40066 const overlapMode = (i >= anchors.length) ? textOverlapMode : 'never';
40067 const result = this.attemptAnchorPlacement(anchor, collisionTextBox, width, height, textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix, collisionGroup, overlapMode, symbolInstance, bucket, orientation, variableIconBox);
40068 if (result) {
40069 placedBox = result.placedGlyphBoxes;
40070 if (placedBox && placedBox.box && placedBox.box.length) {
40071 placeText = true;
40072 shift = result.shift;
40073 break;
40074 }
40075 }
40076 }
40077 return placedBox;
40078 };
40079 const placeHorizontal = () => {
40080 return placeBoxForVariableAnchors(textBox, collisionArrays.iconBox, performance.WritingMode.horizontal);
40081 };
40082 const placeVertical = () => {
40083 const verticalTextBox = collisionArrays.verticalTextBox;
40084 const wasPlaced = placed && placed.box && placed.box.length;
40085 if (bucket.allowVerticalPlacement && !wasPlaced && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) {
40086 return placeBoxForVariableAnchors(verticalTextBox, collisionArrays.verticalIconBox, performance.WritingMode.vertical);
40087 }
40088 return { box: null, offscreen: null };
40089 };
40090 placeTextForPlacementModes(placeHorizontal, placeVertical);
40091 if (placed) {
40092 placeText = placed.box;
40093 offscreen = placed.offscreen;
40094 }
40095 const prevOrientation = updatePreviousOrientationIfNotPlaced(placed && placed.box);
40096 // If we didn't get placed, we still need to copy our position from the last placement for
40097 // fade animations
40098 if (!placeText && this.prevPlacement) {
40099 const prevOffset = this.prevPlacement.variableOffsets[symbolInstance.crossTileID];
40100 if (prevOffset) {
40101 this.variableOffsets[symbolInstance.crossTileID] = prevOffset;
40102 this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, prevOrientation);
40103 }
40104 }
40105 }
40106 }
40107 placedGlyphBoxes = placed;
40108 placeText = placedGlyphBoxes && placedGlyphBoxes.box && placedGlyphBoxes.box.length > 0;
40109 offscreen = placedGlyphBoxes && placedGlyphBoxes.offscreen;
40110 if (symbolInstance.useRuntimeCollisionCircles) {
40111 const placedSymbol = bucket.text.placedSymbolArray.get(symbolInstance.centerJustifiedTextSymbolIndex);
40112 const fontSize = performance.evaluateSizeForFeature(bucket.textSizeData, partiallyEvaluatedTextSize, placedSymbol);
40113 const textPixelPadding = layout.get('text-padding');
40114 const circlePixelDiameter = symbolInstance.collisionCircleDiameter;
40115 placedGlyphCircles = this.collisionIndex.placeCollisionCircles(textOverlapMode, placedSymbol, bucket.lineVertexArray, bucket.glyphOffsetArray, fontSize, posMatrix, textLabelPlaneMatrix, labelToScreenMatrix, showCollisionBoxes, pitchWithMap, collisionGroup.predicate, circlePixelDiameter, textPixelPadding);
40116 performance.assert(!placedGlyphCircles.circles.length || (!placedGlyphCircles.collisionDetected || showCollisionBoxes));
40117 // If text-overlap is set to 'always', force "placedCircles" to true
40118 // In theory there should always be at least one circle placed
40119 // in this case, but for now quirks in text-anchor
40120 // and text-offset may prevent that from being true.
40121 placeText = textAlwaysOverlap || (placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected);
40122 offscreen = offscreen && placedGlyphCircles.offscreen;
40123 }
40124 if (collisionArrays.iconFeatureIndex) {
40125 iconFeatureIndex = collisionArrays.iconFeatureIndex;
40126 }
40127 if (collisionArrays.iconBox) {
40128 const placeIconFeature = iconBox => {
40129 const shiftedIconBox = hasIconTextFit && shift ?
40130 shiftVariableCollisionBox(iconBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle) :
40131 iconBox;
40132 return this.collisionIndex.placeCollisionBox(shiftedIconBox, iconOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
40133 };
40134 if (placedVerticalText && placedVerticalText.box && placedVerticalText.box.length && collisionArrays.verticalIconBox) {
40135 placedIconBoxes = placeIconFeature(collisionArrays.verticalIconBox);
40136 placeIcon = placedIconBoxes.box.length > 0;
40137 }
40138 else {
40139 placedIconBoxes = placeIconFeature(collisionArrays.iconBox);
40140 placeIcon = placedIconBoxes.box.length > 0;
40141 }
40142 offscreen = offscreen && placedIconBoxes.offscreen;
40143 }
40144 const iconWithoutText = textOptional ||
40145 (symbolInstance.numHorizontalGlyphVertices === 0 && symbolInstance.numVerticalGlyphVertices === 0);
40146 const textWithoutIcon = iconOptional || symbolInstance.numIconVertices === 0;
40147 // Combine the scales for icons and text.
40148 if (!iconWithoutText && !textWithoutIcon) {
40149 placeIcon = placeText = placeIcon && placeText;
40150 }
40151 else if (!textWithoutIcon) {
40152 placeText = placeIcon && placeText;
40153 }
40154 else if (!iconWithoutText) {
40155 placeIcon = placeIcon && placeText;
40156 }
40157 if (placeText && placedGlyphBoxes && placedGlyphBoxes.box) {
40158 if (placedVerticalText && placedVerticalText.box && verticalTextFeatureIndex) {
40159 this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, textOverlapMode, layout.get('text-ignore-placement'), bucket.bucketInstanceId, verticalTextFeatureIndex, collisionGroup.ID);
40160 }
40161 else {
40162 this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, textOverlapMode, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID);
40163 }
40164 }
40165 if (placeIcon && placedIconBoxes) {
40166 this.collisionIndex.insertCollisionBox(placedIconBoxes.box, iconOverlapMode, layout.get('icon-ignore-placement'), bucket.bucketInstanceId, iconFeatureIndex, collisionGroup.ID);
40167 }
40168 if (placedGlyphCircles) {
40169 if (placeText) {
40170 this.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, textOverlapMode, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID);
40171 }
40172 if (showCollisionBoxes) {
40173 const id = bucket.bucketInstanceId;
40174 let circleArray = this.collisionCircleArrays[id];
40175 // Group collision circles together by bucket. Circles can't be pushed forward for rendering yet as the symbol placement
40176 // for a bucket is not guaranteed to be complete before the commit-function has been called
40177 if (circleArray === undefined)
40178 circleArray = this.collisionCircleArrays[id] = new CollisionCircleArray();
40179 for (let i = 0; i < placedGlyphCircles.circles.length; i += 4) {
40180 circleArray.circles.push(placedGlyphCircles.circles[i + 0]); // x
40181 circleArray.circles.push(placedGlyphCircles.circles[i + 1]); // y
40182 circleArray.circles.push(placedGlyphCircles.circles[i + 2]); // radius
40183 circleArray.circles.push(placedGlyphCircles.collisionDetected ? 1 : 0); // collisionDetected-flag
40184 }
40185 }
40186 }
40187 performance.assert(symbolInstance.crossTileID !== 0);
40188 performance.assert(bucket.bucketInstanceId !== 0);
40189 this.placements[symbolInstance.crossTileID] = new JointPlacement(placeText || alwaysShowText, placeIcon || alwaysShowIcon, offscreen || bucket.justReloaded);
40190 seenCrossTileIDs[symbolInstance.crossTileID] = true;
40191 };
40192 if (zOrderByViewportY) {
40193 performance.assert(bucketPart.symbolInstanceStart === 0);
40194 const symbolIndexes = bucket.getSortedSymbolIndexes(this.transform.angle);
40195 for (let i = symbolIndexes.length - 1; i >= 0; --i) {
40196 const symbolIndex = symbolIndexes[i];
40197 placeSymbol(bucket.symbolInstances.get(symbolIndex), bucket.collisionArrays[symbolIndex]);
40198 }
40199 }
40200 else {
40201 for (let i = bucketPart.symbolInstanceStart; i < bucketPart.symbolInstanceEnd; i++) {
40202 placeSymbol(bucket.symbolInstances.get(i), bucket.collisionArrays[i]);
40203 }
40204 }
40205 if (showCollisionBoxes && bucket.bucketInstanceId in this.collisionCircleArrays) {
40206 const circleArray = this.collisionCircleArrays[bucket.bucketInstanceId];
40207 // Store viewport and inverse projection matrices per bucket
40208 performance.invert(circleArray.invProjMatrix, posMatrix);
40209 circleArray.viewportMatrix = this.collisionIndex.getViewportMatrix();
40210 }
40211 bucket.justReloaded = false;
40212 }
40213 markUsedJustification(bucket, placedAnchor, symbolInstance, orientation) {
40214 const justifications = {
40215 'left': symbolInstance.leftJustifiedTextSymbolIndex,
40216 'center': symbolInstance.centerJustifiedTextSymbolIndex,
40217 'right': symbolInstance.rightJustifiedTextSymbolIndex
40218 };
40219 let autoIndex;
40220 if (orientation === performance.WritingMode.vertical) {
40221 autoIndex = symbolInstance.verticalPlacedTextSymbolIndex;
40222 }
40223 else {
40224 autoIndex = justifications[performance.getAnchorJustification(placedAnchor)];
40225 }
40226 const indexes = [
40227 symbolInstance.leftJustifiedTextSymbolIndex,
40228 symbolInstance.centerJustifiedTextSymbolIndex,
40229 symbolInstance.rightJustifiedTextSymbolIndex,
40230 symbolInstance.verticalPlacedTextSymbolIndex
40231 ];
40232 for (const index of indexes) {
40233 if (index >= 0) {
40234 if (autoIndex >= 0 && index !== autoIndex) {
40235 // There are multiple justifications and this one isn't it: shift offscreen
40236 bucket.text.placedSymbolArray.get(index).crossTileID = 0;
40237 }
40238 else {
40239 // Either this is the chosen justification or the justification is hardwired: use this one
40240 bucket.text.placedSymbolArray.get(index).crossTileID = symbolInstance.crossTileID;
40241 }
40242 }
40243 }
40244 }
40245 markUsedOrientation(bucket, orientation, symbolInstance) {
40246 const horizontal = (orientation === performance.WritingMode.horizontal || orientation === performance.WritingMode.horizontalOnly) ? orientation : 0;
40247 const vertical = orientation === performance.WritingMode.vertical ? orientation : 0;
40248 const horizontalIndexes = [
40249 symbolInstance.leftJustifiedTextSymbolIndex,
40250 symbolInstance.centerJustifiedTextSymbolIndex,
40251 symbolInstance.rightJustifiedTextSymbolIndex
40252 ];
40253 for (const index of horizontalIndexes) {
40254 bucket.text.placedSymbolArray.get(index).placedOrientation = horizontal;
40255 }
40256 if (symbolInstance.verticalPlacedTextSymbolIndex) {
40257 bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).placedOrientation = vertical;
40258 }
40259 }
40260 commit(now) {
40261 this.commitTime = now;
40262 this.zoomAtLastRecencyCheck = this.transform.zoom;
40263 const prevPlacement = this.prevPlacement;
40264 let placementChanged = false;
40265 this.prevZoomAdjustment = prevPlacement ? prevPlacement.zoomAdjustment(this.transform.zoom) : 0;
40266 const increment = prevPlacement ? prevPlacement.symbolFadeChange(now) : 1;
40267 const prevOpacities = prevPlacement ? prevPlacement.opacities : {};
40268 const prevOffsets = prevPlacement ? prevPlacement.variableOffsets : {};
40269 const prevOrientations = prevPlacement ? prevPlacement.placedOrientations : {};
40270 // add the opacities from the current placement, and copy their current values from the previous placement
40271 for (const crossTileID in this.placements) {
40272 const jointPlacement = this.placements[crossTileID];
40273 const prevOpacity = prevOpacities[crossTileID];
40274 if (prevOpacity) {
40275 this.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon);
40276 placementChanged = placementChanged ||
40277 jointPlacement.text !== prevOpacity.text.placed ||
40278 jointPlacement.icon !== prevOpacity.icon.placed;
40279 }
40280 else {
40281 this.opacities[crossTileID] = new JointOpacityState(null, increment, jointPlacement.text, jointPlacement.icon, jointPlacement.skipFade);
40282 placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon;
40283 }
40284 }
40285 // copy and update values from the previous placement that aren't in the current placement but haven't finished fading
40286 for (const crossTileID in prevOpacities) {
40287 const prevOpacity = prevOpacities[crossTileID];
40288 if (!this.opacities[crossTileID]) {
40289 const jointOpacity = new JointOpacityState(prevOpacity, increment, false, false);
40290 if (!jointOpacity.isHidden()) {
40291 this.opacities[crossTileID] = jointOpacity;
40292 placementChanged = placementChanged || prevOpacity.text.placed || prevOpacity.icon.placed;
40293 }
40294 }
40295 }
40296 for (const crossTileID in prevOffsets) {
40297 if (!this.variableOffsets[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) {
40298 this.variableOffsets[crossTileID] = prevOffsets[crossTileID];
40299 }
40300 }
40301 for (const crossTileID in prevOrientations) {
40302 if (!this.placedOrientations[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) {
40303 this.placedOrientations[crossTileID] = prevOrientations[crossTileID];
40304 }
40305 }
40306 // this.lastPlacementChangeTime is the time of the last commit() that
40307 // resulted in a placement change -- in other words, the start time of
40308 // the last symbol fade animation
40309 performance.assert(!prevPlacement || prevPlacement.lastPlacementChangeTime !== undefined);
40310 if (placementChanged) {
40311 this.lastPlacementChangeTime = now;
40312 }
40313 else if (typeof this.lastPlacementChangeTime !== 'number') {
40314 this.lastPlacementChangeTime = prevPlacement ? prevPlacement.lastPlacementChangeTime : now;
40315 }
40316 }
40317 updateLayerOpacities(styleLayer, tiles) {
40318 const seenCrossTileIDs = {};
40319 for (const tile of tiles) {
40320 const symbolBucket = tile.getBucket(styleLayer);
40321 if (symbolBucket && tile.latestFeatureIndex && styleLayer.id === symbolBucket.layerIds[0]) {
40322 this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray);
40323 }
40324 }
40325 }
40326 updateBucketOpacities(bucket, seenCrossTileIDs, collisionBoxArray) {
40327 if (bucket.hasTextData())
40328 bucket.text.opacityVertexArray.clear();
40329 if (bucket.hasIconData())
40330 bucket.icon.opacityVertexArray.clear();
40331 if (bucket.hasIconCollisionBoxData())
40332 bucket.iconCollisionBox.collisionVertexArray.clear();
40333 if (bucket.hasTextCollisionBoxData())
40334 bucket.textCollisionBox.collisionVertexArray.clear();
40335 const layout = bucket.layers[0].layout;
40336 const duplicateOpacityState = new JointOpacityState(null, 0, false, false, true);
40337 const textAllowOverlap = layout.get('text-allow-overlap');
40338 const iconAllowOverlap = layout.get('icon-allow-overlap');
40339 const variablePlacement = layout.get('text-variable-anchor');
40340 const rotateWithMap = layout.get('text-rotation-alignment') === 'map';
40341 const pitchWithMap = layout.get('text-pitch-alignment') === 'map';
40342 const hasIconTextFit = layout.get('icon-text-fit') !== 'none';
40343 // If allow-overlap is true, we can show symbols before placement runs on them
40344 // But we have to wait for placement if we potentially depend on a paired icon/text
40345 // with allow-overlap: false.
40346 // See https://github.com/mapbox/mapbox-gl-js/issues/7032
40347 const defaultOpacityState = new JointOpacityState(null, 0, textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')), iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')), true);
40348 if (!bucket.collisionArrays && collisionBoxArray && ((bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()))) {
40349 bucket.deserializeCollisionBoxes(collisionBoxArray);
40350 }
40351 const addOpacities = (iconOrText, numVertices, opacity) => {
40352 for (let i = 0; i < numVertices / 4; i++) {
40353 iconOrText.opacityVertexArray.emplaceBack(opacity);
40354 }
40355 };
40356 for (let s = 0; s < bucket.symbolInstances.length; s++) {
40357 const symbolInstance = bucket.symbolInstances.get(s);
40358 const { numHorizontalGlyphVertices, numVerticalGlyphVertices, crossTileID } = symbolInstance;
40359 const isDuplicate = seenCrossTileIDs[crossTileID];
40360 let opacityState = this.opacities[crossTileID];
40361 if (isDuplicate) {
40362 opacityState = duplicateOpacityState;
40363 }
40364 else if (!opacityState) {
40365 opacityState = defaultOpacityState;
40366 // store the state so that future placements use it as a starting point
40367 this.opacities[crossTileID] = opacityState;
40368 }
40369 seenCrossTileIDs[crossTileID] = true;
40370 const hasText = numHorizontalGlyphVertices > 0 || numVerticalGlyphVertices > 0;
40371 const hasIcon = symbolInstance.numIconVertices > 0;
40372 const placedOrientation = this.placedOrientations[symbolInstance.crossTileID];
40373 const horizontalHidden = placedOrientation === performance.WritingMode.vertical;
40374 const verticalHidden = placedOrientation === performance.WritingMode.horizontal || placedOrientation === performance.WritingMode.horizontalOnly;
40375 if (hasText) {
40376 const packedOpacity = packOpacity(opacityState.text);
40377 // Vertical text fades in/out on collision the same way as corresponding
40378 // horizontal text. Switch between vertical/horizontal should be instantaneous
40379 const horizontalOpacity = horizontalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity;
40380 addOpacities(bucket.text, numHorizontalGlyphVertices, horizontalOpacity);
40381 const verticalOpacity = verticalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity;
40382 addOpacities(bucket.text, numVerticalGlyphVertices, verticalOpacity);
40383 // If this label is completely faded, mark it so that we don't have to calculate
40384 // its position at render time. If this layer has variable placement, shift the various
40385 // symbol instances appropriately so that symbols from buckets that have yet to be placed
40386 // offset appropriately.
40387 const symbolHidden = opacityState.text.isHidden();
40388 [
40389 symbolInstance.rightJustifiedTextSymbolIndex,
40390 symbolInstance.centerJustifiedTextSymbolIndex,
40391 symbolInstance.leftJustifiedTextSymbolIndex
40392 ].forEach(index => {
40393 if (index >= 0) {
40394 bucket.text.placedSymbolArray.get(index).hidden = symbolHidden || horizontalHidden ? 1 : 0;
40395 }
40396 });
40397 if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) {
40398 bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).hidden = symbolHidden || verticalHidden ? 1 : 0;
40399 }
40400 const prevOffset = this.variableOffsets[symbolInstance.crossTileID];
40401 if (prevOffset) {
40402 this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, placedOrientation);
40403 }
40404 const prevOrientation = this.placedOrientations[symbolInstance.crossTileID];
40405 if (prevOrientation) {
40406 this.markUsedJustification(bucket, 'left', symbolInstance, prevOrientation);
40407 this.markUsedOrientation(bucket, prevOrientation, symbolInstance);
40408 }
40409 }
40410 if (hasIcon) {
40411 const packedOpacity = packOpacity(opacityState.icon);
40412 const useHorizontal = !(hasIconTextFit && symbolInstance.verticalPlacedIconSymbolIndex && horizontalHidden);
40413 if (symbolInstance.placedIconSymbolIndex >= 0) {
40414 const horizontalOpacity = useHorizontal ? packedOpacity : PACKED_HIDDEN_OPACITY;
40415 addOpacities(bucket.icon, symbolInstance.numIconVertices, horizontalOpacity);
40416 bucket.icon.placedSymbolArray.get(symbolInstance.placedIconSymbolIndex).hidden =
40417 opacityState.icon.isHidden();
40418 }
40419 if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) {
40420 const verticalOpacity = !useHorizontal ? packedOpacity : PACKED_HIDDEN_OPACITY;
40421 addOpacities(bucket.icon, symbolInstance.numVerticalIconVertices, verticalOpacity);
40422 bucket.icon.placedSymbolArray.get(symbolInstance.verticalPlacedIconSymbolIndex).hidden =
40423 opacityState.icon.isHidden();
40424 }
40425 }
40426 if (bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()) {
40427 const collisionArrays = bucket.collisionArrays[s];
40428 if (collisionArrays) {
40429 let shift = new performance.pointGeometry(0, 0);
40430 if (collisionArrays.textBox || collisionArrays.verticalTextBox) {
40431 let used = true;
40432 if (variablePlacement) {
40433 const variableOffset = this.variableOffsets[crossTileID];
40434 if (variableOffset) {
40435 // This will show either the currently placed position or the last
40436 // successfully placed position (so you can visualize what collision
40437 // just made the symbol disappear, and the most likely place for the
40438 // symbol to come back)
40439 shift = calculateVariableLayoutShift(variableOffset.anchor, variableOffset.width, variableOffset.height, variableOffset.textOffset, variableOffset.textBoxScale);
40440 if (rotateWithMap) {
40441 shift._rotate(pitchWithMap ? this.transform.angle : -this.transform.angle);
40442 }
40443 }
40444 else {
40445 // No offset -> this symbol hasn't been placed since coming on-screen
40446 // No single box is particularly meaningful and all of them would be too noisy
40447 // Use the center box just to show something's there, but mark it "not used"
40448 used = false;
40449 }
40450 }
40451 if (collisionArrays.textBox) {
40452 updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || horizontalHidden, shift.x, shift.y);
40453 }
40454 if (collisionArrays.verticalTextBox) {
40455 updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || verticalHidden, shift.x, shift.y);
40456 }
40457 }
40458 const verticalIconUsed = Boolean(!verticalHidden && collisionArrays.verticalIconBox);
40459 if (collisionArrays.iconBox) {
40460 updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, verticalIconUsed, hasIconTextFit ? shift.x : 0, hasIconTextFit ? shift.y : 0);
40461 }
40462 if (collisionArrays.verticalIconBox) {
40463 updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, !verticalIconUsed, hasIconTextFit ? shift.x : 0, hasIconTextFit ? shift.y : 0);
40464 }
40465 }
40466 }
40467 }
40468 bucket.sortFeatures(this.transform.angle);
40469 if (this.retainedQueryData[bucket.bucketInstanceId]) {
40470 this.retainedQueryData[bucket.bucketInstanceId].featureSortOrder = bucket.featureSortOrder;
40471 }
40472 if (bucket.hasTextData() && bucket.text.opacityVertexBuffer) {
40473 bucket.text.opacityVertexBuffer.updateData(bucket.text.opacityVertexArray);
40474 }
40475 if (bucket.hasIconData() && bucket.icon.opacityVertexBuffer) {
40476 bucket.icon.opacityVertexBuffer.updateData(bucket.icon.opacityVertexArray);
40477 }
40478 if (bucket.hasIconCollisionBoxData() && bucket.iconCollisionBox.collisionVertexBuffer) {
40479 bucket.iconCollisionBox.collisionVertexBuffer.updateData(bucket.iconCollisionBox.collisionVertexArray);
40480 }
40481 if (bucket.hasTextCollisionBoxData() && bucket.textCollisionBox.collisionVertexBuffer) {
40482 bucket.textCollisionBox.collisionVertexBuffer.updateData(bucket.textCollisionBox.collisionVertexArray);
40483 }
40484 performance.assert(bucket.text.opacityVertexArray.length === bucket.text.layoutVertexArray.length / 4);
40485 performance.assert(bucket.icon.opacityVertexArray.length === bucket.icon.layoutVertexArray.length / 4);
40486 // Push generated collision circles to the bucket for debug rendering
40487 if (bucket.bucketInstanceId in this.collisionCircleArrays) {
40488 const instance = this.collisionCircleArrays[bucket.bucketInstanceId];
40489 bucket.placementInvProjMatrix = instance.invProjMatrix;
40490 bucket.placementViewportMatrix = instance.viewportMatrix;
40491 bucket.collisionCircleArray = instance.circles;
40492 delete this.collisionCircleArrays[bucket.bucketInstanceId];
40493 }
40494 }
40495 symbolFadeChange(now) {
40496 return this.fadeDuration === 0 ?
40497 1 :
40498 ((now - this.commitTime) / this.fadeDuration + this.prevZoomAdjustment);
40499 }
40500 zoomAdjustment(zoom) {
40501 // When zooming out quickly, labels can overlap each other. This
40502 // adjustment is used to reduce the interval between placement calculations
40503 // and to reduce the fade duration when zooming out quickly. Discovering the
40504 // collisions more quickly and fading them more quickly reduces the unwanted effect.
40505 return Math.max(0, (this.transform.zoom - zoom) / 1.5);
40506 }
40507 hasTransitions(now) {
40508 return this.stale ||
40509 now - this.lastPlacementChangeTime < this.fadeDuration;
40510 }
40511 stillRecent(now, zoom) {
40512 // The adjustment makes placement more frequent when zooming.
40513 // This condition applies the adjustment only after the map has
40514 // stopped zooming. This avoids adding extra jank while zooming.
40515 const durationAdjustment = this.zoomAtLastRecencyCheck === zoom ?
40516 (1 - this.zoomAdjustment(zoom)) :
40517 1;
40518 this.zoomAtLastRecencyCheck = zoom;
40519 return this.commitTime + this.fadeDuration * durationAdjustment > now;
40520 }
40521 setStale() {
40522 this.stale = true;
40523 }
40524}
40525function updateCollisionVertices(collisionVertexArray, placed, notUsed, shiftX, shiftY) {
40526 collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);
40527 collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);
40528 collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);
40529 collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);
40530}
40531// All four vertices for a glyph will have the same opacity state
40532// So we pack the opacity into a uint8, and then repeat it four times
40533// to make a single uint32 that we can upload for each glyph in the
40534// label.
40535const shift25 = Math.pow(2, 25);
40536const shift24 = Math.pow(2, 24);
40537const shift17 = Math.pow(2, 17);
40538const shift16 = Math.pow(2, 16);
40539const shift9 = Math.pow(2, 9);
40540const shift8 = Math.pow(2, 8);
40541const shift1 = Math.pow(2, 1);
40542function packOpacity(opacityState) {
40543 if (opacityState.opacity === 0 && !opacityState.placed) {
40544 return 0;
40545 }
40546 else if (opacityState.opacity === 1 && opacityState.placed) {
40547 return 4294967295;
40548 }
40549 const targetBit = opacityState.placed ? 1 : 0;
40550 const opacityBits = Math.floor(opacityState.opacity * 127);
40551 return opacityBits * shift25 + targetBit * shift24 +
40552 opacityBits * shift17 + targetBit * shift16 +
40553 opacityBits * shift9 + targetBit * shift8 +
40554 opacityBits * shift1 + targetBit;
40555}
40556const PACKED_HIDDEN_OPACITY = 0;
40557
40558class LayerPlacement {
40559 constructor(styleLayer) {
40560 this._sortAcrossTiles = styleLayer.layout.get('symbol-z-order') !== 'viewport-y' &&
40561 !styleLayer.layout.get('symbol-sort-key').isConstant();
40562 this._currentTileIndex = 0;
40563 this._currentPartIndex = 0;
40564 this._seenCrossTileIDs = {};
40565 this._bucketParts = [];
40566 }
40567 continuePlacement(tiles, placement, showCollisionBoxes, styleLayer, shouldPausePlacement) {
40568 const bucketParts = this._bucketParts;
40569 while (this._currentTileIndex < tiles.length) {
40570 const tile = tiles[this._currentTileIndex];
40571 placement.getBucketParts(bucketParts, styleLayer, tile, this._sortAcrossTiles);
40572 this._currentTileIndex++;
40573 if (shouldPausePlacement()) {
40574 return true;
40575 }
40576 }
40577 if (this._sortAcrossTiles) {
40578 this._sortAcrossTiles = false;
40579 bucketParts.sort((a, b) => a.sortKey - b.sortKey);
40580 }
40581 while (this._currentPartIndex < bucketParts.length) {
40582 const bucketPart = bucketParts[this._currentPartIndex];
40583 placement.placeLayerBucketPart(bucketPart, this._seenCrossTileIDs, showCollisionBoxes);
40584 this._currentPartIndex++;
40585 if (shouldPausePlacement()) {
40586 return true;
40587 }
40588 }
40589 return false;
40590 }
40591}
40592class PauseablePlacement {
40593 constructor(transform, order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, prevPlacement) {
40594 this.placement = new Placement(transform, fadeDuration, crossSourceCollisions, prevPlacement);
40595 this._currentPlacementIndex = order.length - 1;
40596 this._forceFullPlacement = forceFullPlacement;
40597 this._showCollisionBoxes = showCollisionBoxes;
40598 this._done = false;
40599 }
40600 isDone() {
40601 return this._done;
40602 }
40603 continuePlacement(order, layers, layerTiles) {
40604 const startTime = performance.exported.now();
40605 const shouldPausePlacement = () => {
40606 const elapsedTime = performance.exported.now() - startTime;
40607 return this._forceFullPlacement ? false : elapsedTime > 2;
40608 };
40609 while (this._currentPlacementIndex >= 0) {
40610 const layerId = order[this._currentPlacementIndex];
40611 const layer = layers[layerId];
40612 const placementZoom = this.placement.collisionIndex.transform.zoom;
40613 if (layer.type === 'symbol' &&
40614 (!layer.minzoom || layer.minzoom <= placementZoom) &&
40615 (!layer.maxzoom || layer.maxzoom > placementZoom)) {
40616 if (!this._inProgressLayer) {
40617 this._inProgressLayer = new LayerPlacement(layer);
40618 }
40619 const pausePlacement = this._inProgressLayer.continuePlacement(layerTiles[layer.source], this.placement, this._showCollisionBoxes, layer, shouldPausePlacement);
40620 if (pausePlacement) {
40621 // We didn't finish placing all layers within 2ms,
40622 // but we can keep rendering with a partial placement
40623 // We'll resume here on the next frame
40624 return;
40625 }
40626 delete this._inProgressLayer;
40627 }
40628 this._currentPlacementIndex--;
40629 }
40630 this._done = true;
40631 }
40632 commit(now) {
40633 this.placement.commit(now);
40634 return this.placement;
40635 }
40636}
40637
40638/*
40639 The CrossTileSymbolIndex generally works on the assumption that
40640 a conceptual "unique symbol" can be identified by the text of
40641 the label combined with the anchor point. The goal is to assign
40642 these conceptual "unique symbols" a shared crossTileID that can be
40643 used by Placement to keep fading opacity states consistent and to
40644 deduplicate labels.
40645
40646 The CrossTileSymbolIndex indexes all the current symbol instances and
40647 their crossTileIDs. When a symbol bucket gets added or updated, the
40648 index assigns a crossTileID to each of it's symbol instances by either
40649 matching it with an existing id or assigning a new one.
40650*/
40651// Round anchor positions to roughly 4 pixel grid
40652const roundingFactor = 512 / performance.EXTENT / 2;
40653class TileLayerIndex {
40654 constructor(tileID, symbolInstances, bucketInstanceId) {
40655 this.tileID = tileID;
40656 this.indexedSymbolInstances = {};
40657 this.bucketInstanceId = bucketInstanceId;
40658 for (let i = 0; i < symbolInstances.length; i++) {
40659 const symbolInstance = symbolInstances.get(i);
40660 const key = symbolInstance.key;
40661 if (!this.indexedSymbolInstances[key]) {
40662 this.indexedSymbolInstances[key] = [];
40663 }
40664 // This tile may have multiple symbol instances with the same key
40665 // Store each one along with its coordinates
40666 this.indexedSymbolInstances[key].push({
40667 crossTileID: symbolInstance.crossTileID,
40668 coord: this.getScaledCoordinates(symbolInstance, tileID)
40669 });
40670 }
40671 }
40672 // Converts the coordinates of the input symbol instance into coordinates that be can compared
40673 // against other symbols in this index. Coordinates are:
40674 // (1) world-based (so after conversion the source tile is irrelevant)
40675 // (2) converted to the z-scale of this TileLayerIndex
40676 // (3) down-sampled by "roundingFactor" from tile coordinate precision in order to be
40677 // more tolerant of small differences between tiles.
40678 getScaledCoordinates(symbolInstance, childTileID) {
40679 const zDifference = childTileID.canonical.z - this.tileID.canonical.z;
40680 const scale = roundingFactor / Math.pow(2, zDifference);
40681 return {
40682 x: Math.floor((childTileID.canonical.x * performance.EXTENT + symbolInstance.anchorX) * scale),
40683 y: Math.floor((childTileID.canonical.y * performance.EXTENT + symbolInstance.anchorY) * scale)
40684 };
40685 }
40686 findMatches(symbolInstances, newTileID, zoomCrossTileIDs) {
40687 const tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z);
40688 for (let i = 0; i < symbolInstances.length; i++) {
40689 const symbolInstance = symbolInstances.get(i);
40690 if (symbolInstance.crossTileID) {
40691 // already has a match, skip
40692 continue;
40693 }
40694 const indexedInstances = this.indexedSymbolInstances[symbolInstance.key];
40695 if (!indexedInstances) {
40696 // No symbol with this key in this bucket
40697 continue;
40698 }
40699 const scaledSymbolCoord = this.getScaledCoordinates(symbolInstance, newTileID);
40700 for (const thisTileSymbol of indexedInstances) {
40701 // Return any symbol with the same keys whose coordinates are within 1
40702 // grid unit. (with a 4px grid, this covers a 12px by 12px area)
40703 if (Math.abs(thisTileSymbol.coord.x - scaledSymbolCoord.x) <= tolerance &&
40704 Math.abs(thisTileSymbol.coord.y - scaledSymbolCoord.y) <= tolerance &&
40705 !zoomCrossTileIDs[thisTileSymbol.crossTileID]) {
40706 // Once we've marked ourselves duplicate against this parent symbol,
40707 // don't let any other symbols at the same zoom level duplicate against
40708 // the same parent (see issue #5993)
40709 zoomCrossTileIDs[thisTileSymbol.crossTileID] = true;
40710 symbolInstance.crossTileID = thisTileSymbol.crossTileID;
40711 break;
40712 }
40713 }
40714 }
40715 }
40716}
40717class CrossTileIDs {
40718 constructor() {
40719 this.maxCrossTileID = 0;
40720 }
40721 generate() {
40722 return ++this.maxCrossTileID;
40723 }
40724}
40725class CrossTileSymbolLayerIndex {
40726 constructor() {
40727 this.indexes = {};
40728 this.usedCrossTileIDs = {};
40729 this.lng = 0;
40730 }
40731 /*
40732 * Sometimes when a user pans across the antimeridian the longitude value gets wrapped.
40733 * To prevent labels from flashing out and in we adjust the tileID values in the indexes
40734 * so that they match the new wrapped version of the map.
40735 */
40736 handleWrapJump(lng) {
40737 const wrapDelta = Math.round((lng - this.lng) / 360);
40738 if (wrapDelta !== 0) {
40739 for (const zoom in this.indexes) {
40740 const zoomIndexes = this.indexes[zoom];
40741 const newZoomIndex = {};
40742 for (const key in zoomIndexes) {
40743 // change the tileID's wrap and add it to a new index
40744 const index = zoomIndexes[key];
40745 index.tileID = index.tileID.unwrapTo(index.tileID.wrap + wrapDelta);
40746 newZoomIndex[index.tileID.key] = index;
40747 }
40748 this.indexes[zoom] = newZoomIndex;
40749 }
40750 }
40751 this.lng = lng;
40752 }
40753 addBucket(tileID, bucket, crossTileIDs) {
40754 if (this.indexes[tileID.overscaledZ] &&
40755 this.indexes[tileID.overscaledZ][tileID.key]) {
40756 if (this.indexes[tileID.overscaledZ][tileID.key].bucketInstanceId ===
40757 bucket.bucketInstanceId) {
40758 return false;
40759 }
40760 else {
40761 // We're replacing this bucket with an updated version
40762 // Remove the old bucket's "used crossTileIDs" now so that
40763 // the new bucket can claim them.
40764 // The old index entries themselves stick around until
40765 // 'removeStaleBuckets' is called.
40766 this.removeBucketCrossTileIDs(tileID.overscaledZ, this.indexes[tileID.overscaledZ][tileID.key]);
40767 }
40768 }
40769 for (let i = 0; i < bucket.symbolInstances.length; i++) {
40770 const symbolInstance = bucket.symbolInstances.get(i);
40771 symbolInstance.crossTileID = 0;
40772 }
40773 if (!this.usedCrossTileIDs[tileID.overscaledZ]) {
40774 this.usedCrossTileIDs[tileID.overscaledZ] = {};
40775 }
40776 const zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ];
40777 for (const zoom in this.indexes) {
40778 const zoomIndexes = this.indexes[zoom];
40779 if (Number(zoom) > tileID.overscaledZ) {
40780 for (const id in zoomIndexes) {
40781 const childIndex = zoomIndexes[id];
40782 if (childIndex.tileID.isChildOf(tileID)) {
40783 childIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs);
40784 }
40785 }
40786 }
40787 else {
40788 const parentCoord = tileID.scaledTo(Number(zoom));
40789 const parentIndex = zoomIndexes[parentCoord.key];
40790 if (parentIndex) {
40791 parentIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs);
40792 }
40793 }
40794 }
40795 for (let i = 0; i < bucket.symbolInstances.length; i++) {
40796 const symbolInstance = bucket.symbolInstances.get(i);
40797 if (!symbolInstance.crossTileID) {
40798 // symbol did not match any known symbol, assign a new id
40799 symbolInstance.crossTileID = crossTileIDs.generate();
40800 zoomCrossTileIDs[symbolInstance.crossTileID] = true;
40801 }
40802 }
40803 if (this.indexes[tileID.overscaledZ] === undefined) {
40804 this.indexes[tileID.overscaledZ] = {};
40805 }
40806 this.indexes[tileID.overscaledZ][tileID.key] = new TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId);
40807 return true;
40808 }
40809 removeBucketCrossTileIDs(zoom, removedBucket) {
40810 for (const key in removedBucket.indexedSymbolInstances) {
40811 for (const symbolInstance of removedBucket.indexedSymbolInstances[key]) {
40812 delete this.usedCrossTileIDs[zoom][symbolInstance.crossTileID];
40813 }
40814 }
40815 }
40816 removeStaleBuckets(currentIDs) {
40817 let tilesChanged = false;
40818 for (const z in this.indexes) {
40819 const zoomIndexes = this.indexes[z];
40820 for (const tileKey in zoomIndexes) {
40821 if (!currentIDs[zoomIndexes[tileKey].bucketInstanceId]) {
40822 this.removeBucketCrossTileIDs(z, zoomIndexes[tileKey]);
40823 delete zoomIndexes[tileKey];
40824 tilesChanged = true;
40825 }
40826 }
40827 }
40828 return tilesChanged;
40829 }
40830}
40831class CrossTileSymbolIndex {
40832 constructor() {
40833 this.layerIndexes = {};
40834 this.crossTileIDs = new CrossTileIDs();
40835 this.maxBucketInstanceId = 0;
40836 this.bucketsInCurrentPlacement = {};
40837 }
40838 addLayer(styleLayer, tiles, lng) {
40839 let layerIndex = this.layerIndexes[styleLayer.id];
40840 if (layerIndex === undefined) {
40841 layerIndex = this.layerIndexes[styleLayer.id] = new CrossTileSymbolLayerIndex();
40842 }
40843 let symbolBucketsChanged = false;
40844 const currentBucketIDs = {};
40845 layerIndex.handleWrapJump(lng);
40846 for (const tile of tiles) {
40847 const symbolBucket = tile.getBucket(styleLayer);
40848 if (!symbolBucket || styleLayer.id !== symbolBucket.layerIds[0])
40849 continue;
40850 if (!symbolBucket.bucketInstanceId) {
40851 symbolBucket.bucketInstanceId = ++this.maxBucketInstanceId;
40852 }
40853 if (layerIndex.addBucket(tile.tileID, symbolBucket, this.crossTileIDs)) {
40854 symbolBucketsChanged = true;
40855 }
40856 currentBucketIDs[symbolBucket.bucketInstanceId] = true;
40857 }
40858 if (layerIndex.removeStaleBuckets(currentBucketIDs)) {
40859 symbolBucketsChanged = true;
40860 }
40861 return symbolBucketsChanged;
40862 }
40863 pruneUnusedLayers(usedLayers) {
40864 const usedLayerMap = {};
40865 usedLayers.forEach((usedLayer) => {
40866 usedLayerMap[usedLayer] = true;
40867 });
40868 for (const layerId in this.layerIndexes) {
40869 if (!usedLayerMap[layerId]) {
40870 delete this.layerIndexes[layerId];
40871 }
40872 }
40873 }
40874}
40875
40876// We're skipping validation errors with the `source.canvas` identifier in order
40877// to continue to allow canvas sources to be added at runtime/updated in
40878// smart setStyle (see https://github.com/mapbox/mapbox-gl-js/pull/6424):
40879const emitValidationErrors = (evented, errors) => performance.emitValidationErrors(evented, errors && errors.filter(error => error.identifier !== 'source.canvas'));
40880const supportedDiffOperations = performance.pick(operations, [
40881 'addLayer',
40882 'removeLayer',
40883 'setPaintProperty',
40884 'setLayoutProperty',
40885 'setFilter',
40886 'addSource',
40887 'removeSource',
40888 'setLayerZoomRange',
40889 'setLight',
40890 'setTransition',
40891 'setGeoJSONSourceData'
40892 // 'setGlyphs',
40893 // 'setSprite',
40894]);
40895const ignoredDiffOperations = performance.pick(operations, [
40896 'setCenter',
40897 'setZoom',
40898 'setBearing',
40899 'setPitch'
40900]);
40901const empty = emptyStyle();
40902/**
40903 * @private
40904 */
40905class Style extends performance.Evented {
40906 constructor(map, options = {}) {
40907 super();
40908 this.map = map;
40909 this.dispatcher = new Dispatcher(getGlobalWorkerPool(), this);
40910 this.imageManager = new ImageManager();
40911 this.imageManager.setEventedParent(this);
40912 this.glyphManager = new GlyphManager(map._requestManager, options.localIdeographFontFamily);
40913 this.lineAtlas = new LineAtlas(256, 512);
40914 this.crossTileSymbolIndex = new CrossTileSymbolIndex();
40915 this._layers = {};
40916 this._serializedLayers = {};
40917 this._order = [];
40918 this.sourceCaches = {};
40919 this.zoomHistory = new performance.ZoomHistory();
40920 this._loaded = false;
40921 this._availableImages = [];
40922 this._resetUpdates();
40923 this.dispatcher.broadcast('setReferrer', performance.getReferrer());
40924 const self = this;
40925 this._rtlTextPluginCallback = Style.registerForPluginStateChange((event) => {
40926 const state = {
40927 pluginStatus: event.pluginStatus,
40928 pluginURL: event.pluginURL
40929 };
40930 self.dispatcher.broadcast('syncRTLPluginState', state, (err, results) => {
40931 performance.triggerPluginCompletionEvent(err);
40932 if (results) {
40933 const allComplete = results.every((elem) => elem);
40934 if (allComplete) {
40935 for (const id in self.sourceCaches) {
40936 self.sourceCaches[id].reload(); // Should be a no-op if the plugin loads before any tiles load
40937 }
40938 }
40939 }
40940 });
40941 });
40942 this.on('data', (event) => {
40943 if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') {
40944 return;
40945 }
40946 const sourceCache = this.sourceCaches[event.sourceId];
40947 if (!sourceCache) {
40948 return;
40949 }
40950 const source = sourceCache.getSource();
40951 if (!source || !source.vectorLayerIds) {
40952 return;
40953 }
40954 for (const layerId in this._layers) {
40955 const layer = this._layers[layerId];
40956 if (layer.source === source.id) {
40957 this._validateLayer(layer);
40958 }
40959 }
40960 });
40961 }
40962 loadURL(url, options = {}) {
40963 this.fire(new performance.Event('dataloading', { dataType: 'style' }));
40964 const validate = typeof options.validate === 'boolean' ?
40965 options.validate : true;
40966 const request = this.map._requestManager.transformRequest(url, performance.ResourceType.Style);
40967 this._request = performance.getJSON(request, (error, json) => {
40968 this._request = null;
40969 if (error) {
40970 this.fire(new performance.ErrorEvent(error));
40971 }
40972 else if (json) {
40973 this._load(json, validate);
40974 }
40975 });
40976 }
40977 loadJSON(json, options = {}) {
40978 this.fire(new performance.Event('dataloading', { dataType: 'style' }));
40979 this._request = performance.exported.frame(() => {
40980 this._request = null;
40981 this._load(json, options.validate !== false);
40982 });
40983 }
40984 loadEmpty() {
40985 this.fire(new performance.Event('dataloading', { dataType: 'style' }));
40986 this._load(empty, false);
40987 }
40988 _load(json, validate) {
40989 if (validate && emitValidationErrors(this, performance.validateStyle(json))) {
40990 return;
40991 }
40992 this._loaded = true;
40993 this.stylesheet = json;
40994 for (const id in json.sources) {
40995 this.addSource(id, json.sources[id], { validate: false });
40996 }
40997 if (json.sprite) {
40998 this._loadSprite(json.sprite);
40999 }
41000 else {
41001 this.imageManager.setLoaded(true);
41002 }
41003 this.glyphManager.setURL(json.glyphs);
41004 const layers = derefLayers(this.stylesheet.layers);
41005 this._order = layers.map((layer) => layer.id);
41006 this._layers = {};
41007 this._serializedLayers = {};
41008 for (let layer of layers) {
41009 layer = performance.createStyleLayer(layer);
41010 layer.setEventedParent(this, { layer: { id: layer.id } });
41011 this._layers[layer.id] = layer;
41012 this._serializedLayers[layer.id] = layer.serialize();
41013 }
41014 this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order));
41015 this.light = new Light(this.stylesheet.light);
41016 this.fire(new performance.Event('data', { dataType: 'style' }));
41017 this.fire(new performance.Event('style.load'));
41018 }
41019 _loadSprite(url) {
41020 this._spriteRequest = loadSprite(url, this.map._requestManager, this.map.getPixelRatio(), (err, images) => {
41021 this._spriteRequest = null;
41022 if (err) {
41023 this.fire(new performance.ErrorEvent(err));
41024 }
41025 else if (images) {
41026 for (const id in images) {
41027 this.imageManager.addImage(id, images[id]);
41028 }
41029 }
41030 this.imageManager.setLoaded(true);
41031 this._availableImages = this.imageManager.listImages();
41032 this.dispatcher.broadcast('setImages', this._availableImages);
41033 this.fire(new performance.Event('data', { dataType: 'style' }));
41034 });
41035 }
41036 _validateLayer(layer) {
41037 const sourceCache = this.sourceCaches[layer.source];
41038 if (!sourceCache) {
41039 return;
41040 }
41041 const sourceLayer = layer.sourceLayer;
41042 if (!sourceLayer) {
41043 return;
41044 }
41045 const source = sourceCache.getSource();
41046 if (source.type === 'geojson' || (source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1)) {
41047 this.fire(new performance.ErrorEvent(new Error(`Source layer "${sourceLayer}" ` +
41048 `does not exist on source "${source.id}" ` +
41049 `as specified by style layer "${layer.id}".`)));
41050 }
41051 }
41052 loaded() {
41053 if (!this._loaded)
41054 return false;
41055 if (Object.keys(this._updatedSources).length)
41056 return false;
41057 for (const id in this.sourceCaches)
41058 if (!this.sourceCaches[id].loaded())
41059 return false;
41060 if (!this.imageManager.isLoaded())
41061 return false;
41062 return true;
41063 }
41064 _serializeLayers(ids) {
41065 const serializedLayers = [];
41066 for (const id of ids) {
41067 const layer = this._layers[id];
41068 if (layer.type !== 'custom') {
41069 serializedLayers.push(layer.serialize());
41070 }
41071 }
41072 return serializedLayers;
41073 }
41074 hasTransitions() {
41075 if (this.light && this.light.hasTransition()) {
41076 return true;
41077 }
41078 for (const id in this.sourceCaches) {
41079 if (this.sourceCaches[id].hasTransition()) {
41080 return true;
41081 }
41082 }
41083 for (const id in this._layers) {
41084 if (this._layers[id].hasTransition()) {
41085 return true;
41086 }
41087 }
41088 return false;
41089 }
41090 _checkLoaded() {
41091 if (!this._loaded) {
41092 throw new Error('Style is not done loading.');
41093 }
41094 }
41095 /**
41096 * Apply queued style updates in a batch and recalculate zoom-dependent paint properties.
41097 * @private
41098 */
41099 update(parameters) {
41100 if (!this._loaded) {
41101 return;
41102 }
41103 const changed = this._changed;
41104 if (this._changed) {
41105 const updatedIds = Object.keys(this._updatedLayers);
41106 const removedIds = Object.keys(this._removedLayers);
41107 if (updatedIds.length || removedIds.length) {
41108 this._updateWorkerLayers(updatedIds, removedIds);
41109 }
41110 for (const id in this._updatedSources) {
41111 const action = this._updatedSources[id];
41112 performance.assert(action === 'reload' || action === 'clear');
41113 if (action === 'reload') {
41114 this._reloadSource(id);
41115 }
41116 else if (action === 'clear') {
41117 this._clearSource(id);
41118 }
41119 }
41120 this._updateTilesForChangedImages();
41121 for (const id in this._updatedPaintProps) {
41122 this._layers[id].updateTransitions(parameters);
41123 }
41124 this.light.updateTransitions(parameters);
41125 this._resetUpdates();
41126 }
41127 const sourcesUsedBefore = {};
41128 for (const sourceId in this.sourceCaches) {
41129 const sourceCache = this.sourceCaches[sourceId];
41130 sourcesUsedBefore[sourceId] = sourceCache.used;
41131 sourceCache.used = false;
41132 }
41133 for (const layerId of this._order) {
41134 const layer = this._layers[layerId];
41135 layer.recalculate(parameters, this._availableImages);
41136 if (!layer.isHidden(parameters.zoom) && layer.source) {
41137 this.sourceCaches[layer.source].used = true;
41138 }
41139 }
41140 for (const sourceId in sourcesUsedBefore) {
41141 const sourceCache = this.sourceCaches[sourceId];
41142 if (sourcesUsedBefore[sourceId] !== sourceCache.used) {
41143 sourceCache.fire(new performance.Event('data', { sourceDataType: 'visibility', dataType: 'source', sourceId }));
41144 }
41145 }
41146 this.light.recalculate(parameters);
41147 this.z = parameters.zoom;
41148 if (changed) {
41149 this.fire(new performance.Event('data', { dataType: 'style' }));
41150 }
41151 }
41152 /*
41153 * Apply any queued image changes.
41154 */
41155 _updateTilesForChangedImages() {
41156 const changedImages = Object.keys(this._changedImages);
41157 if (changedImages.length) {
41158 for (const name in this.sourceCaches) {
41159 this.sourceCaches[name].reloadTilesForDependencies(['icons', 'patterns'], changedImages);
41160 }
41161 this._changedImages = {};
41162 }
41163 }
41164 _updateWorkerLayers(updatedIds, removedIds) {
41165 this.dispatcher.broadcast('updateLayers', {
41166 layers: this._serializeLayers(updatedIds),
41167 removedIds
41168 });
41169 }
41170 _resetUpdates() {
41171 this._changed = false;
41172 this._updatedLayers = {};
41173 this._removedLayers = {};
41174 this._updatedSources = {};
41175 this._updatedPaintProps = {};
41176 this._changedImages = {};
41177 }
41178 /**
41179 * Update this style's state to match the given style JSON, performing only
41180 * the necessary mutations.
41181 *
41182 * May throw an Error ('Unimplemented: METHOD') if the mapbox-gl-style-spec
41183 * diff algorithm produces an operation that is not supported.
41184 *
41185 * @returns {boolean} true if any changes were made; false otherwise
41186 * @private
41187 */
41188 setState(nextState) {
41189 this._checkLoaded();
41190 if (emitValidationErrors(this, performance.validateStyle(nextState)))
41191 return false;
41192 nextState = performance.clone$1(nextState);
41193 nextState.layers = derefLayers(nextState.layers);
41194 const changes = diffStyles(this.serialize(), nextState)
41195 .filter(op => !(op.command in ignoredDiffOperations));
41196 if (changes.length === 0) {
41197 return false;
41198 }
41199 const unimplementedOps = changes.filter(op => !(op.command in supportedDiffOperations));
41200 if (unimplementedOps.length > 0) {
41201 throw new Error(`Unimplemented: ${unimplementedOps.map(op => op.command).join(', ')}.`);
41202 }
41203 changes.forEach((op) => {
41204 if (op.command === 'setTransition') {
41205 // `transition` is always read directly off of
41206 // `this.stylesheet`, which we update below
41207 return;
41208 }
41209 this[op.command].apply(this, op.args);
41210 });
41211 this.stylesheet = nextState;
41212 return true;
41213 }
41214 addImage(id, image) {
41215 if (this.getImage(id)) {
41216 return this.fire(new performance.ErrorEvent(new Error(`An image named "${id}" already exists.`)));
41217 }
41218 this.imageManager.addImage(id, image);
41219 this._afterImageUpdated(id);
41220 }
41221 updateImage(id, image) {
41222 this.imageManager.updateImage(id, image);
41223 }
41224 getImage(id) {
41225 return this.imageManager.getImage(id);
41226 }
41227 removeImage(id) {
41228 if (!this.getImage(id)) {
41229 return this.fire(new performance.ErrorEvent(new Error(`An image named "${id}" does not exist.`)));
41230 }
41231 this.imageManager.removeImage(id);
41232 this._afterImageUpdated(id);
41233 }
41234 _afterImageUpdated(id) {
41235 this._availableImages = this.imageManager.listImages();
41236 this._changedImages[id] = true;
41237 this._changed = true;
41238 this.dispatcher.broadcast('setImages', this._availableImages);
41239 this.fire(new performance.Event('data', { dataType: 'style' }));
41240 }
41241 listImages() {
41242 this._checkLoaded();
41243 return this.imageManager.listImages();
41244 }
41245 addSource(id, source, options = {}) {
41246 this._checkLoaded();
41247 if (this.sourceCaches[id] !== undefined) {
41248 throw new Error(`Source "${id}" already exists.`);
41249 }
41250 if (!source.type) {
41251 throw new Error(`The type property must be defined, but only the following properties were given: ${Object.keys(source).join(', ')}.`);
41252 }
41253 const builtIns = ['vector', 'raster', 'geojson', 'video', 'image'];
41254 const shouldValidate = builtIns.indexOf(source.type) >= 0;
41255 if (shouldValidate && this._validate(performance.validateStyle.source, `sources.${id}`, source, null, options))
41256 return;
41257 if (this.map && this.map._collectResourceTiming)
41258 source.collectResourceTiming = true;
41259 const sourceCache = this.sourceCaches[id] = new SourceCache(id, source, this.dispatcher);
41260 sourceCache.style = this;
41261 sourceCache.setEventedParent(this, () => ({
41262 isSourceLoaded: this.loaded(),
41263 source: sourceCache.serialize(),
41264 sourceId: id
41265 }));
41266 sourceCache.onAdd(this.map);
41267 this._changed = true;
41268 }
41269 /**
41270 * Remove a source from this stylesheet, given its id.
41271 * @param {string} id id of the source to remove
41272 * @throws {Error} if no source is found with the given ID
41273 * @returns {Map} The {@link Map} object.
41274 */
41275 removeSource(id) {
41276 this._checkLoaded();
41277 if (this.sourceCaches[id] === undefined) {
41278 throw new Error('There is no source with this ID');
41279 }
41280 for (const layerId in this._layers) {
41281 if (this._layers[layerId].source === id) {
41282 return this.fire(new performance.ErrorEvent(new Error(`Source "${id}" cannot be removed while layer "${layerId}" is using it.`)));
41283 }
41284 }
41285 const sourceCache = this.sourceCaches[id];
41286 delete this.sourceCaches[id];
41287 delete this._updatedSources[id];
41288 sourceCache.fire(new performance.Event('data', { sourceDataType: 'metadata', dataType: 'source', sourceId: id }));
41289 sourceCache.setEventedParent(null);
41290 sourceCache.onRemove(this.map);
41291 this._changed = true;
41292 }
41293 /**
41294 * Set the data of a GeoJSON source, given its id.
41295 * @param {string} id id of the source
41296 * @param {GeoJSON|string} data GeoJSON source
41297 */
41298 setGeoJSONSourceData(id, data) {
41299 this._checkLoaded();
41300 performance.assert(this.sourceCaches[id] !== undefined, 'There is no source with this ID');
41301 const geojsonSource = this.sourceCaches[id].getSource();
41302 performance.assert(geojsonSource.type === 'geojson');
41303 geojsonSource.setData(data);
41304 this._changed = true;
41305 }
41306 /**
41307 * Get a source by id.
41308 * @param {string} id id of the desired source
41309 * @returns {Source | undefined} source
41310 */
41311 getSource(id) {
41312 return this.sourceCaches[id] && this.sourceCaches[id].getSource();
41313 }
41314 /**
41315 * Add a layer to the map style. The layer will be inserted before the layer with
41316 * ID `before`, or appended if `before` is omitted.
41317 * @param {Object | CustomLayerInterface} layerObject The style layer to add.
41318 * @param {string} [before] ID of an existing layer to insert before
41319 * @param {Object} options Style setter options.
41320 * @returns {Map} The {@link Map} object.
41321 */
41322 addLayer(layerObject, before, options = {}) {
41323 this._checkLoaded();
41324 const id = layerObject.id;
41325 if (this.getLayer(id)) {
41326 this.fire(new performance.ErrorEvent(new Error(`Layer "${id}" already exists on this map.`)));
41327 return;
41328 }
41329 let layer;
41330 if (layerObject.type === 'custom') {
41331 if (emitValidationErrors(this, performance.validateCustomStyleLayer(layerObject)))
41332 return;
41333 layer = performance.createStyleLayer(layerObject);
41334 }
41335 else {
41336 if (typeof layerObject.source === 'object') {
41337 this.addSource(id, layerObject.source);
41338 layerObject = performance.clone$1(layerObject);
41339 layerObject = performance.extend(layerObject, { source: id });
41340 }
41341 // this layer is not in the style.layers array, so we pass an impossible array index
41342 if (this._validate(performance.validateStyle.layer, `layers.${id}`, layerObject, { arrayIndex: -1 }, options))
41343 return;
41344 layer = performance.createStyleLayer(layerObject);
41345 this._validateLayer(layer);
41346 layer.setEventedParent(this, { layer: { id } });
41347 this._serializedLayers[layer.id] = layer.serialize();
41348 }
41349 const index = before ? this._order.indexOf(before) : this._order.length;
41350 if (before && index === -1) {
41351 this.fire(new performance.ErrorEvent(new Error(`Cannot add layer "${id}" before non-existing layer "${before}".`)));
41352 return;
41353 }
41354 this._order.splice(index, 0, id);
41355 this._layerOrderChanged = true;
41356 this._layers[id] = layer;
41357 if (this._removedLayers[id] && layer.source && layer.type !== 'custom') {
41358 // If, in the current batch, we have already removed this layer
41359 // and we are now re-adding it with a different `type`, then we
41360 // need to clear (rather than just reload) the underyling source's
41361 // tiles. Otherwise, tiles marked 'reloading' will have buckets /
41362 // buffers that are set up for the _previous_ version of this
41363 // layer, causing, e.g.:
41364 // https://github.com/mapbox/mapbox-gl-js/issues/3633
41365 const removed = this._removedLayers[id];
41366 delete this._removedLayers[id];
41367 if (removed.type !== layer.type) {
41368 this._updatedSources[layer.source] = 'clear';
41369 }
41370 else {
41371 this._updatedSources[layer.source] = 'reload';
41372 this.sourceCaches[layer.source].pause();
41373 }
41374 }
41375 this._updateLayer(layer);
41376 if (layer.onAdd) {
41377 layer.onAdd(this.map);
41378 }
41379 }
41380 /**
41381 * Moves a layer to a different z-position. The layer will be inserted before the layer with
41382 * ID `before`, or appended if `before` is omitted.
41383 * @param {string} id ID of the layer to move
41384 * @param {string} [before] ID of an existing layer to insert before
41385 */
41386 moveLayer(id, before) {
41387 this._checkLoaded();
41388 this._changed = true;
41389 const layer = this._layers[id];
41390 if (!layer) {
41391 this.fire(new performance.ErrorEvent(new Error(`The layer '${id}' does not exist in the map's style and cannot be moved.`)));
41392 return;
41393 }
41394 if (id === before) {
41395 return;
41396 }
41397 const index = this._order.indexOf(id);
41398 this._order.splice(index, 1);
41399 const newIndex = before ? this._order.indexOf(before) : this._order.length;
41400 if (before && newIndex === -1) {
41401 this.fire(new performance.ErrorEvent(new Error(`Cannot move layer "${id}" before non-existing layer "${before}".`)));
41402 return;
41403 }
41404 this._order.splice(newIndex, 0, id);
41405 this._layerOrderChanged = true;
41406 }
41407 /**
41408 * Remove the layer with the given id from the style.
41409 *
41410 * If no such layer exists, an `error` event is fired.
41411 *
41412 * @param {string} id id of the layer to remove
41413 * @fires error
41414 */
41415 removeLayer(id) {
41416 this._checkLoaded();
41417 const layer = this._layers[id];
41418 if (!layer) {
41419 this.fire(new performance.ErrorEvent(new Error(`Cannot remove non-existing layer "${id}".`)));
41420 return;
41421 }
41422 layer.setEventedParent(null);
41423 const index = this._order.indexOf(id);
41424 this._order.splice(index, 1);
41425 this._layerOrderChanged = true;
41426 this._changed = true;
41427 this._removedLayers[id] = layer;
41428 delete this._layers[id];
41429 delete this._serializedLayers[id];
41430 delete this._updatedLayers[id];
41431 delete this._updatedPaintProps[id];
41432 if (layer.onRemove) {
41433 layer.onRemove(this.map);
41434 }
41435 }
41436 /**
41437 * Return the style layer object with the given `id`.
41438 *
41439 * @param {string} id - id of the desired layer
41440 * @returns {?Object} a layer, if one with the given `id` exists
41441 */
41442 getLayer(id) {
41443 return this._layers[id];
41444 }
41445 /**
41446 * checks if a specific layer is present within the style.
41447 *
41448 * @param {string} id - id of the desired layer
41449 * @returns {boolean} a boolean specifying if the given layer is present
41450 */
41451 hasLayer(id) {
41452 return id in this._layers;
41453 }
41454 setLayerZoomRange(layerId, minzoom, maxzoom) {
41455 this._checkLoaded();
41456 const layer = this.getLayer(layerId);
41457 if (!layer) {
41458 this.fire(new performance.ErrorEvent(new Error(`Cannot set the zoom range of non-existing layer "${layerId}".`)));
41459 return;
41460 }
41461 if (layer.minzoom === minzoom && layer.maxzoom === maxzoom)
41462 return;
41463 if (minzoom != null) {
41464 layer.minzoom = minzoom;
41465 }
41466 if (maxzoom != null) {
41467 layer.maxzoom = maxzoom;
41468 }
41469 this._updateLayer(layer);
41470 }
41471 setFilter(layerId, filter, options = {}) {
41472 this._checkLoaded();
41473 const layer = this.getLayer(layerId);
41474 if (!layer) {
41475 this.fire(new performance.ErrorEvent(new Error(`Cannot filter non-existing layer "${layerId}".`)));
41476 return;
41477 }
41478 if (performance.deepEqual(layer.filter, filter)) {
41479 return;
41480 }
41481 if (filter === null || filter === undefined) {
41482 layer.filter = undefined;
41483 this._updateLayer(layer);
41484 return;
41485 }
41486 if (this._validate(performance.validateStyle.filter, `layers.${layer.id}.filter`, filter, null, options)) {
41487 return;
41488 }
41489 layer.filter = performance.clone$1(filter);
41490 this._updateLayer(layer);
41491 }
41492 /**
41493 * Get a layer's filter object
41494 * @param {string} layer the layer to inspect
41495 * @returns {*} the layer's filter, if any
41496 */
41497 getFilter(layer) {
41498 return performance.clone$1(this.getLayer(layer).filter);
41499 }
41500 setLayoutProperty(layerId, name, value, options = {}) {
41501 this._checkLoaded();
41502 const layer = this.getLayer(layerId);
41503 if (!layer) {
41504 this.fire(new performance.ErrorEvent(new Error(`Cannot style non-existing layer "${layerId}".`)));
41505 return;
41506 }
41507 if (performance.deepEqual(layer.getLayoutProperty(name), value))
41508 return;
41509 layer.setLayoutProperty(name, value, options);
41510 this._updateLayer(layer);
41511 }
41512 /**
41513 * Get a layout property's value from a given layer
41514 * @param {string} layerId the layer to inspect
41515 * @param {string} name the name of the layout property
41516 * @returns {*} the property value
41517 */
41518 getLayoutProperty(layerId, name) {
41519 const layer = this.getLayer(layerId);
41520 if (!layer) {
41521 this.fire(new performance.ErrorEvent(new Error(`Cannot get style of non-existing layer "${layerId}".`)));
41522 return;
41523 }
41524 return layer.getLayoutProperty(name);
41525 }
41526 setPaintProperty(layerId, name, value, options = {}) {
41527 this._checkLoaded();
41528 const layer = this.getLayer(layerId);
41529 if (!layer) {
41530 this.fire(new performance.ErrorEvent(new Error(`Cannot style non-existing layer "${layerId}".`)));
41531 return;
41532 }
41533 if (performance.deepEqual(layer.getPaintProperty(name), value))
41534 return;
41535 const requiresRelayout = layer.setPaintProperty(name, value, options);
41536 if (requiresRelayout) {
41537 this._updateLayer(layer);
41538 }
41539 this._changed = true;
41540 this._updatedPaintProps[layerId] = true;
41541 }
41542 getPaintProperty(layer, name) {
41543 return this.getLayer(layer).getPaintProperty(name);
41544 }
41545 setFeatureState(target, state) {
41546 this._checkLoaded();
41547 const sourceId = target.source;
41548 const sourceLayer = target.sourceLayer;
41549 const sourceCache = this.sourceCaches[sourceId];
41550 if (sourceCache === undefined) {
41551 this.fire(new performance.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`)));
41552 return;
41553 }
41554 const sourceType = sourceCache.getSource().type;
41555 if (sourceType === 'geojson' && sourceLayer) {
41556 this.fire(new performance.ErrorEvent(new Error('GeoJSON sources cannot have a sourceLayer parameter.')));
41557 return;
41558 }
41559 if (sourceType === 'vector' && !sourceLayer) {
41560 this.fire(new performance.ErrorEvent(new Error('The sourceLayer parameter must be provided for vector source types.')));
41561 return;
41562 }
41563 if (target.id === undefined) {
41564 this.fire(new performance.ErrorEvent(new Error('The feature id parameter must be provided.')));
41565 }
41566 sourceCache.setFeatureState(sourceLayer, target.id, state);
41567 }
41568 removeFeatureState(target, key) {
41569 this._checkLoaded();
41570 const sourceId = target.source;
41571 const sourceCache = this.sourceCaches[sourceId];
41572 if (sourceCache === undefined) {
41573 this.fire(new performance.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`)));
41574 return;
41575 }
41576 const sourceType = sourceCache.getSource().type;
41577 const sourceLayer = sourceType === 'vector' ? target.sourceLayer : undefined;
41578 if (sourceType === 'vector' && !sourceLayer) {
41579 this.fire(new performance.ErrorEvent(new Error('The sourceLayer parameter must be provided for vector source types.')));
41580 return;
41581 }
41582 if (key && (typeof target.id !== 'string' && typeof target.id !== 'number')) {
41583 this.fire(new performance.ErrorEvent(new Error('A feature id is required to remove its specific state property.')));
41584 return;
41585 }
41586 sourceCache.removeFeatureState(sourceLayer, target.id, key);
41587 }
41588 getFeatureState(target) {
41589 this._checkLoaded();
41590 const sourceId = target.source;
41591 const sourceLayer = target.sourceLayer;
41592 const sourceCache = this.sourceCaches[sourceId];
41593 if (sourceCache === undefined) {
41594 this.fire(new performance.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`)));
41595 return;
41596 }
41597 const sourceType = sourceCache.getSource().type;
41598 if (sourceType === 'vector' && !sourceLayer) {
41599 this.fire(new performance.ErrorEvent(new Error('The sourceLayer parameter must be provided for vector source types.')));
41600 return;
41601 }
41602 if (target.id === undefined) {
41603 this.fire(new performance.ErrorEvent(new Error('The feature id parameter must be provided.')));
41604 }
41605 return sourceCache.getFeatureState(sourceLayer, target.id);
41606 }
41607 getTransition() {
41608 return performance.extend({ duration: 300, delay: 0 }, this.stylesheet && this.stylesheet.transition);
41609 }
41610 serialize() {
41611 return performance.filterObject({
41612 version: this.stylesheet.version,
41613 name: this.stylesheet.name,
41614 metadata: this.stylesheet.metadata,
41615 light: this.stylesheet.light,
41616 center: this.stylesheet.center,
41617 zoom: this.stylesheet.zoom,
41618 bearing: this.stylesheet.bearing,
41619 pitch: this.stylesheet.pitch,
41620 sprite: this.stylesheet.sprite,
41621 glyphs: this.stylesheet.glyphs,
41622 transition: this.stylesheet.transition,
41623 sources: performance.mapObject(this.sourceCaches, (source) => source.serialize()),
41624 layers: this._serializeLayers(this._order)
41625 }, (value) => { return value !== undefined; });
41626 }
41627 _updateLayer(layer) {
41628 this._updatedLayers[layer.id] = true;
41629 if (layer.source && !this._updatedSources[layer.source] &&
41630 //Skip for raster layers (https://github.com/mapbox/mapbox-gl-js/issues/7865)
41631 this.sourceCaches[layer.source].getSource().type !== 'raster') {
41632 this._updatedSources[layer.source] = 'reload';
41633 this.sourceCaches[layer.source].pause();
41634 }
41635 this._changed = true;
41636 }
41637 _flattenAndSortRenderedFeatures(sourceResults) {
41638 // Feature order is complicated.
41639 // The order between features in two 2D layers is always determined by layer order.
41640 // The order between features in two 3D layers is always determined by depth.
41641 // The order between a feature in a 2D layer and a 3D layer is tricky:
41642 // Most often layer order determines the feature order in this case. If
41643 // a line layer is above a extrusion layer the line feature will be rendered
41644 // above the extrusion. If the line layer is below the extrusion layer,
41645 // it will be rendered below it.
41646 //
41647 // There is a weird case though.
41648 // You have layers in this order: extrusion_layer_a, line_layer, extrusion_layer_b
41649 // Each layer has a feature that overlaps the other features.
41650 // The feature in extrusion_layer_a is closer than the feature in extrusion_layer_b so it is rendered above.
41651 // The feature in line_layer is rendered above extrusion_layer_a.
41652 // This means that that the line_layer feature is above the extrusion_layer_b feature despite
41653 // it being in an earlier layer.
41654 const isLayer3D = layerId => this._layers[layerId].type === 'fill-extrusion';
41655 const layerIndex = {};
41656 const features3D = [];
41657 for (let l = this._order.length - 1; l >= 0; l--) {
41658 const layerId = this._order[l];
41659 if (isLayer3D(layerId)) {
41660 layerIndex[layerId] = l;
41661 for (const sourceResult of sourceResults) {
41662 const layerFeatures = sourceResult[layerId];
41663 if (layerFeatures) {
41664 for (const featureWrapper of layerFeatures) {
41665 features3D.push(featureWrapper);
41666 }
41667 }
41668 }
41669 }
41670 }
41671 features3D.sort((a, b) => {
41672 return b.intersectionZ - a.intersectionZ;
41673 });
41674 const features = [];
41675 for (let l = this._order.length - 1; l >= 0; l--) {
41676 const layerId = this._order[l];
41677 if (isLayer3D(layerId)) {
41678 // add all 3D features that are in or above the current layer
41679 for (let i = features3D.length - 1; i >= 0; i--) {
41680 const topmost3D = features3D[i].feature;
41681 if (layerIndex[topmost3D.layer.id] < l)
41682 break;
41683 features.push(topmost3D);
41684 features3D.pop();
41685 }
41686 }
41687 else {
41688 for (const sourceResult of sourceResults) {
41689 const layerFeatures = sourceResult[layerId];
41690 if (layerFeatures) {
41691 for (const featureWrapper of layerFeatures) {
41692 features.push(featureWrapper.feature);
41693 }
41694 }
41695 }
41696 }
41697 }
41698 return features;
41699 }
41700 queryRenderedFeatures(queryGeometry, params, transform) {
41701 if (params && params.filter) {
41702 this._validate(performance.validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, null, params);
41703 }
41704 const includedSources = {};
41705 if (params && params.layers) {
41706 if (!Array.isArray(params.layers)) {
41707 this.fire(new performance.ErrorEvent(new Error('parameters.layers must be an Array.')));
41708 return [];
41709 }
41710 for (const layerId of params.layers) {
41711 const layer = this._layers[layerId];
41712 if (!layer) {
41713 // this layer is not in the style.layers array
41714 this.fire(new performance.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be queried for features.`)));
41715 return [];
41716 }
41717 includedSources[layer.source] = true;
41718 }
41719 }
41720 const sourceResults = [];
41721 params.availableImages = this._availableImages;
41722 for (const id in this.sourceCaches) {
41723 if (params.layers && !includedSources[id])
41724 continue;
41725 sourceResults.push(queryRenderedFeatures(this.sourceCaches[id], this._layers, this._serializedLayers, queryGeometry, params, transform));
41726 }
41727 if (this.placement) {
41728 // If a placement has run, query against its CollisionIndex
41729 // for symbol results, and treat it as an extra source to merge
41730 sourceResults.push(queryRenderedSymbols(this._layers, this._serializedLayers, this.sourceCaches, queryGeometry, params, this.placement.collisionIndex, this.placement.retainedQueryData));
41731 }
41732 return this._flattenAndSortRenderedFeatures(sourceResults);
41733 }
41734 querySourceFeatures(sourceID, params) {
41735 if (params && params.filter) {
41736 this._validate(performance.validateStyle.filter, 'querySourceFeatures.filter', params.filter, null, params);
41737 }
41738 const sourceCache = this.sourceCaches[sourceID];
41739 return sourceCache ? querySourceFeatures(sourceCache, params) : [];
41740 }
41741 addSourceType(name, SourceType, callback) {
41742 if (Style.getSourceType(name)) {
41743 return callback(new Error(`A source type called "${name}" already exists.`));
41744 }
41745 Style.setSourceType(name, SourceType);
41746 if (!SourceType.workerSourceURL) {
41747 return callback(null, null);
41748 }
41749 this.dispatcher.broadcast('loadWorkerSource', {
41750 name,
41751 url: SourceType.workerSourceURL
41752 }, callback);
41753 }
41754 getLight() {
41755 return this.light.getLight();
41756 }
41757 setLight(lightOptions, options = {}) {
41758 this._checkLoaded();
41759 const light = this.light.getLight();
41760 let _update = false;
41761 for (const key in lightOptions) {
41762 if (!performance.deepEqual(lightOptions[key], light[key])) {
41763 _update = true;
41764 break;
41765 }
41766 }
41767 if (!_update)
41768 return;
41769 const parameters = {
41770 now: performance.exported.now(),
41771 transition: performance.extend({
41772 duration: 300,
41773 delay: 0
41774 }, this.stylesheet.transition)
41775 };
41776 this.light.setLight(lightOptions, options);
41777 this.light.updateTransitions(parameters);
41778 }
41779 _validate(validate, key, value, props, options = {}) {
41780 if (options && options.validate === false) {
41781 return false;
41782 }
41783 return emitValidationErrors(this, validate.call(performance.validateStyle, performance.extend({
41784 key,
41785 style: this.serialize(),
41786 value,
41787 styleSpec: performance.spec
41788 }, props)));
41789 }
41790 _remove() {
41791 if (this._request) {
41792 this._request.cancel();
41793 this._request = null;
41794 }
41795 if (this._spriteRequest) {
41796 this._spriteRequest.cancel();
41797 this._spriteRequest = null;
41798 }
41799 performance.evented.off('pluginStateChange', this._rtlTextPluginCallback);
41800 for (const layerId in this._layers) {
41801 const layer = this._layers[layerId];
41802 layer.setEventedParent(null);
41803 }
41804 for (const id in this.sourceCaches) {
41805 const sourceCache = this.sourceCaches[id];
41806 sourceCache.setEventedParent(null);
41807 sourceCache.onRemove(this.map);
41808 }
41809 this.imageManager.setEventedParent(null);
41810 this.setEventedParent(null);
41811 this.dispatcher.remove();
41812 }
41813 _clearSource(id) {
41814 this.sourceCaches[id].clearTiles();
41815 }
41816 _reloadSource(id) {
41817 this.sourceCaches[id].resume();
41818 this.sourceCaches[id].reload();
41819 }
41820 _updateSources(transform) {
41821 for (const id in this.sourceCaches) {
41822 this.sourceCaches[id].update(transform);
41823 }
41824 }
41825 _generateCollisionBoxes() {
41826 for (const id in this.sourceCaches) {
41827 this._reloadSource(id);
41828 }
41829 }
41830 _updatePlacement(transform, showCollisionBoxes, fadeDuration, crossSourceCollisions, forceFullPlacement = false) {
41831 let symbolBucketsChanged = false;
41832 let placementCommitted = false;
41833 const layerTiles = {};
41834 for (const layerID of this._order) {
41835 const styleLayer = this._layers[layerID];
41836 if (styleLayer.type !== 'symbol')
41837 continue;
41838 if (!layerTiles[styleLayer.source]) {
41839 const sourceCache = this.sourceCaches[styleLayer.source];
41840 layerTiles[styleLayer.source] = sourceCache.getRenderableIds(true)
41841 .map((id) => sourceCache.getTileByID(id))
41842 .sort((a, b) => (b.tileID.overscaledZ - a.tileID.overscaledZ) || (a.tileID.isLessThan(b.tileID) ? -1 : 1));
41843 }
41844 const layerBucketsChanged = this.crossTileSymbolIndex.addLayer(styleLayer, layerTiles[styleLayer.source], transform.center.lng);
41845 symbolBucketsChanged = symbolBucketsChanged || layerBucketsChanged;
41846 }
41847 this.crossTileSymbolIndex.pruneUnusedLayers(this._order);
41848 // Anything that changes our "in progress" layer and tile indices requires us
41849 // to start over. When we start over, we do a full placement instead of incremental
41850 // to prevent starvation.
41851 // We need to restart placement to keep layer indices in sync.
41852 // Also force full placement when fadeDuration === 0 to ensure that newly loaded
41853 // tiles will fully display symbols in their first frame
41854 forceFullPlacement = forceFullPlacement || this._layerOrderChanged || fadeDuration === 0;
41855 if (forceFullPlacement || !this.pauseablePlacement || (this.pauseablePlacement.isDone() && !this.placement.stillRecent(performance.exported.now(), transform.zoom))) {
41856 this.pauseablePlacement = new PauseablePlacement(transform, this._order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, this.placement);
41857 this._layerOrderChanged = false;
41858 }
41859 if (this.pauseablePlacement.isDone()) {
41860 // the last placement finished running, but the next one hasn’t
41861 // started yet because of the `stillRecent` check immediately
41862 // above, so mark it stale to ensure that we request another
41863 // render frame
41864 this.placement.setStale();
41865 }
41866 else {
41867 this.pauseablePlacement.continuePlacement(this._order, this._layers, layerTiles);
41868 if (this.pauseablePlacement.isDone()) {
41869 this.placement = this.pauseablePlacement.commit(performance.exported.now());
41870 placementCommitted = true;
41871 }
41872 if (symbolBucketsChanged) {
41873 // since the placement gets split over multiple frames it is possible
41874 // these buckets were processed before they were changed and so the
41875 // placement is already stale while it is in progress
41876 this.pauseablePlacement.placement.setStale();
41877 }
41878 }
41879 if (placementCommitted || symbolBucketsChanged) {
41880 for (const layerID of this._order) {
41881 const styleLayer = this._layers[layerID];
41882 if (styleLayer.type !== 'symbol')
41883 continue;
41884 this.placement.updateLayerOpacities(styleLayer, layerTiles[styleLayer.source]);
41885 }
41886 }
41887 // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols
41888 const needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(performance.exported.now());
41889 return needsRerender;
41890 }
41891 _releaseSymbolFadeTiles() {
41892 for (const id in this.sourceCaches) {
41893 this.sourceCaches[id].releaseSymbolFadeTiles();
41894 }
41895 }
41896 // Callbacks from web workers
41897 getImages(mapId, params, callback) {
41898 this.imageManager.getImages(params.icons, callback);
41899 // Apply queued image changes before setting the tile's dependencies so that the tile
41900 // is not reloaded unecessarily. Without this forced update the reload could happen in cases
41901 // like this one:
41902 // - icons contains "my-image"
41903 // - imageManager.getImages(...) triggers `onstyleimagemissing`
41904 // - the user adds "my-image" within the callback
41905 // - addImage adds "my-image" to this._changedImages
41906 // - the next frame triggers a reload of this tile even though it already has the latest version
41907 this._updateTilesForChangedImages();
41908 const sourceCache = this.sourceCaches[params.source];
41909 if (sourceCache) {
41910 sourceCache.setDependencies(params.tileID.key, params.type, params.icons);
41911 }
41912 }
41913 getGlyphs(mapId, params, callback) {
41914 this.glyphManager.getGlyphs(params.stacks, callback);
41915 }
41916 getResource(mapId, params, callback) {
41917 return performance.makeRequest(params, callback);
41918 }
41919}
41920Style.getSourceType = getSourceType;
41921Style.setSourceType = setSourceType;
41922Style.registerForPluginStateChange = performance.registerForPluginStateChange;
41923
41924var posAttributes = performance.createLayout([
41925 { name: 'a_pos', type: 'Int16', components: 2 }
41926]);
41927
41928// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41929var preludeFrag = '#ifdef GL_ES\nprecision mediump float;\n#else\n#if !defined(lowp)\n#define lowp\n#endif\n#if !defined(mediump)\n#define mediump\n#endif\n#if !defined(highp)\n#define highp\n#endif\n#endif';
41930
41931// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41932var preludeVert = '#ifdef GL_ES\nprecision highp float;\n#else\n#if !defined(lowp)\n#define lowp\n#endif\n#if !defined(mediump)\n#define mediump\n#endif\n#if !defined(highp)\n#define highp\n#endif\n#endif\nvec2 unpack_float(const float packedValue) {int packedIntValue=int(packedValue);int v0=packedIntValue/256;return vec2(v0,packedIntValue-v0*256);}vec2 unpack_opacity(const float packedOpacity) {int intOpacity=int(packedOpacity)/2;return vec2(float(intOpacity)/127.0,mod(packedOpacity,2.0));}vec4 decode_color(const vec2 encodedColor) {return vec4(unpack_float(encodedColor[0])/255.0,unpack_float(encodedColor[1])/255.0\n);}float unpack_mix_vec2(const vec2 packedValue,const float t) {return mix(packedValue[0],packedValue[1],t);}vec4 unpack_mix_color(const vec4 packedColors,const float t) {vec4 minColor=decode_color(vec2(packedColors[0],packedColors[1]));vec4 maxColor=decode_color(vec2(packedColors[2],packedColors[3]));return mix(minColor,maxColor,t);}vec2 get_pattern_pos(const vec2 pixel_coord_upper,const vec2 pixel_coord_lower,const vec2 pattern_size,const float tile_units_to_pixels,const vec2 pos) {vec2 offset=mod(mod(mod(pixel_coord_upper,pattern_size)*256.0,pattern_size)*256.0+pixel_coord_lower,pattern_size);return (tile_units_to_pixels*pos+offset)/pattern_size;}';
41933
41934// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41935var backgroundFrag = 'uniform vec4 u_color;uniform float u_opacity;void main() {gl_FragColor=u_color*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
41936
41937// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41938var backgroundVert = 'attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}';
41939
41940// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41941var backgroundPatternFrag = 'uniform vec2 u_pattern_tl_a;uniform vec2 u_pattern_br_a;uniform vec2 u_pattern_tl_b;uniform vec2 u_pattern_br_b;uniform vec2 u_texsize;uniform float u_mix;uniform float u_opacity;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(u_pattern_tl_a/u_texsize,u_pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(u_pattern_tl_b/u_texsize,u_pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_mix)*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
41942
41943// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41944var backgroundPatternVert = 'uniform mat4 u_matrix;uniform vec2 u_pattern_size_a;uniform vec2 u_pattern_size_b;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_scale_a;uniform float u_scale_b;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_a*u_pattern_size_a,u_tile_units_to_pixels,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_b*u_pattern_size_b,u_tile_units_to_pixels,a_pos);}';
41945
41946// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41947var circleFrag = 'varying vec3 v_data;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize mediump float radius\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize highp vec4 stroke_color\n#pragma mapbox: initialize mediump float stroke_width\n#pragma mapbox: initialize lowp float stroke_opacity\nvec2 extrude=v_data.xy;float extrude_length=length(extrude);lowp float antialiasblur=v_data.z;float antialiased_blur=-max(blur,antialiasblur);float opacity_t=smoothstep(0.0,antialiased_blur,extrude_length-1.0);float color_t=stroke_width < 0.01 ? 0.0 : smoothstep(antialiased_blur,0.0,extrude_length-radius/(radius+stroke_width));gl_FragColor=opacity_t*mix(color*opacity,stroke_color*stroke_opacity,color_t);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
41948
41949// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41950var circleVert = 'uniform mat4 u_matrix;uniform bool u_scale_with_map;uniform bool u_pitch_with_map;uniform vec2 u_extrude_scale;uniform lowp float u_device_pixel_ratio;uniform highp float u_camera_to_center_distance;attribute vec2 a_pos;varying vec3 v_data;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\nvoid main(void) {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize mediump float radius\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize highp vec4 stroke_color\n#pragma mapbox: initialize mediump float stroke_width\n#pragma mapbox: initialize lowp float stroke_opacity\nvec2 extrude=vec2(mod(a_pos,2.0)*2.0-1.0);vec2 circle_center=floor(a_pos*0.5);if (u_pitch_with_map) {vec2 corner_position=circle_center;if (u_scale_with_map) {corner_position+=extrude*(radius+stroke_width)*u_extrude_scale;} else {vec4 projected_center=u_matrix*vec4(circle_center,0,1);corner_position+=extrude*(radius+stroke_width)*u_extrude_scale*(projected_center.w/u_camera_to_center_distance);}gl_Position=u_matrix*vec4(corner_position,0,1);} else {gl_Position=u_matrix*vec4(circle_center,0,1);if (u_scale_with_map) {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*u_camera_to_center_distance;} else {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*gl_Position.w;}}lowp float antialiasblur=1.0/u_device_pixel_ratio/(radius+stroke_width);v_data=vec3(extrude.x,extrude.y,antialiasblur);}';
41951
41952// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41953var clippingMaskFrag = 'void main() {gl_FragColor=vec4(1.0);}';
41954
41955// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41956var clippingMaskVert = 'attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}';
41957
41958// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41959var heatmapFrag = 'uniform highp float u_intensity;varying vec2 v_extrude;\n#pragma mapbox: define highp float weight\n#define GAUSS_COEF 0.3989422804014327\nvoid main() {\n#pragma mapbox: initialize highp float weight\nfloat d=-0.5*3.0*3.0*dot(v_extrude,v_extrude);float val=weight*u_intensity*GAUSS_COEF*exp(d);gl_FragColor=vec4(val,1.0,1.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
41960
41961// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41962var heatmapVert = 'uniform mat4 u_matrix;uniform float u_extrude_scale;uniform float u_opacity;uniform float u_intensity;attribute vec2 a_pos;varying vec2 v_extrude;\n#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\nconst highp float ZERO=1.0/255.0/16.0;\n#define GAUSS_COEF 0.3989422804014327\nvoid main(void) {\n#pragma mapbox: initialize highp float weight\n#pragma mapbox: initialize mediump float radius\nvec2 unscaled_extrude=vec2(mod(a_pos,2.0)*2.0-1.0);float S=sqrt(-2.0*log(ZERO/weight/u_intensity/GAUSS_COEF))/3.0;v_extrude=S*unscaled_extrude;vec2 extrude=v_extrude*radius*u_extrude_scale;vec4 pos=vec4(floor(a_pos*0.5)+extrude,0,1);gl_Position=u_matrix*pos;}';
41963
41964// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41965var heatmapTextureFrag = 'uniform sampler2D u_image;uniform sampler2D u_color_ramp;uniform float u_opacity;varying vec2 v_pos;void main() {float t=texture2D(u_image,v_pos).r;vec4 color=texture2D(u_color_ramp,vec2(t,0.5));gl_FragColor=color*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(0.0);\n#endif\n}';
41966
41967// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41968var heatmapTextureVert = 'uniform mat4 u_matrix;uniform vec2 u_world;attribute vec2 a_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos*u_world,0,1);v_pos.x=a_pos.x;v_pos.y=1.0-a_pos.y;}';
41969
41970// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41971var collisionBoxFrag = 'varying float v_placed;varying float v_notUsed;void main() {float alpha=0.5;gl_FragColor=vec4(1.0,0.0,0.0,1.0)*alpha;if (v_placed > 0.5) {gl_FragColor=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {gl_FragColor*=.1;}}';
41972
41973// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41974var collisionBoxVert = 'attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);gl_Position=u_matrix*vec4(a_pos,0.0,1.0);gl_Position.xy+=(a_extrude+a_shift)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}';
41975
41976// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41977var collisionCircleFrag = 'varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}';
41978
41979// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41980var collisionCircleVert = 'attribute vec2 a_pos;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(mix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}';
41981
41982// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41983var debugFrag = 'uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}';
41984
41985// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41986var debugVert = 'attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,0,1);}';
41987
41988// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41989var fillFrag = '#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_FragColor=color*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
41990
41991// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41992var fillVert = 'attribute vec2 a_pos;uniform mat4 u_matrix;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);}';
41993
41994// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41995var fillOutlineFrag = 'varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
41996
41997// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
41998var fillOutlineVert = 'attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}';
41999
42000// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42001var fillOutlinePatternFrag = 'uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42002
42003// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42004var fillOutlinePatternVert = 'uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}';
42005
42006// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42007var fillPatternFrag = '#ifdef GL_ES\nprecision highp float;\n#endif\nuniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42008
42009// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42010var fillPatternVert = 'uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}';
42011
42012// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42013var fillExtrusionFrag = 'varying vec4 v_color;void main() {gl_FragColor=v_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42014
42015// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42016var fillExtrusionVert = 'uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec4 v_color;\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n#pragma mapbox: define highp vec4 color\nvoid main() {\n#pragma mapbox: initialize highp float base\n#pragma mapbox: initialize highp float height\n#pragma mapbox: initialize highp vec4 color\nvec3 normal=a_normal_ed.xyz;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);gl_Position=u_matrix*vec4(a_pos,t > 0.0 ? height : base,1);float colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal/16384.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}';
42017
42018// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42019var fillExtrusionPatternFrag = 'uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42020
42021// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42022var fillExtrusionPatternVert = 'uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 normal=a_normal_ed.xyz;float edgedistance=a_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);float z=t > 0.0 ? height : base;gl_Position=u_matrix*vec4(a_pos,z,1);vec2 pos=normal.x==1.0 && normal.y==0.0 && normal.z==16384.0\n? a_pos\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal/16383.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}';
42023
42024// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42025var hillshadePrepareFrag = '#ifdef GL_ES\nprecision highp float;\n#endif\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2((c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c))/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(deriv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42026
42027// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42028var hillshadePrepareVert = 'uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}';
42029
42030// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42031var hillshadeFrag = 'uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;\n#define PI 3.141592653589793\nvoid main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42032
42033// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42034var hillshadeVert = 'uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}';
42035
42036// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42037var lineFrag = 'uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42038
42039// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42040var lineVert = '\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_linesofar;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}';
42041
42042// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42043var lineGradientFrag = 'uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec2 v_uv;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,v_uv);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42044
42045// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42046var lineGradientVert = '\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_uv_x;attribute float a_split_index;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;uniform float u_image_height;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec2 v_uv;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;highp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec2(a_uv_x,a_split_index*texel_height-half_texel_height);vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}';
42047
42048// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42049var linePatternFrag = '#ifdef GL_ES\nprecision highp float;\n#endif\nuniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42050
42051// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42052var linePatternVert = '\n#define scale 0.015873016\n#define LINE_DISTANCE_SCALE 2.0\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}';
42053
42054// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42055var lineSDFFrag = 'uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42056
42057// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42058var lineSDFVert = '\n#define scale 0.015873016\n#define LINE_DISTANCE_SCALE 2.0\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}';
42059
42060// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42061var rasterFrag = 'uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(dot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42062
42063// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42064var rasterVert = 'uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}';
42065
42066// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42067var symbolIconFrag = 'uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42068
42069// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42070var symbolIconVert = 'const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0),0.0,1.0);v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));}';
42071
42072// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42073var symbolSDFFrag = '#define SDF_PX 8.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42074
42075// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42076var symbolSDFVert = 'const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}';
42077
42078// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42079var symbolTextAndIconFrag = '#define SDF_PX 8.0\n#define SDF 1.0\n#define ICON 0.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
42080
42081// This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
42082var symbolTextAndIconVert = 'const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}';
42083
42084var shaders = {
42085 prelude: compile(preludeFrag, preludeVert),
42086 background: compile(backgroundFrag, backgroundVert),
42087 backgroundPattern: compile(backgroundPatternFrag, backgroundPatternVert),
42088 circle: compile(circleFrag, circleVert),
42089 clippingMask: compile(clippingMaskFrag, clippingMaskVert),
42090 heatmap: compile(heatmapFrag, heatmapVert),
42091 heatmapTexture: compile(heatmapTextureFrag, heatmapTextureVert),
42092 collisionBox: compile(collisionBoxFrag, collisionBoxVert),
42093 collisionCircle: compile(collisionCircleFrag, collisionCircleVert),
42094 debug: compile(debugFrag, debugVert),
42095 fill: compile(fillFrag, fillVert),
42096 fillOutline: compile(fillOutlineFrag, fillOutlineVert),
42097 fillOutlinePattern: compile(fillOutlinePatternFrag, fillOutlinePatternVert),
42098 fillPattern: compile(fillPatternFrag, fillPatternVert),
42099 fillExtrusion: compile(fillExtrusionFrag, fillExtrusionVert),
42100 fillExtrusionPattern: compile(fillExtrusionPatternFrag, fillExtrusionPatternVert),
42101 hillshadePrepare: compile(hillshadePrepareFrag, hillshadePrepareVert),
42102 hillshade: compile(hillshadeFrag, hillshadeVert),
42103 line: compile(lineFrag, lineVert),
42104 lineGradient: compile(lineGradientFrag, lineGradientVert),
42105 linePattern: compile(linePatternFrag, linePatternVert),
42106 lineSDF: compile(lineSDFFrag, lineSDFVert),
42107 raster: compile(rasterFrag, rasterVert),
42108 symbolIcon: compile(symbolIconFrag, symbolIconVert),
42109 symbolSDF: compile(symbolSDFFrag, symbolSDFVert),
42110 symbolTextAndIcon: compile(symbolTextAndIconFrag, symbolTextAndIconVert)
42111};
42112// Expand #pragmas to #ifdefs.
42113function compile(fragmentSource, vertexSource) {
42114 const re = /#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g;
42115 const staticAttributes = vertexSource.match(/attribute ([\w]+) ([\w]+)/g);
42116 const fragmentUniforms = fragmentSource.match(/uniform ([\w]+) ([\w]+)([\s]*)([\w]*)/g);
42117 const vertexUniforms = vertexSource.match(/uniform ([\w]+) ([\w]+)([\s]*)([\w]*)/g);
42118 const staticUniforms = vertexUniforms ? vertexUniforms.concat(fragmentUniforms) : fragmentUniforms;
42119 const fragmentPragmas = {};
42120 fragmentSource = fragmentSource.replace(re, (match, operation, precision, type, name) => {
42121 fragmentPragmas[name] = true;
42122 if (operation === 'define') {
42123 return `
42124#ifndef HAS_UNIFORM_u_${name}
42125varying ${precision} ${type} ${name};
42126#else
42127uniform ${precision} ${type} u_${name};
42128#endif
42129`;
42130 }
42131 else /* if (operation === 'initialize') */ {
42132 return `
42133#ifdef HAS_UNIFORM_u_${name}
42134 ${precision} ${type} ${name} = u_${name};
42135#endif
42136`;
42137 }
42138 });
42139 vertexSource = vertexSource.replace(re, (match, operation, precision, type, name) => {
42140 const attrType = type === 'float' ? 'vec2' : 'vec4';
42141 const unpackType = name.match(/color/) ? 'color' : attrType;
42142 if (fragmentPragmas[name]) {
42143 if (operation === 'define') {
42144 return `
42145#ifndef HAS_UNIFORM_u_${name}
42146uniform lowp float u_${name}_t;
42147attribute ${precision} ${attrType} a_${name};
42148varying ${precision} ${type} ${name};
42149#else
42150uniform ${precision} ${type} u_${name};
42151#endif
42152`;
42153 }
42154 else /* if (operation === 'initialize') */ {
42155 if (unpackType === 'vec4') {
42156 // vec4 attributes are only used for cross-faded properties, and are not packed
42157 return `
42158#ifndef HAS_UNIFORM_u_${name}
42159 ${name} = a_${name};
42160#else
42161 ${precision} ${type} ${name} = u_${name};
42162#endif
42163`;
42164 }
42165 else {
42166 return `
42167#ifndef HAS_UNIFORM_u_${name}
42168 ${name} = unpack_mix_${unpackType}(a_${name}, u_${name}_t);
42169#else
42170 ${precision} ${type} ${name} = u_${name};
42171#endif
42172`;
42173 }
42174 }
42175 }
42176 else {
42177 if (operation === 'define') {
42178 return `
42179#ifndef HAS_UNIFORM_u_${name}
42180uniform lowp float u_${name}_t;
42181attribute ${precision} ${attrType} a_${name};
42182#else
42183uniform ${precision} ${type} u_${name};
42184#endif
42185`;
42186 }
42187 else /* if (operation === 'initialize') */ {
42188 if (unpackType === 'vec4') {
42189 // vec4 attributes are only used for cross-faded properties, and are not packed
42190 return `
42191#ifndef HAS_UNIFORM_u_${name}
42192 ${precision} ${type} ${name} = a_${name};
42193#else
42194 ${precision} ${type} ${name} = u_${name};
42195#endif
42196`;
42197 }
42198 else /* */ {
42199 return `
42200#ifndef HAS_UNIFORM_u_${name}
42201 ${precision} ${type} ${name} = unpack_mix_${unpackType}(a_${name}, u_${name}_t);
42202#else
42203 ${precision} ${type} ${name} = u_${name};
42204#endif
42205`;
42206 }
42207 }
42208 }
42209 });
42210 return { fragmentSource, vertexSource, staticAttributes, staticUniforms };
42211}
42212
42213class VertexArrayObject {
42214 constructor() {
42215 this.boundProgram = null;
42216 this.boundLayoutVertexBuffer = null;
42217 this.boundPaintVertexBuffers = [];
42218 this.boundIndexBuffer = null;
42219 this.boundVertexOffset = null;
42220 this.boundDynamicVertexBuffer = null;
42221 this.vao = null;
42222 }
42223 bind(context, program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2) {
42224 this.context = context;
42225 let paintBuffersDiffer = this.boundPaintVertexBuffers.length !== paintVertexBuffers.length;
42226 for (let i = 0; !paintBuffersDiffer && i < paintVertexBuffers.length; i++) {
42227 if (this.boundPaintVertexBuffers[i] !== paintVertexBuffers[i]) {
42228 paintBuffersDiffer = true;
42229 }
42230 }
42231 const isFreshBindRequired = (!this.vao ||
42232 this.boundProgram !== program ||
42233 this.boundLayoutVertexBuffer !== layoutVertexBuffer ||
42234 paintBuffersDiffer ||
42235 this.boundIndexBuffer !== indexBuffer ||
42236 this.boundVertexOffset !== vertexOffset ||
42237 this.boundDynamicVertexBuffer !== dynamicVertexBuffer ||
42238 this.boundDynamicVertexBuffer2 !== dynamicVertexBuffer2);
42239 if (!context.extVertexArrayObject || isFreshBindRequired) {
42240 this.freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2);
42241 }
42242 else {
42243 context.bindVertexArrayOES.set(this.vao);
42244 if (dynamicVertexBuffer) {
42245 // The buffer may have been updated. Rebind to upload data.
42246 dynamicVertexBuffer.bind();
42247 }
42248 if (indexBuffer && indexBuffer.dynamicDraw) {
42249 indexBuffer.bind();
42250 }
42251 if (dynamicVertexBuffer2) {
42252 dynamicVertexBuffer2.bind();
42253 }
42254 }
42255 }
42256 freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2) {
42257 let numPrevAttributes;
42258 const numNextAttributes = program.numAttributes;
42259 const context = this.context;
42260 const gl = context.gl;
42261 if (context.extVertexArrayObject) {
42262 if (this.vao)
42263 this.destroy();
42264 this.vao = context.extVertexArrayObject.createVertexArrayOES();
42265 context.bindVertexArrayOES.set(this.vao);
42266 numPrevAttributes = 0;
42267 // store the arguments so that we can verify them when the vao is bound again
42268 this.boundProgram = program;
42269 this.boundLayoutVertexBuffer = layoutVertexBuffer;
42270 this.boundPaintVertexBuffers = paintVertexBuffers;
42271 this.boundIndexBuffer = indexBuffer;
42272 this.boundVertexOffset = vertexOffset;
42273 this.boundDynamicVertexBuffer = dynamicVertexBuffer;
42274 this.boundDynamicVertexBuffer2 = dynamicVertexBuffer2;
42275 }
42276 else {
42277 numPrevAttributes = context.currentNumAttributes || 0;
42278 // Disable all attributes from the previous program that aren't used in
42279 // the new program. Note: attribute indices are *not* program specific!
42280 for (let i = numNextAttributes; i < numPrevAttributes; i++) {
42281 // WebGL breaks if you disable attribute 0.
42282 // http://stackoverflow.com/questions/20305231
42283 performance.assert(i !== 0);
42284 gl.disableVertexAttribArray(i);
42285 }
42286 }
42287 layoutVertexBuffer.enableAttributes(gl, program);
42288 for (const vertexBuffer of paintVertexBuffers) {
42289 vertexBuffer.enableAttributes(gl, program);
42290 }
42291 if (dynamicVertexBuffer) {
42292 dynamicVertexBuffer.enableAttributes(gl, program);
42293 }
42294 if (dynamicVertexBuffer2) {
42295 dynamicVertexBuffer2.enableAttributes(gl, program);
42296 }
42297 layoutVertexBuffer.bind();
42298 layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset);
42299 for (const vertexBuffer of paintVertexBuffers) {
42300 vertexBuffer.bind();
42301 vertexBuffer.setVertexAttribPointers(gl, program, vertexOffset);
42302 }
42303 if (dynamicVertexBuffer) {
42304 dynamicVertexBuffer.bind();
42305 dynamicVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset);
42306 }
42307 if (indexBuffer) {
42308 indexBuffer.bind();
42309 }
42310 if (dynamicVertexBuffer2) {
42311 dynamicVertexBuffer2.bind();
42312 dynamicVertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset);
42313 }
42314 context.currentNumAttributes = numNextAttributes;
42315 }
42316 destroy() {
42317 if (this.vao) {
42318 this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao);
42319 this.vao = null;
42320 }
42321 }
42322}
42323
42324function getTokenizedAttributesAndUniforms(array) {
42325 const result = [];
42326 for (let i = 0; i < array.length; i++) {
42327 if (array[i] === null)
42328 continue;
42329 const token = array[i].split(' ');
42330 result.push(token.pop());
42331 }
42332 return result;
42333}
42334class Program {
42335 constructor(context, name, source, configuration, fixedUniforms, showOverdrawInspector) {
42336 const gl = context.gl;
42337 this.program = gl.createProgram();
42338 const staticAttrInfo = getTokenizedAttributesAndUniforms(source.staticAttributes);
42339 const dynamicAttrInfo = configuration ? configuration.getBinderAttributes() : [];
42340 const allAttrInfo = staticAttrInfo.concat(dynamicAttrInfo);
42341 const staticUniformsInfo = source.staticUniforms ? getTokenizedAttributesAndUniforms(source.staticUniforms) : [];
42342 const dynamicUniformsInfo = configuration ? configuration.getBinderUniforms() : [];
42343 // remove duplicate uniforms
42344 const uniformList = staticUniformsInfo.concat(dynamicUniformsInfo);
42345 const allUniformsInfo = [];
42346 for (const uniform of uniformList) {
42347 if (allUniformsInfo.indexOf(uniform) < 0)
42348 allUniformsInfo.push(uniform);
42349 }
42350 const defines = configuration ? configuration.defines() : [];
42351 if (showOverdrawInspector) {
42352 defines.push('#define OVERDRAW_INSPECTOR;');
42353 }
42354 const fragmentSource = defines.concat(shaders.prelude.fragmentSource, source.fragmentSource).join('\n');
42355 const vertexSource = defines.concat(shaders.prelude.vertexSource, source.vertexSource).join('\n');
42356 const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
42357 if (gl.isContextLost()) {
42358 this.failedToCreate = true;
42359 return;
42360 }
42361 gl.shaderSource(fragmentShader, fragmentSource);
42362 gl.compileShader(fragmentShader);
42363 performance.assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(fragmentShader));
42364 gl.attachShader(this.program, fragmentShader);
42365 const vertexShader = gl.createShader(gl.VERTEX_SHADER);
42366 if (gl.isContextLost()) {
42367 this.failedToCreate = true;
42368 return;
42369 }
42370 gl.shaderSource(vertexShader, vertexSource);
42371 gl.compileShader(vertexShader);
42372 performance.assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(vertexShader));
42373 gl.attachShader(this.program, vertexShader);
42374 this.attributes = {};
42375 const uniformLocations = {};
42376 this.numAttributes = allAttrInfo.length;
42377 for (let i = 0; i < this.numAttributes; i++) {
42378 if (allAttrInfo[i]) {
42379 gl.bindAttribLocation(this.program, i, allAttrInfo[i]);
42380 this.attributes[allAttrInfo[i]] = i;
42381 }
42382 }
42383 gl.linkProgram(this.program);
42384 performance.assert(gl.getProgramParameter(this.program, gl.LINK_STATUS), gl.getProgramInfoLog(this.program));
42385 gl.deleteShader(vertexShader);
42386 gl.deleteShader(fragmentShader);
42387 for (let it = 0; it < allUniformsInfo.length; it++) {
42388 const uniform = allUniformsInfo[it];
42389 if (uniform && !uniformLocations[uniform]) {
42390 const uniformLocation = gl.getUniformLocation(this.program, uniform);
42391 if (uniformLocation) {
42392 uniformLocations[uniform] = uniformLocation;
42393 }
42394 }
42395 }
42396 this.fixedUniforms = fixedUniforms(context, uniformLocations);
42397 this.binderUniforms = configuration ? configuration.getUniforms(context, uniformLocations) : [];
42398 }
42399 draw(context, drawMode, depthMode, stencilMode, colorMode, cullFaceMode, uniformValues, layerID, layoutVertexBuffer, indexBuffer, segments, currentProperties, zoom, configuration, dynamicLayoutBuffer, dynamicLayoutBuffer2) {
42400 const gl = context.gl;
42401 if (this.failedToCreate)
42402 return;
42403 context.program.set(this.program);
42404 context.setDepthMode(depthMode);
42405 context.setStencilMode(stencilMode);
42406 context.setColorMode(colorMode);
42407 context.setCullFace(cullFaceMode);
42408 for (const name in this.fixedUniforms) {
42409 this.fixedUniforms[name].set(uniformValues[name]);
42410 }
42411 if (configuration) {
42412 configuration.setUniforms(context, this.binderUniforms, currentProperties, { zoom: zoom });
42413 }
42414 const primitiveSize = {
42415 [gl.LINES]: 2,
42416 [gl.TRIANGLES]: 3,
42417 [gl.LINE_STRIP]: 1
42418 }[drawMode];
42419 for (const segment of segments.get()) {
42420 const vaos = segment.vaos || (segment.vaos = {});
42421 const vao = vaos[layerID] || (vaos[layerID] = new VertexArrayObject());
42422 vao.bind(context, this, layoutVertexBuffer, configuration ? configuration.getPaintVertexBuffers() : [], indexBuffer, segment.vertexOffset, dynamicLayoutBuffer, dynamicLayoutBuffer2);
42423 gl.drawElements(drawMode, segment.primitiveLength * primitiveSize, gl.UNSIGNED_SHORT, segment.primitiveOffset * primitiveSize * 2);
42424 }
42425 }
42426}
42427
42428function patternUniformValues(crossfade, painter, tile) {
42429 const tileRatio = 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom);
42430 const numTiles = Math.pow(2, tile.tileID.overscaledZ);
42431 const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles;
42432 const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles);
42433 const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y;
42434 return {
42435 'u_image': 0,
42436 'u_texsize': tile.imageAtlasTexture.size,
42437 'u_scale': [tileRatio, crossfade.fromScale, crossfade.toScale],
42438 'u_fade': crossfade.t,
42439 // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.
42440 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16],
42441 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF]
42442 };
42443}
42444function bgPatternUniformValues(image, crossfade, painter, tile) {
42445 const imagePosA = painter.imageManager.getPattern(image.from.toString());
42446 const imagePosB = painter.imageManager.getPattern(image.to.toString());
42447 performance.assert(imagePosA && imagePosB);
42448 const { width, height } = painter.imageManager.getPixelSize();
42449 const numTiles = Math.pow(2, tile.tileID.overscaledZ);
42450 const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles;
42451 const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles);
42452 const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y;
42453 return {
42454 'u_image': 0,
42455 'u_pattern_tl_a': imagePosA.tl,
42456 'u_pattern_br_a': imagePosA.br,
42457 'u_pattern_tl_b': imagePosB.tl,
42458 'u_pattern_br_b': imagePosB.br,
42459 'u_texsize': [width, height],
42460 'u_mix': crossfade.t,
42461 'u_pattern_size_a': imagePosA.displaySize,
42462 'u_pattern_size_b': imagePosB.displaySize,
42463 'u_scale_a': crossfade.fromScale,
42464 'u_scale_b': crossfade.toScale,
42465 'u_tile_units_to_pixels': 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom),
42466 // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.
42467 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16],
42468 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF]
42469 };
42470}
42471
42472const fillExtrusionUniforms = (context, locations) => ({
42473 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42474 'u_lightpos': new performance.Uniform3f(context, locations.u_lightpos),
42475 'u_lightintensity': new performance.Uniform1f(context, locations.u_lightintensity),
42476 'u_lightcolor': new performance.Uniform3f(context, locations.u_lightcolor),
42477 'u_vertical_gradient': new performance.Uniform1f(context, locations.u_vertical_gradient),
42478 'u_opacity': new performance.Uniform1f(context, locations.u_opacity)
42479});
42480const fillExtrusionPatternUniforms = (context, locations) => ({
42481 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42482 'u_lightpos': new performance.Uniform3f(context, locations.u_lightpos),
42483 'u_lightintensity': new performance.Uniform1f(context, locations.u_lightintensity),
42484 'u_lightcolor': new performance.Uniform3f(context, locations.u_lightcolor),
42485 'u_vertical_gradient': new performance.Uniform1f(context, locations.u_vertical_gradient),
42486 'u_height_factor': new performance.Uniform1f(context, locations.u_height_factor),
42487 // pattern uniforms
42488 'u_image': new performance.Uniform1i(context, locations.u_image),
42489 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
42490 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper),
42491 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower),
42492 'u_scale': new performance.Uniform3f(context, locations.u_scale),
42493 'u_fade': new performance.Uniform1f(context, locations.u_fade),
42494 'u_opacity': new performance.Uniform1f(context, locations.u_opacity)
42495});
42496const fillExtrusionUniformValues = (matrix, painter, shouldUseVerticalGradient, opacity) => {
42497 const light = painter.style.light;
42498 const _lp = light.properties.get('position');
42499 const lightPos = [_lp.x, _lp.y, _lp.z];
42500 const lightMat = performance.create$1();
42501 if (light.properties.get('anchor') === 'viewport') {
42502 performance.fromRotation(lightMat, -painter.transform.angle);
42503 }
42504 performance.transformMat3(lightPos, lightPos, lightMat);
42505 const lightColor = light.properties.get('color');
42506 return {
42507 'u_matrix': matrix,
42508 'u_lightpos': lightPos,
42509 'u_lightintensity': light.properties.get('intensity'),
42510 'u_lightcolor': [lightColor.r, lightColor.g, lightColor.b],
42511 'u_vertical_gradient': +shouldUseVerticalGradient,
42512 'u_opacity': opacity
42513 };
42514};
42515const fillExtrusionPatternUniformValues = (matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile) => {
42516 return performance.extend(fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity), patternUniformValues(crossfade, painter, tile), {
42517 'u_height_factor': -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8
42518 });
42519};
42520
42521const fillUniforms = (context, locations) => ({
42522 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix)
42523});
42524const fillPatternUniforms = (context, locations) => ({
42525 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42526 'u_image': new performance.Uniform1i(context, locations.u_image),
42527 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
42528 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper),
42529 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower),
42530 'u_scale': new performance.Uniform3f(context, locations.u_scale),
42531 'u_fade': new performance.Uniform1f(context, locations.u_fade)
42532});
42533const fillOutlineUniforms = (context, locations) => ({
42534 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42535 'u_world': new performance.Uniform2f(context, locations.u_world)
42536});
42537const fillOutlinePatternUniforms = (context, locations) => ({
42538 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42539 'u_world': new performance.Uniform2f(context, locations.u_world),
42540 'u_image': new performance.Uniform1i(context, locations.u_image),
42541 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
42542 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper),
42543 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower),
42544 'u_scale': new performance.Uniform3f(context, locations.u_scale),
42545 'u_fade': new performance.Uniform1f(context, locations.u_fade)
42546});
42547const fillUniformValues = (matrix) => ({
42548 'u_matrix': matrix
42549});
42550const fillPatternUniformValues = (matrix, painter, crossfade, tile) => performance.extend(fillUniformValues(matrix), patternUniformValues(crossfade, painter, tile));
42551const fillOutlineUniformValues = (matrix, drawingBufferSize) => ({
42552 'u_matrix': matrix,
42553 'u_world': drawingBufferSize
42554});
42555const fillOutlinePatternUniformValues = (matrix, painter, crossfade, tile, drawingBufferSize) => performance.extend(fillPatternUniformValues(matrix, painter, crossfade, tile), {
42556 'u_world': drawingBufferSize
42557});
42558
42559const circleUniforms = (context, locations) => ({
42560 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
42561 'u_scale_with_map': new performance.Uniform1i(context, locations.u_scale_with_map),
42562 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map),
42563 'u_extrude_scale': new performance.Uniform2f(context, locations.u_extrude_scale),
42564 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
42565 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix)
42566});
42567const circleUniformValues = (painter, coord, tile, layer) => {
42568 const transform = painter.transform;
42569 let pitchWithMap, extrudeScale;
42570 if (layer.paint.get('circle-pitch-alignment') === 'map') {
42571 const pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom);
42572 pitchWithMap = true;
42573 extrudeScale = [pixelRatio, pixelRatio];
42574 }
42575 else {
42576 pitchWithMap = false;
42577 extrudeScale = transform.pixelsToGLUnits;
42578 }
42579 return {
42580 'u_camera_to_center_distance': transform.cameraToCenterDistance,
42581 'u_scale_with_map': +(layer.paint.get('circle-pitch-scale') === 'map'),
42582 'u_matrix': painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('circle-translate'), layer.paint.get('circle-translate-anchor')),
42583 'u_pitch_with_map': +(pitchWithMap),
42584 'u_device_pixel_ratio': painter.pixelRatio,
42585 'u_extrude_scale': extrudeScale
42586 };
42587};
42588
42589const collisionUniforms = (context, locations) => ({
42590 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42591 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
42592 'u_pixels_to_tile_units': new performance.Uniform1f(context, locations.u_pixels_to_tile_units),
42593 'u_extrude_scale': new performance.Uniform2f(context, locations.u_extrude_scale),
42594 'u_overscale_factor': new performance.Uniform1f(context, locations.u_overscale_factor)
42595});
42596const collisionCircleUniforms = (context, locations) => ({
42597 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42598 'u_inv_matrix': new performance.UniformMatrix4f(context, locations.u_inv_matrix),
42599 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
42600 'u_viewport_size': new performance.Uniform2f(context, locations.u_viewport_size)
42601});
42602const collisionUniformValues = (matrix, transform, tile) => {
42603 const pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom);
42604 const scale = Math.pow(2, transform.zoom - tile.tileID.overscaledZ);
42605 const overscaleFactor = tile.tileID.overscaleFactor();
42606 return {
42607 'u_matrix': matrix,
42608 'u_camera_to_center_distance': transform.cameraToCenterDistance,
42609 'u_pixels_to_tile_units': pixelRatio,
42610 'u_extrude_scale': [transform.pixelsToGLUnits[0] / (pixelRatio * scale),
42611 transform.pixelsToGLUnits[1] / (pixelRatio * scale)],
42612 'u_overscale_factor': overscaleFactor
42613 };
42614};
42615const collisionCircleUniformValues = (matrix, invMatrix, transform) => {
42616 return {
42617 'u_matrix': matrix,
42618 'u_inv_matrix': invMatrix,
42619 'u_camera_to_center_distance': transform.cameraToCenterDistance,
42620 'u_viewport_size': [transform.width, transform.height]
42621 };
42622};
42623
42624const debugUniforms = (context, locations) => ({
42625 'u_color': new performance.UniformColor(context, locations.u_color),
42626 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42627 'u_overlay': new performance.Uniform1i(context, locations.u_overlay),
42628 'u_overlay_scale': new performance.Uniform1f(context, locations.u_overlay_scale)
42629});
42630const debugUniformValues = (matrix, color, scaleRatio = 1) => ({
42631 'u_matrix': matrix,
42632 'u_color': color,
42633 'u_overlay': 0,
42634 'u_overlay_scale': scaleRatio
42635});
42636
42637const clippingMaskUniforms = (context, locations) => ({
42638 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix)
42639});
42640const clippingMaskUniformValues = (matrix) => ({
42641 'u_matrix': matrix
42642});
42643
42644const heatmapUniforms = (context, locations) => ({
42645 'u_extrude_scale': new performance.Uniform1f(context, locations.u_extrude_scale),
42646 'u_intensity': new performance.Uniform1f(context, locations.u_intensity),
42647 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix)
42648});
42649const heatmapTextureUniforms = (context, locations) => ({
42650 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42651 'u_world': new performance.Uniform2f(context, locations.u_world),
42652 'u_image': new performance.Uniform1i(context, locations.u_image),
42653 'u_color_ramp': new performance.Uniform1i(context, locations.u_color_ramp),
42654 'u_opacity': new performance.Uniform1f(context, locations.u_opacity)
42655});
42656const heatmapUniformValues = (matrix, tile, zoom, intensity) => ({
42657 'u_matrix': matrix,
42658 'u_extrude_scale': pixelsToTileUnits(tile, 1, zoom),
42659 'u_intensity': intensity
42660});
42661const heatmapTextureUniformValues = (painter, layer, textureUnit, colorRampUnit) => {
42662 const matrix = performance.create();
42663 performance.ortho(matrix, 0, painter.width, painter.height, 0, 0, 1);
42664 const gl = painter.context.gl;
42665 return {
42666 'u_matrix': matrix,
42667 'u_world': [gl.drawingBufferWidth, gl.drawingBufferHeight],
42668 'u_image': textureUnit,
42669 'u_color_ramp': colorRampUnit,
42670 'u_opacity': layer.paint.get('heatmap-opacity')
42671 };
42672};
42673
42674const hillshadeUniforms = (context, locations) => ({
42675 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42676 'u_image': new performance.Uniform1i(context, locations.u_image),
42677 'u_latrange': new performance.Uniform2f(context, locations.u_latrange),
42678 'u_light': new performance.Uniform2f(context, locations.u_light),
42679 'u_shadow': new performance.UniformColor(context, locations.u_shadow),
42680 'u_highlight': new performance.UniformColor(context, locations.u_highlight),
42681 'u_accent': new performance.UniformColor(context, locations.u_accent)
42682});
42683const hillshadePrepareUniforms = (context, locations) => ({
42684 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42685 'u_image': new performance.Uniform1i(context, locations.u_image),
42686 'u_dimension': new performance.Uniform2f(context, locations.u_dimension),
42687 'u_zoom': new performance.Uniform1f(context, locations.u_zoom),
42688 'u_unpack': new performance.Uniform4f(context, locations.u_unpack)
42689});
42690const hillshadeUniformValues = (painter, tile, layer) => {
42691 const shadow = layer.paint.get('hillshade-shadow-color');
42692 const highlight = layer.paint.get('hillshade-highlight-color');
42693 const accent = layer.paint.get('hillshade-accent-color');
42694 let azimuthal = layer.paint.get('hillshade-illumination-direction') * (Math.PI / 180);
42695 // modify azimuthal angle by map rotation if light is anchored at the viewport
42696 if (layer.paint.get('hillshade-illumination-anchor') === 'viewport') {
42697 azimuthal -= painter.transform.angle;
42698 }
42699 const align = !painter.options.moving;
42700 return {
42701 'u_matrix': painter.transform.calculatePosMatrix(tile.tileID.toUnwrapped(), align),
42702 'u_image': 0,
42703 'u_latrange': getTileLatRange(painter, tile.tileID),
42704 'u_light': [layer.paint.get('hillshade-exaggeration'), azimuthal],
42705 'u_shadow': shadow,
42706 'u_highlight': highlight,
42707 'u_accent': accent
42708 };
42709};
42710const hillshadeUniformPrepareValues = (tileID, dem) => {
42711 const stride = dem.stride;
42712 const matrix = performance.create();
42713 // Flip rendering at y axis.
42714 performance.ortho(matrix, 0, performance.EXTENT, -performance.EXTENT, 0, 0, 1);
42715 performance.translate(matrix, matrix, [0, -performance.EXTENT, 0]);
42716 return {
42717 'u_matrix': matrix,
42718 'u_image': 1,
42719 'u_dimension': [stride, stride],
42720 'u_zoom': tileID.overscaledZ,
42721 'u_unpack': dem.getUnpackVector()
42722 };
42723};
42724function getTileLatRange(painter, tileID) {
42725 // for scaling the magnitude of a points slope by its latitude
42726 const tilesAtZoom = Math.pow(2, tileID.canonical.z);
42727 const y = tileID.canonical.y;
42728 return [
42729 new performance.MercatorCoordinate(0, y / tilesAtZoom).toLngLat().lat,
42730 new performance.MercatorCoordinate(0, (y + 1) / tilesAtZoom).toLngLat().lat
42731 ];
42732}
42733
42734const lineUniforms = (context, locations) => ({
42735 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42736 'u_ratio': new performance.Uniform1f(context, locations.u_ratio),
42737 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
42738 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels)
42739});
42740const lineGradientUniforms = (context, locations) => ({
42741 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42742 'u_ratio': new performance.Uniform1f(context, locations.u_ratio),
42743 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
42744 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels),
42745 'u_image': new performance.Uniform1i(context, locations.u_image),
42746 'u_image_height': new performance.Uniform1f(context, locations.u_image_height)
42747});
42748const linePatternUniforms = (context, locations) => ({
42749 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42750 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
42751 'u_ratio': new performance.Uniform1f(context, locations.u_ratio),
42752 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
42753 'u_image': new performance.Uniform1i(context, locations.u_image),
42754 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels),
42755 'u_scale': new performance.Uniform3f(context, locations.u_scale),
42756 'u_fade': new performance.Uniform1f(context, locations.u_fade)
42757});
42758const lineSDFUniforms = (context, locations) => ({
42759 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42760 'u_ratio': new performance.Uniform1f(context, locations.u_ratio),
42761 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
42762 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels),
42763 'u_patternscale_a': new performance.Uniform2f(context, locations.u_patternscale_a),
42764 'u_patternscale_b': new performance.Uniform2f(context, locations.u_patternscale_b),
42765 'u_sdfgamma': new performance.Uniform1f(context, locations.u_sdfgamma),
42766 'u_image': new performance.Uniform1i(context, locations.u_image),
42767 'u_tex_y_a': new performance.Uniform1f(context, locations.u_tex_y_a),
42768 'u_tex_y_b': new performance.Uniform1f(context, locations.u_tex_y_b),
42769 'u_mix': new performance.Uniform1f(context, locations.u_mix)
42770});
42771const lineUniformValues = (painter, tile, layer) => {
42772 const transform = painter.transform;
42773 return {
42774 'u_matrix': calculateMatrix(painter, tile, layer),
42775 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom),
42776 'u_device_pixel_ratio': painter.pixelRatio,
42777 'u_units_to_pixels': [
42778 1 / transform.pixelsToGLUnits[0],
42779 1 / transform.pixelsToGLUnits[1]
42780 ]
42781 };
42782};
42783const lineGradientUniformValues = (painter, tile, layer, imageHeight) => {
42784 return performance.extend(lineUniformValues(painter, tile, layer), {
42785 'u_image': 0,
42786 'u_image_height': imageHeight,
42787 });
42788};
42789const linePatternUniformValues = (painter, tile, layer, crossfade) => {
42790 const transform = painter.transform;
42791 const tileZoomRatio = calculateTileRatio(tile, transform);
42792 return {
42793 'u_matrix': calculateMatrix(painter, tile, layer),
42794 'u_texsize': tile.imageAtlasTexture.size,
42795 // camera zoom ratio
42796 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom),
42797 'u_device_pixel_ratio': painter.pixelRatio,
42798 'u_image': 0,
42799 'u_scale': [tileZoomRatio, crossfade.fromScale, crossfade.toScale],
42800 'u_fade': crossfade.t,
42801 'u_units_to_pixels': [
42802 1 / transform.pixelsToGLUnits[0],
42803 1 / transform.pixelsToGLUnits[1]
42804 ]
42805 };
42806};
42807const lineSDFUniformValues = (painter, tile, layer, dasharray, crossfade) => {
42808 const transform = painter.transform;
42809 const lineAtlas = painter.lineAtlas;
42810 const tileRatio = calculateTileRatio(tile, transform);
42811 const round = layer.layout.get('line-cap') === 'round';
42812 const posA = lineAtlas.getDash(dasharray.from, round);
42813 const posB = lineAtlas.getDash(dasharray.to, round);
42814 const widthA = posA.width * crossfade.fromScale;
42815 const widthB = posB.width * crossfade.toScale;
42816 return performance.extend(lineUniformValues(painter, tile, layer), {
42817 'u_patternscale_a': [tileRatio / widthA, -posA.height / 2],
42818 'u_patternscale_b': [tileRatio / widthB, -posB.height / 2],
42819 'u_sdfgamma': lineAtlas.width / (Math.min(widthA, widthB) * 256 * painter.pixelRatio) / 2,
42820 'u_image': 0,
42821 'u_tex_y_a': posA.y,
42822 'u_tex_y_b': posB.y,
42823 'u_mix': crossfade.t
42824 });
42825};
42826function calculateTileRatio(tile, transform) {
42827 return 1 / pixelsToTileUnits(tile, 1, transform.tileZoom);
42828}
42829function calculateMatrix(painter, tile, layer) {
42830 return painter.translatePosMatrix(tile.tileID.posMatrix, tile, layer.paint.get('line-translate'), layer.paint.get('line-translate-anchor'));
42831}
42832
42833const rasterUniforms = (context, locations) => ({
42834 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42835 'u_tl_parent': new performance.Uniform2f(context, locations.u_tl_parent),
42836 'u_scale_parent': new performance.Uniform1f(context, locations.u_scale_parent),
42837 'u_buffer_scale': new performance.Uniform1f(context, locations.u_buffer_scale),
42838 'u_fade_t': new performance.Uniform1f(context, locations.u_fade_t),
42839 'u_opacity': new performance.Uniform1f(context, locations.u_opacity),
42840 'u_image0': new performance.Uniform1i(context, locations.u_image0),
42841 'u_image1': new performance.Uniform1i(context, locations.u_image1),
42842 'u_brightness_low': new performance.Uniform1f(context, locations.u_brightness_low),
42843 'u_brightness_high': new performance.Uniform1f(context, locations.u_brightness_high),
42844 'u_saturation_factor': new performance.Uniform1f(context, locations.u_saturation_factor),
42845 'u_contrast_factor': new performance.Uniform1f(context, locations.u_contrast_factor),
42846 'u_spin_weights': new performance.Uniform3f(context, locations.u_spin_weights)
42847});
42848const rasterUniformValues = (matrix, parentTL, parentScaleBy, fade, layer) => ({
42849 'u_matrix': matrix,
42850 'u_tl_parent': parentTL,
42851 'u_scale_parent': parentScaleBy,
42852 'u_buffer_scale': 1,
42853 'u_fade_t': fade.mix,
42854 'u_opacity': fade.opacity * layer.paint.get('raster-opacity'),
42855 'u_image0': 0,
42856 'u_image1': 1,
42857 'u_brightness_low': layer.paint.get('raster-brightness-min'),
42858 'u_brightness_high': layer.paint.get('raster-brightness-max'),
42859 'u_saturation_factor': saturationFactor(layer.paint.get('raster-saturation')),
42860 'u_contrast_factor': contrastFactor(layer.paint.get('raster-contrast')),
42861 'u_spin_weights': spinWeights(layer.paint.get('raster-hue-rotate'))
42862});
42863function spinWeights(angle) {
42864 angle *= Math.PI / 180;
42865 const s = Math.sin(angle);
42866 const c = Math.cos(angle);
42867 return [
42868 (2 * c + 1) / 3,
42869 (-Math.sqrt(3) * s - c + 1) / 3,
42870 (Math.sqrt(3) * s - c + 1) / 3
42871 ];
42872}
42873function contrastFactor(contrast) {
42874 return contrast > 0 ?
42875 1 / (1 - contrast) :
42876 1 + contrast;
42877}
42878function saturationFactor(saturation) {
42879 return saturation > 0 ?
42880 1 - 1 / (1.001 - saturation) :
42881 -saturation;
42882}
42883
42884const symbolIconUniforms = (context, locations) => ({
42885 'u_is_size_zoom_constant': new performance.Uniform1i(context, locations.u_is_size_zoom_constant),
42886 'u_is_size_feature_constant': new performance.Uniform1i(context, locations.u_is_size_feature_constant),
42887 'u_size_t': new performance.Uniform1f(context, locations.u_size_t),
42888 'u_size': new performance.Uniform1f(context, locations.u_size),
42889 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
42890 'u_pitch': new performance.Uniform1f(context, locations.u_pitch),
42891 'u_rotate_symbol': new performance.Uniform1i(context, locations.u_rotate_symbol),
42892 'u_aspect_ratio': new performance.Uniform1f(context, locations.u_aspect_ratio),
42893 'u_fade_change': new performance.Uniform1f(context, locations.u_fade_change),
42894 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42895 'u_label_plane_matrix': new performance.UniformMatrix4f(context, locations.u_label_plane_matrix),
42896 'u_coord_matrix': new performance.UniformMatrix4f(context, locations.u_coord_matrix),
42897 'u_is_text': new performance.Uniform1i(context, locations.u_is_text),
42898 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map),
42899 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
42900 'u_texture': new performance.Uniform1i(context, locations.u_texture)
42901});
42902const symbolSDFUniforms = (context, locations) => ({
42903 'u_is_size_zoom_constant': new performance.Uniform1i(context, locations.u_is_size_zoom_constant),
42904 'u_is_size_feature_constant': new performance.Uniform1i(context, locations.u_is_size_feature_constant),
42905 'u_size_t': new performance.Uniform1f(context, locations.u_size_t),
42906 'u_size': new performance.Uniform1f(context, locations.u_size),
42907 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
42908 'u_pitch': new performance.Uniform1f(context, locations.u_pitch),
42909 'u_rotate_symbol': new performance.Uniform1i(context, locations.u_rotate_symbol),
42910 'u_aspect_ratio': new performance.Uniform1f(context, locations.u_aspect_ratio),
42911 'u_fade_change': new performance.Uniform1f(context, locations.u_fade_change),
42912 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42913 'u_label_plane_matrix': new performance.UniformMatrix4f(context, locations.u_label_plane_matrix),
42914 'u_coord_matrix': new performance.UniformMatrix4f(context, locations.u_coord_matrix),
42915 'u_is_text': new performance.Uniform1i(context, locations.u_is_text),
42916 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map),
42917 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
42918 'u_texture': new performance.Uniform1i(context, locations.u_texture),
42919 'u_gamma_scale': new performance.Uniform1f(context, locations.u_gamma_scale),
42920 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
42921 'u_is_halo': new performance.Uniform1i(context, locations.u_is_halo)
42922});
42923const symbolTextAndIconUniforms = (context, locations) => ({
42924 'u_is_size_zoom_constant': new performance.Uniform1i(context, locations.u_is_size_zoom_constant),
42925 'u_is_size_feature_constant': new performance.Uniform1i(context, locations.u_is_size_feature_constant),
42926 'u_size_t': new performance.Uniform1f(context, locations.u_size_t),
42927 'u_size': new performance.Uniform1f(context, locations.u_size),
42928 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
42929 'u_pitch': new performance.Uniform1f(context, locations.u_pitch),
42930 'u_rotate_symbol': new performance.Uniform1i(context, locations.u_rotate_symbol),
42931 'u_aspect_ratio': new performance.Uniform1f(context, locations.u_aspect_ratio),
42932 'u_fade_change': new performance.Uniform1f(context, locations.u_fade_change),
42933 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42934 'u_label_plane_matrix': new performance.UniformMatrix4f(context, locations.u_label_plane_matrix),
42935 'u_coord_matrix': new performance.UniformMatrix4f(context, locations.u_coord_matrix),
42936 'u_is_text': new performance.Uniform1i(context, locations.u_is_text),
42937 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map),
42938 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
42939 'u_texsize_icon': new performance.Uniform2f(context, locations.u_texsize_icon),
42940 'u_texture': new performance.Uniform1i(context, locations.u_texture),
42941 'u_texture_icon': new performance.Uniform1i(context, locations.u_texture_icon),
42942 'u_gamma_scale': new performance.Uniform1f(context, locations.u_gamma_scale),
42943 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
42944 'u_is_halo': new performance.Uniform1i(context, locations.u_is_halo)
42945});
42946const symbolIconUniformValues = (functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize) => {
42947 const transform = painter.transform;
42948 return {
42949 'u_is_size_zoom_constant': +(functionType === 'constant' || functionType === 'source'),
42950 'u_is_size_feature_constant': +(functionType === 'constant' || functionType === 'camera'),
42951 'u_size_t': size ? size.uSizeT : 0,
42952 'u_size': size ? size.uSize : 0,
42953 'u_camera_to_center_distance': transform.cameraToCenterDistance,
42954 'u_pitch': transform.pitch / 360 * 2 * Math.PI,
42955 'u_rotate_symbol': +rotateInShader,
42956 'u_aspect_ratio': transform.width / transform.height,
42957 'u_fade_change': painter.options.fadeDuration ? painter.symbolFadeChange : 1,
42958 'u_matrix': matrix,
42959 'u_label_plane_matrix': labelPlaneMatrix,
42960 'u_coord_matrix': glCoordMatrix,
42961 'u_is_text': +isText,
42962 'u_pitch_with_map': +pitchWithMap,
42963 'u_texsize': texSize,
42964 'u_texture': 0
42965 };
42966};
42967const symbolSDFUniformValues = (functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize, isHalo) => {
42968 const transform = painter.transform;
42969 return performance.extend(symbolIconUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize), {
42970 'u_gamma_scale': (pitchWithMap ? Math.cos(transform._pitch) * transform.cameraToCenterDistance : 1),
42971 'u_device_pixel_ratio': painter.pixelRatio,
42972 'u_is_halo': +isHalo
42973 });
42974};
42975const symbolTextAndIconUniformValues = (functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, texSizeSDF, texSizeIcon) => {
42976 return performance.extend(symbolSDFUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, true, texSizeSDF, true), {
42977 'u_texsize_icon': texSizeIcon,
42978 'u_texture_icon': 1
42979 });
42980};
42981
42982const backgroundUniforms = (context, locations) => ({
42983 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42984 'u_opacity': new performance.Uniform1f(context, locations.u_opacity),
42985 'u_color': new performance.UniformColor(context, locations.u_color)
42986});
42987const backgroundPatternUniforms = (context, locations) => ({
42988 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
42989 'u_opacity': new performance.Uniform1f(context, locations.u_opacity),
42990 'u_image': new performance.Uniform1i(context, locations.u_image),
42991 'u_pattern_tl_a': new performance.Uniform2f(context, locations.u_pattern_tl_a),
42992 'u_pattern_br_a': new performance.Uniform2f(context, locations.u_pattern_br_a),
42993 'u_pattern_tl_b': new performance.Uniform2f(context, locations.u_pattern_tl_b),
42994 'u_pattern_br_b': new performance.Uniform2f(context, locations.u_pattern_br_b),
42995 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
42996 'u_mix': new performance.Uniform1f(context, locations.u_mix),
42997 'u_pattern_size_a': new performance.Uniform2f(context, locations.u_pattern_size_a),
42998 'u_pattern_size_b': new performance.Uniform2f(context, locations.u_pattern_size_b),
42999 'u_scale_a': new performance.Uniform1f(context, locations.u_scale_a),
43000 'u_scale_b': new performance.Uniform1f(context, locations.u_scale_b),
43001 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper),
43002 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower),
43003 'u_tile_units_to_pixels': new performance.Uniform1f(context, locations.u_tile_units_to_pixels)
43004});
43005const backgroundUniformValues = (matrix, opacity, color) => ({
43006 'u_matrix': matrix,
43007 'u_opacity': opacity,
43008 'u_color': color
43009});
43010const backgroundPatternUniformValues = (matrix, opacity, painter, image, tile, crossfade) => performance.extend(bgPatternUniformValues(image, crossfade, painter, tile), {
43011 'u_matrix': matrix,
43012 'u_opacity': opacity
43013});
43014
43015const programUniforms = {
43016 fillExtrusion: fillExtrusionUniforms,
43017 fillExtrusionPattern: fillExtrusionPatternUniforms,
43018 fill: fillUniforms,
43019 fillPattern: fillPatternUniforms,
43020 fillOutline: fillOutlineUniforms,
43021 fillOutlinePattern: fillOutlinePatternUniforms,
43022 circle: circleUniforms,
43023 collisionBox: collisionUniforms,
43024 collisionCircle: collisionCircleUniforms,
43025 debug: debugUniforms,
43026 clippingMask: clippingMaskUniforms,
43027 heatmap: heatmapUniforms,
43028 heatmapTexture: heatmapTextureUniforms,
43029 hillshade: hillshadeUniforms,
43030 hillshadePrepare: hillshadePrepareUniforms,
43031 line: lineUniforms,
43032 lineGradient: lineGradientUniforms,
43033 linePattern: linePatternUniforms,
43034 lineSDF: lineSDFUniforms,
43035 raster: rasterUniforms,
43036 symbolIcon: symbolIconUniforms,
43037 symbolSDF: symbolSDFUniforms,
43038 symbolTextAndIcon: symbolTextAndIconUniforms,
43039 background: backgroundUniforms,
43040 backgroundPattern: backgroundPatternUniforms
43041};
43042
43043class IndexBuffer {
43044 constructor(context, array, dynamicDraw) {
43045 this.context = context;
43046 const gl = context.gl;
43047 this.buffer = gl.createBuffer();
43048 this.dynamicDraw = Boolean(dynamicDraw);
43049 // The bound index buffer is part of vertex array object state. We don't want to
43050 // modify whatever VAO happens to be currently bound, so make sure the default
43051 // vertex array provided by the context is bound instead.
43052 this.context.unbindVAO();
43053 context.bindElementBuffer.set(this.buffer);
43054 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW);
43055 if (!this.dynamicDraw) {
43056 delete array.arrayBuffer;
43057 }
43058 }
43059 bind() {
43060 this.context.bindElementBuffer.set(this.buffer);
43061 }
43062 updateData(array) {
43063 const gl = this.context.gl;
43064 performance.assert(this.dynamicDraw);
43065 // The right VAO will get this buffer re-bound later in VertexArrayObject#bind
43066 // See https://github.com/mapbox/mapbox-gl-js/issues/5620
43067 this.context.unbindVAO();
43068 this.bind();
43069 gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, array.arrayBuffer);
43070 }
43071 destroy() {
43072 const gl = this.context.gl;
43073 if (this.buffer) {
43074 gl.deleteBuffer(this.buffer);
43075 delete this.buffer;
43076 }
43077 }
43078}
43079
43080/**
43081 * @enum {string} AttributeType
43082 * @private
43083 * @readonly
43084 */
43085const AttributeType = {
43086 Int8: 'BYTE',
43087 Uint8: 'UNSIGNED_BYTE',
43088 Int16: 'SHORT',
43089 Uint16: 'UNSIGNED_SHORT',
43090 Int32: 'INT',
43091 Uint32: 'UNSIGNED_INT',
43092 Float32: 'FLOAT'
43093};
43094/**
43095 * The `VertexBuffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's
43096 * Struct type is converted to a WebGL atribute.
43097 * @private
43098 */
43099class VertexBuffer {
43100 /**
43101 * @param dynamicDraw Whether this buffer will be repeatedly updated.
43102 * @private
43103 */
43104 constructor(context, array, attributes, dynamicDraw) {
43105 this.length = array.length;
43106 this.attributes = attributes;
43107 this.itemSize = array.bytesPerElement;
43108 this.dynamicDraw = dynamicDraw;
43109 this.context = context;
43110 const gl = context.gl;
43111 this.buffer = gl.createBuffer();
43112 context.bindVertexBuffer.set(this.buffer);
43113 gl.bufferData(gl.ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW);
43114 if (!this.dynamicDraw) {
43115 delete array.arrayBuffer;
43116 }
43117 }
43118 bind() {
43119 this.context.bindVertexBuffer.set(this.buffer);
43120 }
43121 updateData(array) {
43122 performance.assert(array.length === this.length);
43123 const gl = this.context.gl;
43124 this.bind();
43125 gl.bufferSubData(gl.ARRAY_BUFFER, 0, array.arrayBuffer);
43126 }
43127 enableAttributes(gl, program) {
43128 for (let j = 0; j < this.attributes.length; j++) {
43129 const member = this.attributes[j];
43130 const attribIndex = program.attributes[member.name];
43131 if (attribIndex !== undefined) {
43132 gl.enableVertexAttribArray(attribIndex);
43133 }
43134 }
43135 }
43136 /**
43137 * Set the attribute pointers in a WebGL context
43138 * @param gl The WebGL context
43139 * @param program The active WebGL program
43140 * @param vertexOffset Index of the starting vertex of the segment
43141 */
43142 setVertexAttribPointers(gl, program, vertexOffset) {
43143 for (let j = 0; j < this.attributes.length; j++) {
43144 const member = this.attributes[j];
43145 const attribIndex = program.attributes[member.name];
43146 if (attribIndex !== undefined) {
43147 gl.vertexAttribPointer(attribIndex, member.components, gl[AttributeType[member.type]], false, this.itemSize, member.offset + (this.itemSize * (vertexOffset || 0)));
43148 }
43149 }
43150 }
43151 /**
43152 * Destroy the GL buffer bound to the given WebGL context
43153 */
43154 destroy() {
43155 const gl = this.context.gl;
43156 if (this.buffer) {
43157 gl.deleteBuffer(this.buffer);
43158 delete this.buffer;
43159 }
43160 }
43161}
43162
43163class BaseValue {
43164 constructor(context) {
43165 this.gl = context.gl;
43166 this.default = this.getDefault();
43167 this.current = this.default;
43168 this.dirty = false;
43169 }
43170 get() {
43171 return this.current;
43172 }
43173 set(value) {
43174 // overridden in child classes;
43175 }
43176 getDefault() {
43177 return this.default; // overriden in child classes
43178 }
43179 setDefault() {
43180 this.set(this.default);
43181 }
43182}
43183class ClearColor extends BaseValue {
43184 getDefault() {
43185 return performance.Color.transparent;
43186 }
43187 set(v) {
43188 const c = this.current;
43189 if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty)
43190 return;
43191 this.gl.clearColor(v.r, v.g, v.b, v.a);
43192 this.current = v;
43193 this.dirty = false;
43194 }
43195}
43196class ClearDepth extends BaseValue {
43197 getDefault() {
43198 return 1;
43199 }
43200 set(v) {
43201 if (v === this.current && !this.dirty)
43202 return;
43203 this.gl.clearDepth(v);
43204 this.current = v;
43205 this.dirty = false;
43206 }
43207}
43208class ClearStencil extends BaseValue {
43209 getDefault() {
43210 return 0;
43211 }
43212 set(v) {
43213 if (v === this.current && !this.dirty)
43214 return;
43215 this.gl.clearStencil(v);
43216 this.current = v;
43217 this.dirty = false;
43218 }
43219}
43220class ColorMask extends BaseValue {
43221 getDefault() {
43222 return [true, true, true, true];
43223 }
43224 set(v) {
43225 const c = this.current;
43226 if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty)
43227 return;
43228 this.gl.colorMask(v[0], v[1], v[2], v[3]);
43229 this.current = v;
43230 this.dirty = false;
43231 }
43232}
43233class DepthMask extends BaseValue {
43234 getDefault() {
43235 return true;
43236 }
43237 set(v) {
43238 if (v === this.current && !this.dirty)
43239 return;
43240 this.gl.depthMask(v);
43241 this.current = v;
43242 this.dirty = false;
43243 }
43244}
43245class StencilMask extends BaseValue {
43246 getDefault() {
43247 return 0xFF;
43248 }
43249 set(v) {
43250 if (v === this.current && !this.dirty)
43251 return;
43252 this.gl.stencilMask(v);
43253 this.current = v;
43254 this.dirty = false;
43255 }
43256}
43257class StencilFunc extends BaseValue {
43258 getDefault() {
43259 return {
43260 func: this.gl.ALWAYS,
43261 ref: 0,
43262 mask: 0xFF
43263 };
43264 }
43265 set(v) {
43266 const c = this.current;
43267 if (v.func === c.func && v.ref === c.ref && v.mask === c.mask && !this.dirty)
43268 return;
43269 this.gl.stencilFunc(v.func, v.ref, v.mask);
43270 this.current = v;
43271 this.dirty = false;
43272 }
43273}
43274class StencilOp extends BaseValue {
43275 getDefault() {
43276 const gl = this.gl;
43277 return [gl.KEEP, gl.KEEP, gl.KEEP];
43278 }
43279 set(v) {
43280 const c = this.current;
43281 if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && !this.dirty)
43282 return;
43283 this.gl.stencilOp(v[0], v[1], v[2]);
43284 this.current = v;
43285 this.dirty = false;
43286 }
43287}
43288class StencilTest extends BaseValue {
43289 getDefault() {
43290 return false;
43291 }
43292 set(v) {
43293 if (v === this.current && !this.dirty)
43294 return;
43295 const gl = this.gl;
43296 if (v) {
43297 gl.enable(gl.STENCIL_TEST);
43298 }
43299 else {
43300 gl.disable(gl.STENCIL_TEST);
43301 }
43302 this.current = v;
43303 this.dirty = false;
43304 }
43305}
43306class DepthRange extends BaseValue {
43307 getDefault() {
43308 return [0, 1];
43309 }
43310 set(v) {
43311 const c = this.current;
43312 if (v[0] === c[0] && v[1] === c[1] && !this.dirty)
43313 return;
43314 this.gl.depthRange(v[0], v[1]);
43315 this.current = v;
43316 this.dirty = false;
43317 }
43318}
43319class DepthTest extends BaseValue {
43320 getDefault() {
43321 return false;
43322 }
43323 set(v) {
43324 if (v === this.current && !this.dirty)
43325 return;
43326 const gl = this.gl;
43327 if (v) {
43328 gl.enable(gl.DEPTH_TEST);
43329 }
43330 else {
43331 gl.disable(gl.DEPTH_TEST);
43332 }
43333 this.current = v;
43334 this.dirty = false;
43335 }
43336}
43337class DepthFunc extends BaseValue {
43338 getDefault() {
43339 return this.gl.LESS;
43340 }
43341 set(v) {
43342 if (v === this.current && !this.dirty)
43343 return;
43344 this.gl.depthFunc(v);
43345 this.current = v;
43346 this.dirty = false;
43347 }
43348}
43349class Blend extends BaseValue {
43350 getDefault() {
43351 return false;
43352 }
43353 set(v) {
43354 if (v === this.current && !this.dirty)
43355 return;
43356 const gl = this.gl;
43357 if (v) {
43358 gl.enable(gl.BLEND);
43359 }
43360 else {
43361 gl.disable(gl.BLEND);
43362 }
43363 this.current = v;
43364 this.dirty = false;
43365 }
43366}
43367class BlendFunc extends BaseValue {
43368 getDefault() {
43369 const gl = this.gl;
43370 return [gl.ONE, gl.ZERO];
43371 }
43372 set(v) {
43373 const c = this.current;
43374 if (v[0] === c[0] && v[1] === c[1] && !this.dirty)
43375 return;
43376 this.gl.blendFunc(v[0], v[1]);
43377 this.current = v;
43378 this.dirty = false;
43379 }
43380}
43381class BlendColor extends BaseValue {
43382 getDefault() {
43383 return performance.Color.transparent;
43384 }
43385 set(v) {
43386 const c = this.current;
43387 if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty)
43388 return;
43389 this.gl.blendColor(v.r, v.g, v.b, v.a);
43390 this.current = v;
43391 this.dirty = false;
43392 }
43393}
43394class BlendEquation extends BaseValue {
43395 getDefault() {
43396 return this.gl.FUNC_ADD;
43397 }
43398 set(v) {
43399 if (v === this.current && !this.dirty)
43400 return;
43401 this.gl.blendEquation(v);
43402 this.current = v;
43403 this.dirty = false;
43404 }
43405}
43406class CullFace extends BaseValue {
43407 getDefault() {
43408 return false;
43409 }
43410 set(v) {
43411 if (v === this.current && !this.dirty)
43412 return;
43413 const gl = this.gl;
43414 if (v) {
43415 gl.enable(gl.CULL_FACE);
43416 }
43417 else {
43418 gl.disable(gl.CULL_FACE);
43419 }
43420 this.current = v;
43421 this.dirty = false;
43422 }
43423}
43424class CullFaceSide extends BaseValue {
43425 getDefault() {
43426 return this.gl.BACK;
43427 }
43428 set(v) {
43429 if (v === this.current && !this.dirty)
43430 return;
43431 this.gl.cullFace(v);
43432 this.current = v;
43433 this.dirty = false;
43434 }
43435}
43436class FrontFace extends BaseValue {
43437 getDefault() {
43438 return this.gl.CCW;
43439 }
43440 set(v) {
43441 if (v === this.current && !this.dirty)
43442 return;
43443 this.gl.frontFace(v);
43444 this.current = v;
43445 this.dirty = false;
43446 }
43447}
43448class ProgramValue extends BaseValue {
43449 getDefault() {
43450 return null;
43451 }
43452 set(v) {
43453 if (v === this.current && !this.dirty)
43454 return;
43455 this.gl.useProgram(v);
43456 this.current = v;
43457 this.dirty = false;
43458 }
43459}
43460class ActiveTextureUnit extends BaseValue {
43461 getDefault() {
43462 return this.gl.TEXTURE0;
43463 }
43464 set(v) {
43465 if (v === this.current && !this.dirty)
43466 return;
43467 this.gl.activeTexture(v);
43468 this.current = v;
43469 this.dirty = false;
43470 }
43471}
43472class Viewport extends BaseValue {
43473 getDefault() {
43474 const gl = this.gl;
43475 return [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight];
43476 }
43477 set(v) {
43478 const c = this.current;
43479 if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty)
43480 return;
43481 this.gl.viewport(v[0], v[1], v[2], v[3]);
43482 this.current = v;
43483 this.dirty = false;
43484 }
43485}
43486class BindFramebuffer extends BaseValue {
43487 getDefault() {
43488 return null;
43489 }
43490 set(v) {
43491 if (v === this.current && !this.dirty)
43492 return;
43493 const gl = this.gl;
43494 gl.bindFramebuffer(gl.FRAMEBUFFER, v);
43495 this.current = v;
43496 this.dirty = false;
43497 }
43498}
43499class BindRenderbuffer extends BaseValue {
43500 getDefault() {
43501 return null;
43502 }
43503 set(v) {
43504 if (v === this.current && !this.dirty)
43505 return;
43506 const gl = this.gl;
43507 gl.bindRenderbuffer(gl.RENDERBUFFER, v);
43508 this.current = v;
43509 this.dirty = false;
43510 }
43511}
43512class BindTexture extends BaseValue {
43513 getDefault() {
43514 return null;
43515 }
43516 set(v) {
43517 if (v === this.current && !this.dirty)
43518 return;
43519 const gl = this.gl;
43520 gl.bindTexture(gl.TEXTURE_2D, v);
43521 this.current = v;
43522 this.dirty = false;
43523 }
43524}
43525class BindVertexBuffer extends BaseValue {
43526 getDefault() {
43527 return null;
43528 }
43529 set(v) {
43530 if (v === this.current && !this.dirty)
43531 return;
43532 const gl = this.gl;
43533 gl.bindBuffer(gl.ARRAY_BUFFER, v);
43534 this.current = v;
43535 this.dirty = false;
43536 }
43537}
43538class BindElementBuffer extends BaseValue {
43539 getDefault() {
43540 return null;
43541 }
43542 set(v) {
43543 // Always rebind
43544 const gl = this.gl;
43545 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, v);
43546 this.current = v;
43547 this.dirty = false;
43548 }
43549}
43550class BindVertexArrayOES extends BaseValue {
43551 constructor(context) {
43552 super(context);
43553 this.vao = context.extVertexArrayObject;
43554 }
43555 getDefault() {
43556 return null;
43557 }
43558 set(v) {
43559 if (!this.vao || v === this.current && !this.dirty)
43560 return;
43561 this.vao.bindVertexArrayOES(v);
43562 this.current = v;
43563 this.dirty = false;
43564 }
43565}
43566class PixelStoreUnpack extends BaseValue {
43567 getDefault() {
43568 return 4;
43569 }
43570 set(v) {
43571 if (v === this.current && !this.dirty)
43572 return;
43573 const gl = this.gl;
43574 gl.pixelStorei(gl.UNPACK_ALIGNMENT, v);
43575 this.current = v;
43576 this.dirty = false;
43577 }
43578}
43579class PixelStoreUnpackPremultiplyAlpha extends BaseValue {
43580 getDefault() {
43581 return false;
43582 }
43583 set(v) {
43584 if (v === this.current && !this.dirty)
43585 return;
43586 const gl = this.gl;
43587 gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, v);
43588 this.current = v;
43589 this.dirty = false;
43590 }
43591}
43592class PixelStoreUnpackFlipY extends BaseValue {
43593 getDefault() {
43594 return false;
43595 }
43596 set(v) {
43597 if (v === this.current && !this.dirty)
43598 return;
43599 const gl = this.gl;
43600 gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, v);
43601 this.current = v;
43602 this.dirty = false;
43603 }
43604}
43605class FramebufferAttachment extends BaseValue {
43606 constructor(context, parent) {
43607 super(context);
43608 this.context = context;
43609 this.parent = parent;
43610 }
43611 getDefault() {
43612 return null;
43613 }
43614}
43615class ColorAttachment extends FramebufferAttachment {
43616 setDirty() {
43617 this.dirty = true;
43618 }
43619 set(v) {
43620 if (v === this.current && !this.dirty)
43621 return;
43622 this.context.bindFramebuffer.set(this.parent);
43623 // note: it's possible to attach a renderbuffer to the color
43624 // attachment point, but thus far MBGL only uses textures for color
43625 const gl = this.gl;
43626 gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, v, 0);
43627 this.current = v;
43628 this.dirty = false;
43629 }
43630}
43631class DepthAttachment extends FramebufferAttachment {
43632 set(v) {
43633 if (v === this.current && !this.dirty)
43634 return;
43635 this.context.bindFramebuffer.set(this.parent);
43636 // note: it's possible to attach a texture to the depth attachment
43637 // point, but thus far MBGL only uses renderbuffers for depth
43638 const gl = this.gl;
43639 gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, v);
43640 this.current = v;
43641 this.dirty = false;
43642 }
43643}
43644
43645class Framebuffer {
43646 constructor(context, width, height, hasDepth) {
43647 this.context = context;
43648 this.width = width;
43649 this.height = height;
43650 const gl = context.gl;
43651 const fbo = this.framebuffer = gl.createFramebuffer();
43652 this.colorAttachment = new ColorAttachment(context, fbo);
43653 if (hasDepth) {
43654 this.depthAttachment = new DepthAttachment(context, fbo);
43655 }
43656 performance.assert(gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE);
43657 }
43658 destroy() {
43659 const gl = this.context.gl;
43660 const texture = this.colorAttachment.get();
43661 if (texture)
43662 gl.deleteTexture(texture);
43663 if (this.depthAttachment) {
43664 const renderbuffer = this.depthAttachment.get();
43665 if (renderbuffer)
43666 gl.deleteRenderbuffer(renderbuffer);
43667 }
43668 gl.deleteFramebuffer(this.framebuffer);
43669 }
43670}
43671
43672const ZERO = 0x0000;
43673const ONE = 0x0001;
43674const ONE_MINUS_SRC_ALPHA = 0x0303;
43675class ColorMode {
43676 constructor(blendFunction, blendColor, mask) {
43677 this.blendFunction = blendFunction;
43678 this.blendColor = blendColor;
43679 this.mask = mask;
43680 }
43681}
43682ColorMode.Replace = [ONE, ZERO];
43683ColorMode.disabled = new ColorMode(ColorMode.Replace, performance.Color.transparent, [false, false, false, false]);
43684ColorMode.unblended = new ColorMode(ColorMode.Replace, performance.Color.transparent, [true, true, true, true]);
43685ColorMode.alphaBlended = new ColorMode([ONE, ONE_MINUS_SRC_ALPHA], performance.Color.transparent, [true, true, true, true]);
43686
43687class Context {
43688 constructor(gl) {
43689 this.gl = gl;
43690 this.extVertexArrayObject = this.gl.getExtension('OES_vertex_array_object');
43691 this.clearColor = new ClearColor(this);
43692 this.clearDepth = new ClearDepth(this);
43693 this.clearStencil = new ClearStencil(this);
43694 this.colorMask = new ColorMask(this);
43695 this.depthMask = new DepthMask(this);
43696 this.stencilMask = new StencilMask(this);
43697 this.stencilFunc = new StencilFunc(this);
43698 this.stencilOp = new StencilOp(this);
43699 this.stencilTest = new StencilTest(this);
43700 this.depthRange = new DepthRange(this);
43701 this.depthTest = new DepthTest(this);
43702 this.depthFunc = new DepthFunc(this);
43703 this.blend = new Blend(this);
43704 this.blendFunc = new BlendFunc(this);
43705 this.blendColor = new BlendColor(this);
43706 this.blendEquation = new BlendEquation(this);
43707 this.cullFace = new CullFace(this);
43708 this.cullFaceSide = new CullFaceSide(this);
43709 this.frontFace = new FrontFace(this);
43710 this.program = new ProgramValue(this);
43711 this.activeTexture = new ActiveTextureUnit(this);
43712 this.viewport = new Viewport(this);
43713 this.bindFramebuffer = new BindFramebuffer(this);
43714 this.bindRenderbuffer = new BindRenderbuffer(this);
43715 this.bindTexture = new BindTexture(this);
43716 this.bindVertexBuffer = new BindVertexBuffer(this);
43717 this.bindElementBuffer = new BindElementBuffer(this);
43718 this.bindVertexArrayOES = this.extVertexArrayObject && new BindVertexArrayOES(this);
43719 this.pixelStoreUnpack = new PixelStoreUnpack(this);
43720 this.pixelStoreUnpackPremultiplyAlpha = new PixelStoreUnpackPremultiplyAlpha(this);
43721 this.pixelStoreUnpackFlipY = new PixelStoreUnpackFlipY(this);
43722 this.extTextureFilterAnisotropic = (gl.getExtension('EXT_texture_filter_anisotropic') ||
43723 gl.getExtension('MOZ_EXT_texture_filter_anisotropic') ||
43724 gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic'));
43725 if (this.extTextureFilterAnisotropic) {
43726 this.extTextureFilterAnisotropicMax = gl.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT);
43727 }
43728 this.extTextureHalfFloat = gl.getExtension('OES_texture_half_float');
43729 if (this.extTextureHalfFloat) {
43730 gl.getExtension('OES_texture_half_float_linear');
43731 this.extRenderToTextureHalfFloat = gl.getExtension('EXT_color_buffer_half_float');
43732 }
43733 this.extTimerQuery = gl.getExtension('EXT_disjoint_timer_query');
43734 this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
43735 }
43736 setDefault() {
43737 this.unbindVAO();
43738 this.clearColor.setDefault();
43739 this.clearDepth.setDefault();
43740 this.clearStencil.setDefault();
43741 this.colorMask.setDefault();
43742 this.depthMask.setDefault();
43743 this.stencilMask.setDefault();
43744 this.stencilFunc.setDefault();
43745 this.stencilOp.setDefault();
43746 this.stencilTest.setDefault();
43747 this.depthRange.setDefault();
43748 this.depthTest.setDefault();
43749 this.depthFunc.setDefault();
43750 this.blend.setDefault();
43751 this.blendFunc.setDefault();
43752 this.blendColor.setDefault();
43753 this.blendEquation.setDefault();
43754 this.cullFace.setDefault();
43755 this.cullFaceSide.setDefault();
43756 this.frontFace.setDefault();
43757 this.program.setDefault();
43758 this.activeTexture.setDefault();
43759 this.bindFramebuffer.setDefault();
43760 this.pixelStoreUnpack.setDefault();
43761 this.pixelStoreUnpackPremultiplyAlpha.setDefault();
43762 this.pixelStoreUnpackFlipY.setDefault();
43763 }
43764 setDirty() {
43765 this.clearColor.dirty = true;
43766 this.clearDepth.dirty = true;
43767 this.clearStencil.dirty = true;
43768 this.colorMask.dirty = true;
43769 this.depthMask.dirty = true;
43770 this.stencilMask.dirty = true;
43771 this.stencilFunc.dirty = true;
43772 this.stencilOp.dirty = true;
43773 this.stencilTest.dirty = true;
43774 this.depthRange.dirty = true;
43775 this.depthTest.dirty = true;
43776 this.depthFunc.dirty = true;
43777 this.blend.dirty = true;
43778 this.blendFunc.dirty = true;
43779 this.blendColor.dirty = true;
43780 this.blendEquation.dirty = true;
43781 this.cullFace.dirty = true;
43782 this.cullFaceSide.dirty = true;
43783 this.frontFace.dirty = true;
43784 this.program.dirty = true;
43785 this.activeTexture.dirty = true;
43786 this.viewport.dirty = true;
43787 this.bindFramebuffer.dirty = true;
43788 this.bindRenderbuffer.dirty = true;
43789 this.bindTexture.dirty = true;
43790 this.bindVertexBuffer.dirty = true;
43791 this.bindElementBuffer.dirty = true;
43792 if (this.extVertexArrayObject) {
43793 this.bindVertexArrayOES.dirty = true;
43794 }
43795 this.pixelStoreUnpack.dirty = true;
43796 this.pixelStoreUnpackPremultiplyAlpha.dirty = true;
43797 this.pixelStoreUnpackFlipY.dirty = true;
43798 }
43799 createIndexBuffer(array, dynamicDraw) {
43800 return new IndexBuffer(this, array, dynamicDraw);
43801 }
43802 createVertexBuffer(array, attributes, dynamicDraw) {
43803 return new VertexBuffer(this, array, attributes, dynamicDraw);
43804 }
43805 createRenderbuffer(storageFormat, width, height) {
43806 const gl = this.gl;
43807 const rbo = gl.createRenderbuffer();
43808 this.bindRenderbuffer.set(rbo);
43809 gl.renderbufferStorage(gl.RENDERBUFFER, storageFormat, width, height);
43810 this.bindRenderbuffer.set(null);
43811 return rbo;
43812 }
43813 createFramebuffer(width, height, hasDepth) {
43814 return new Framebuffer(this, width, height, hasDepth);
43815 }
43816 clear({ color, depth }) {
43817 const gl = this.gl;
43818 let mask = 0;
43819 if (color) {
43820 mask |= gl.COLOR_BUFFER_BIT;
43821 this.clearColor.set(color);
43822 this.colorMask.set([true, true, true, true]);
43823 }
43824 if (typeof depth !== 'undefined') {
43825 mask |= gl.DEPTH_BUFFER_BIT;
43826 // Workaround for platforms where clearDepth doesn't seem to work
43827 // without reseting the depthRange. See https://github.com/mapbox/mapbox-gl-js/issues/3437
43828 this.depthRange.set([0, 1]);
43829 this.clearDepth.set(depth);
43830 this.depthMask.set(true);
43831 }
43832 // See note in Painter#clearStencil: implement this the easy way once GPU bug/workaround is fixed upstream
43833 // if (typeof stencil !== 'undefined') {
43834 // mask |= gl.STENCIL_BUFFER_BIT;
43835 // this.clearStencil.set(stencil);
43836 // this.stencilMask.set(0xFF);
43837 // }
43838 gl.clear(mask);
43839 }
43840 setCullFace(cullFaceMode) {
43841 if (cullFaceMode.enable === false) {
43842 this.cullFace.set(false);
43843 }
43844 else {
43845 this.cullFace.set(true);
43846 this.cullFaceSide.set(cullFaceMode.mode);
43847 this.frontFace.set(cullFaceMode.frontFace);
43848 }
43849 }
43850 setDepthMode(depthMode) {
43851 if (depthMode.func === this.gl.ALWAYS && !depthMode.mask) {
43852 this.depthTest.set(false);
43853 }
43854 else {
43855 this.depthTest.set(true);
43856 this.depthFunc.set(depthMode.func);
43857 this.depthMask.set(depthMode.mask);
43858 this.depthRange.set(depthMode.range);
43859 }
43860 }
43861 setStencilMode(stencilMode) {
43862 if (stencilMode.test.func === this.gl.ALWAYS && !stencilMode.mask) {
43863 this.stencilTest.set(false);
43864 }
43865 else {
43866 this.stencilTest.set(true);
43867 this.stencilMask.set(stencilMode.mask);
43868 this.stencilOp.set([stencilMode.fail, stencilMode.depthFail, stencilMode.pass]);
43869 this.stencilFunc.set({
43870 func: stencilMode.test.func,
43871 ref: stencilMode.ref,
43872 mask: stencilMode.test.mask
43873 });
43874 }
43875 }
43876 setColorMode(colorMode) {
43877 if (performance.deepEqual(colorMode.blendFunction, ColorMode.Replace)) {
43878 this.blend.set(false);
43879 }
43880 else {
43881 this.blend.set(true);
43882 this.blendFunc.set(colorMode.blendFunction);
43883 this.blendColor.set(colorMode.blendColor);
43884 }
43885 this.colorMask.set(colorMode.mask);
43886 }
43887 unbindVAO() {
43888 // Unbinding the VAO prevents other things (custom layers, new buffer creation) from
43889 // unintentionally changing the state of the last VAO used.
43890 if (this.extVertexArrayObject) {
43891 this.bindVertexArrayOES.set(null);
43892 }
43893 }
43894}
43895
43896const ALWAYS$1 = 0x0207;
43897class DepthMode {
43898 constructor(depthFunc, depthMask, depthRange) {
43899 this.func = depthFunc;
43900 this.mask = depthMask;
43901 this.range = depthRange;
43902 }
43903}
43904DepthMode.ReadOnly = false;
43905DepthMode.ReadWrite = true;
43906DepthMode.disabled = new DepthMode(ALWAYS$1, DepthMode.ReadOnly, [0, 1]);
43907
43908const ALWAYS = 0x0207;
43909const KEEP = 0x1E00;
43910class StencilMode {
43911 constructor(test, ref, mask, fail, depthFail, pass) {
43912 this.test = test;
43913 this.ref = ref;
43914 this.mask = mask;
43915 this.fail = fail;
43916 this.depthFail = depthFail;
43917 this.pass = pass;
43918 }
43919}
43920StencilMode.disabled = new StencilMode({ func: ALWAYS, mask: 0 }, 0, 0, KEEP, KEEP, KEEP);
43921
43922const BACK = 0x0405;
43923const CCW = 0x0901;
43924class CullFaceMode {
43925 constructor(enable, mode, frontFace) {
43926 this.enable = enable;
43927 this.mode = mode;
43928 this.frontFace = frontFace;
43929 }
43930}
43931CullFaceMode.disabled = new CullFaceMode(false, BACK, CCW);
43932CullFaceMode.backCCW = new CullFaceMode(true, BACK, CCW);
43933
43934let quadTriangles;
43935function drawCollisionDebug(painter, sourceCache, layer, coords, translate, translateAnchor, isText) {
43936 const context = painter.context;
43937 const gl = context.gl;
43938 const program = painter.useProgram('collisionBox');
43939 const tileBatches = [];
43940 let circleCount = 0;
43941 let circleOffset = 0;
43942 for (let i = 0; i < coords.length; i++) {
43943 const coord = coords[i];
43944 const tile = sourceCache.getTile(coord);
43945 const bucket = tile.getBucket(layer);
43946 if (!bucket)
43947 continue;
43948 let posMatrix = coord.posMatrix;
43949 if (translate[0] !== 0 || translate[1] !== 0) {
43950 posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor);
43951 }
43952 const buffers = isText ? bucket.textCollisionBox : bucket.iconCollisionBox;
43953 // Get collision circle data of this bucket
43954 const circleArray = bucket.collisionCircleArray;
43955 if (circleArray.length > 0) {
43956 // We need to know the projection matrix that was used for projecting collision circles to the screen.
43957 // This might vary between buckets as the symbol placement is a continous process. This matrix is
43958 // required for transforming points from previous screen space to the current one
43959 const invTransform = performance.create();
43960 const transform = posMatrix;
43961 performance.mul(invTransform, bucket.placementInvProjMatrix, painter.transform.glCoordMatrix);
43962 performance.mul(invTransform, invTransform, bucket.placementViewportMatrix);
43963 tileBatches.push({
43964 circleArray,
43965 circleOffset,
43966 transform,
43967 invTransform
43968 });
43969 circleCount += circleArray.length / 4; // 4 values per circle
43970 circleOffset = circleCount;
43971 }
43972 if (!buffers)
43973 continue;
43974 program.draw(context, gl.LINES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, collisionUniformValues(posMatrix, painter.transform, tile), layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, buffers.segments, null, painter.transform.zoom, null, null, buffers.collisionVertexBuffer);
43975 }
43976 if (!isText || !tileBatches.length) {
43977 return;
43978 }
43979 // Render collision circles
43980 const circleProgram = painter.useProgram('collisionCircle');
43981 // Construct vertex data
43982 const vertexData = new performance.CollisionCircleLayoutArray();
43983 vertexData.resize(circleCount * 4);
43984 vertexData._trim();
43985 let vertexOffset = 0;
43986 for (const batch of tileBatches) {
43987 for (let i = 0; i < batch.circleArray.length / 4; i++) {
43988 const circleIdx = i * 4;
43989 const x = batch.circleArray[circleIdx + 0];
43990 const y = batch.circleArray[circleIdx + 1];
43991 const radius = batch.circleArray[circleIdx + 2];
43992 const collision = batch.circleArray[circleIdx + 3];
43993 // 4 floats per vertex, 4 vertices per quad
43994 vertexData.emplace(vertexOffset++, x, y, radius, collision, 0);
43995 vertexData.emplace(vertexOffset++, x, y, radius, collision, 1);
43996 vertexData.emplace(vertexOffset++, x, y, radius, collision, 2);
43997 vertexData.emplace(vertexOffset++, x, y, radius, collision, 3);
43998 }
43999 }
44000 if (!quadTriangles || quadTriangles.length < circleCount * 2) {
44001 quadTriangles = createQuadTriangles(circleCount);
44002 }
44003 const indexBuffer = context.createIndexBuffer(quadTriangles, true);
44004 const vertexBuffer = context.createVertexBuffer(vertexData, performance.collisionCircleLayout.members, true);
44005 // Render batches
44006 for (const batch of tileBatches) {
44007 const uniforms = collisionCircleUniformValues(batch.transform, batch.invTransform, painter.transform);
44008 circleProgram.draw(context, gl.TRIANGLES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, uniforms, layer.id, vertexBuffer, indexBuffer, performance.SegmentVector.simpleSegment(0, batch.circleOffset * 2, batch.circleArray.length, batch.circleArray.length / 2), null, painter.transform.zoom, null, null, null);
44009 }
44010 vertexBuffer.destroy();
44011 indexBuffer.destroy();
44012}
44013function createQuadTriangles(quadCount) {
44014 const triCount = quadCount * 2;
44015 const array = new performance.QuadTriangleArray();
44016 array.resize(triCount);
44017 array._trim();
44018 // Two triangles and 4 vertices per quad.
44019 for (let i = 0; i < triCount; i++) {
44020 const idx = i * 6;
44021 array.uint16[idx + 0] = i * 4 + 0;
44022 array.uint16[idx + 1] = i * 4 + 1;
44023 array.uint16[idx + 2] = i * 4 + 2;
44024 array.uint16[idx + 3] = i * 4 + 2;
44025 array.uint16[idx + 4] = i * 4 + 3;
44026 array.uint16[idx + 5] = i * 4 + 0;
44027 }
44028 return array;
44029}
44030
44031const identityMat4 = performance.identity(new Float32Array(16));
44032function drawSymbols(painter, sourceCache, layer, coords, variableOffsets) {
44033 if (painter.renderPass !== 'translucent')
44034 return;
44035 // Disable the stencil test so that labels aren't clipped to tile boundaries.
44036 const stencilMode = StencilMode.disabled;
44037 const colorMode = painter.colorModeForRenderPass();
44038 const variablePlacement = layer.layout.get('text-variable-anchor');
44039 //Compute variable-offsets before painting since icons and text data positioning
44040 //depend on each other in this case.
44041 if (variablePlacement) {
44042 updateVariableAnchors(coords, painter, layer, sourceCache, layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), variableOffsets);
44043 }
44044 if (layer.paint.get('icon-opacity').constantOr(1) !== 0) {
44045 drawLayerSymbols(painter, sourceCache, layer, coords, false, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), layer.layout.get('icon-rotation-alignment'), layer.layout.get('icon-pitch-alignment'), layer.layout.get('icon-keep-upright'), stencilMode, colorMode);
44046 }
44047 if (layer.paint.get('text-opacity').constantOr(1) !== 0) {
44048 drawLayerSymbols(painter, sourceCache, layer, coords, true, layer.paint.get('text-translate'), layer.paint.get('text-translate-anchor'), layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), layer.layout.get('text-keep-upright'), stencilMode, colorMode);
44049 }
44050 if (sourceCache.map.showCollisionBoxes) {
44051 drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('text-translate'), layer.paint.get('text-translate-anchor'), true);
44052 drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), false);
44053 }
44054}
44055function calculateVariableRenderShift(anchor, width, height, textOffset, textBoxScale, renderTextSize) {
44056 const { horizontalAlign, verticalAlign } = performance.getAnchorAlignment(anchor);
44057 const shiftX = -(horizontalAlign - 0.5) * width;
44058 const shiftY = -(verticalAlign - 0.5) * height;
44059 const variableOffset = performance.evaluateVariableOffset(anchor, textOffset);
44060 return new performance.pointGeometry((shiftX / textBoxScale + variableOffset[0]) * renderTextSize, (shiftY / textBoxScale + variableOffset[1]) * renderTextSize);
44061}
44062function updateVariableAnchors(coords, painter, layer, sourceCache, rotationAlignment, pitchAlignment, variableOffsets) {
44063 const tr = painter.transform;
44064 const rotateWithMap = rotationAlignment === 'map';
44065 const pitchWithMap = pitchAlignment === 'map';
44066 for (const coord of coords) {
44067 const tile = sourceCache.getTile(coord);
44068 const bucket = tile.getBucket(layer);
44069 if (!bucket || !bucket.text || !bucket.text.segments.get().length)
44070 continue;
44071 const sizeData = bucket.textSizeData;
44072 const size = performance.evaluateSizeForZoom(sizeData, tr.zoom);
44073 const pixelToTileScale = pixelsToTileUnits(tile, 1, painter.transform.zoom);
44074 const labelPlaneMatrix = getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, pixelToTileScale);
44075 const updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' && bucket.hasIconData();
44076 if (size) {
44077 const tileScale = Math.pow(2, tr.zoom - tile.tileID.overscaledZ);
44078 updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, tr, labelPlaneMatrix, coord.posMatrix, tileScale, size, updateTextFitIcon);
44079 }
44080 }
44081}
44082function updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, transform, labelPlaneMatrix, posMatrix, tileScale, size, updateTextFitIcon) {
44083 const placedSymbols = bucket.text.placedSymbolArray;
44084 const dynamicTextLayoutVertexArray = bucket.text.dynamicLayoutVertexArray;
44085 const dynamicIconLayoutVertexArray = bucket.icon.dynamicLayoutVertexArray;
44086 const placedTextShifts = {};
44087 dynamicTextLayoutVertexArray.clear();
44088 for (let s = 0; s < placedSymbols.length; s++) {
44089 const symbol = placedSymbols.get(s);
44090 const skipOrientation = bucket.allowVerticalPlacement && !symbol.placedOrientation;
44091 const variableOffset = (!symbol.hidden && symbol.crossTileID && !skipOrientation) ? variableOffsets[symbol.crossTileID] : null;
44092 if (!variableOffset) {
44093 // These symbols are from a justification that is not being used, or a label that wasn't placed
44094 // so we don't need to do the extra math to figure out what incremental shift to apply.
44095 hideGlyphs(symbol.numGlyphs, dynamicTextLayoutVertexArray);
44096 }
44097 else {
44098 const tileAnchor = new performance.pointGeometry(symbol.anchorX, symbol.anchorY);
44099 const projectedAnchor = project(tileAnchor, pitchWithMap ? posMatrix : labelPlaneMatrix);
44100 const perspectiveRatio = getPerspectiveRatio(transform.cameraToCenterDistance, projectedAnchor.signedDistanceFromCamera);
44101 let renderTextSize = performance.evaluateSizeForFeature(bucket.textSizeData, size, symbol) * perspectiveRatio / performance.ONE_EM;
44102 if (pitchWithMap) {
44103 // Go from size in pixels to equivalent size in tile units
44104 renderTextSize *= bucket.tilePixelRatio / tileScale;
44105 }
44106 const { width, height, anchor, textOffset, textBoxScale } = variableOffset;
44107 const shift = calculateVariableRenderShift(anchor, width, height, textOffset, textBoxScale, renderTextSize);
44108 // Usual case is that we take the projected anchor and add the pixel-based shift
44109 // calculated above. In the (somewhat weird) case of pitch-aligned text, we add an equivalent
44110 // tile-unit based shift to the anchor before projecting to the label plane.
44111 const shiftedAnchor = pitchWithMap ?
44112 project(tileAnchor.add(shift), labelPlaneMatrix).point :
44113 projectedAnchor.point.add(rotateWithMap ?
44114 shift.rotate(-transform.angle) :
44115 shift);
44116 const angle = (bucket.allowVerticalPlacement && symbol.placedOrientation === performance.WritingMode.vertical) ? Math.PI / 2 : 0;
44117 for (let g = 0; g < symbol.numGlyphs; g++) {
44118 performance.addDynamicAttributes(dynamicTextLayoutVertexArray, shiftedAnchor, angle);
44119 }
44120 //Only offset horizontal text icons
44121 if (updateTextFitIcon && symbol.associatedIconIndex >= 0) {
44122 placedTextShifts[symbol.associatedIconIndex] = { shiftedAnchor, angle };
44123 }
44124 }
44125 }
44126 if (updateTextFitIcon) {
44127 dynamicIconLayoutVertexArray.clear();
44128 const placedIcons = bucket.icon.placedSymbolArray;
44129 for (let i = 0; i < placedIcons.length; i++) {
44130 const placedIcon = placedIcons.get(i);
44131 if (placedIcon.hidden) {
44132 hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray);
44133 }
44134 else {
44135 const shift = placedTextShifts[i];
44136 if (!shift) {
44137 hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray);
44138 }
44139 else {
44140 for (let g = 0; g < placedIcon.numGlyphs; g++) {
44141 performance.addDynamicAttributes(dynamicIconLayoutVertexArray, shift.shiftedAnchor, shift.angle);
44142 }
44143 }
44144 }
44145 }
44146 bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicIconLayoutVertexArray);
44147 }
44148 bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicTextLayoutVertexArray);
44149}
44150function getSymbolProgramName(isSDF, isText, bucket) {
44151 if (bucket.iconsInText && isText) {
44152 return 'symbolTextAndIcon';
44153 }
44154 else if (isSDF) {
44155 return 'symbolSDF';
44156 }
44157 else {
44158 return 'symbolIcon';
44159 }
44160}
44161function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor, rotationAlignment, pitchAlignment, keepUpright, stencilMode, colorMode) {
44162 const context = painter.context;
44163 const gl = context.gl;
44164 const tr = painter.transform;
44165 const rotateWithMap = rotationAlignment === 'map';
44166 const pitchWithMap = pitchAlignment === 'map';
44167 const alongLine = rotationAlignment !== 'viewport' && layer.layout.get('symbol-placement') !== 'point';
44168 // Line label rotation happens in `updateLineLabels`
44169 // Pitched point labels are automatically rotated by the labelPlaneMatrix projection
44170 // Unpitched point labels need to have their rotation applied after projection
44171 const rotateInShader = rotateWithMap && !pitchWithMap && !alongLine;
44172 const hasSortKey = !layer.layout.get('symbol-sort-key').isConstant();
44173 let sortFeaturesByKey = false;
44174 const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);
44175 const variablePlacement = layer.layout.get('text-variable-anchor');
44176 const tileRenderState = [];
44177 for (const coord of coords) {
44178 const tile = sourceCache.getTile(coord);
44179 const bucket = tile.getBucket(layer);
44180 if (!bucket)
44181 continue;
44182 const buffers = isText ? bucket.text : bucket.icon;
44183 if (!buffers || !buffers.segments.get().length)
44184 continue;
44185 const programConfiguration = buffers.programConfigurations.get(layer.id);
44186 const isSDF = isText || bucket.sdfIcons;
44187 const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData;
44188 const transformed = pitchWithMap || tr.pitch !== 0;
44189 const program = painter.useProgram(getSymbolProgramName(isSDF, isText, bucket), programConfiguration);
44190 const size = performance.evaluateSizeForZoom(sizeData, tr.zoom);
44191 let texSize;
44192 let texSizeIcon = [0, 0];
44193 let atlasTexture;
44194 let atlasInterpolation;
44195 let atlasTextureIcon = null;
44196 let atlasInterpolationIcon;
44197 if (isText) {
44198 atlasTexture = tile.glyphAtlasTexture;
44199 atlasInterpolation = gl.LINEAR;
44200 texSize = tile.glyphAtlasTexture.size;
44201 if (bucket.iconsInText) {
44202 texSizeIcon = tile.imageAtlasTexture.size;
44203 atlasTextureIcon = tile.imageAtlasTexture;
44204 const zoomDependentSize = sizeData.kind === 'composite' || sizeData.kind === 'camera';
44205 atlasInterpolationIcon = transformed || painter.options.rotating || painter.options.zooming || zoomDependentSize ? gl.LINEAR : gl.NEAREST;
44206 }
44207 }
44208 else {
44209 const iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear;
44210 atlasTexture = tile.imageAtlasTexture;
44211 atlasInterpolation = isSDF || painter.options.rotating || painter.options.zooming || iconScaled || transformed ?
44212 gl.LINEAR :
44213 gl.NEAREST;
44214 texSize = tile.imageAtlasTexture.size;
44215 }
44216 const s = pixelsToTileUnits(tile, 1, painter.transform.zoom);
44217 const labelPlaneMatrix = getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s);
44218 const glCoordMatrix = getGlCoordMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s);
44219 const hasVariableAnchors = variablePlacement && bucket.hasTextData();
44220 const updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' &&
44221 hasVariableAnchors &&
44222 bucket.hasIconData();
44223 if (alongLine) {
44224 const rotateToLine = layer.layout.get('text-rotation-alignment') === 'map';
44225 updateLineLabels(bucket, coord.posMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright, rotateToLine);
44226 }
44227 const matrix = painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor), uLabelPlaneMatrix = (alongLine || (isText && variablePlacement) || updateTextFitIcon) ? identityMat4 : labelPlaneMatrix, uglCoordMatrix = painter.translatePosMatrix(glCoordMatrix, tile, translate, translateAnchor, true);
44228 const hasHalo = isSDF && layer.paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0;
44229 let uniformValues;
44230 if (isSDF) {
44231 if (!bucket.iconsInText) {
44232 uniformValues = symbolSDFUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, true);
44233 }
44234 else {
44235 uniformValues = symbolTextAndIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, texSize, texSizeIcon);
44236 }
44237 }
44238 else {
44239 uniformValues = symbolIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize);
44240 }
44241 const state = {
44242 program,
44243 buffers,
44244 uniformValues,
44245 atlasTexture,
44246 atlasTextureIcon,
44247 atlasInterpolation,
44248 atlasInterpolationIcon,
44249 isSDF,
44250 hasHalo
44251 };
44252 if (hasSortKey && bucket.canOverlap) {
44253 sortFeaturesByKey = true;
44254 const oldSegments = buffers.segments.get();
44255 for (const segment of oldSegments) {
44256 tileRenderState.push({
44257 segments: new performance.SegmentVector([segment]),
44258 sortKey: segment.sortKey,
44259 state
44260 });
44261 }
44262 }
44263 else {
44264 tileRenderState.push({
44265 segments: buffers.segments,
44266 sortKey: 0,
44267 state
44268 });
44269 }
44270 }
44271 if (sortFeaturesByKey) {
44272 tileRenderState.sort((a, b) => a.sortKey - b.sortKey);
44273 }
44274 for (const segmentState of tileRenderState) {
44275 const state = segmentState.state;
44276 context.activeTexture.set(gl.TEXTURE0);
44277 state.atlasTexture.bind(state.atlasInterpolation, gl.CLAMP_TO_EDGE);
44278 if (state.atlasTextureIcon) {
44279 context.activeTexture.set(gl.TEXTURE1);
44280 if (state.atlasTextureIcon) {
44281 state.atlasTextureIcon.bind(state.atlasInterpolationIcon, gl.CLAMP_TO_EDGE);
44282 }
44283 }
44284 if (state.isSDF) {
44285 const uniformValues = state.uniformValues;
44286 if (state.hasHalo) {
44287 uniformValues['u_is_halo'] = 1;
44288 drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, uniformValues);
44289 }
44290 uniformValues['u_is_halo'] = 0;
44291 }
44292 drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, state.uniformValues);
44293 }
44294}
44295function drawSymbolElements(buffers, segments, layer, painter, program, depthMode, stencilMode, colorMode, uniformValues) {
44296 const context = painter.context;
44297 const gl = context.gl;
44298 program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, segments, layer.paint, painter.transform.zoom, buffers.programConfigurations.get(layer.id), buffers.dynamicLayoutVertexBuffer, buffers.opacityVertexBuffer);
44299}
44300
44301function drawCircles(painter, sourceCache, layer, coords) {
44302 if (painter.renderPass !== 'translucent')
44303 return;
44304 const opacity = layer.paint.get('circle-opacity');
44305 const strokeWidth = layer.paint.get('circle-stroke-width');
44306 const strokeOpacity = layer.paint.get('circle-stroke-opacity');
44307 const sortFeaturesByKey = !layer.layout.get('circle-sort-key').isConstant();
44308 if (opacity.constantOr(1) === 0 && (strokeWidth.constantOr(1) === 0 || strokeOpacity.constantOr(1) === 0)) {
44309 return;
44310 }
44311 const context = painter.context;
44312 const gl = context.gl;
44313 const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);
44314 // Turn off stencil testing to allow circles to be drawn across boundaries,
44315 // so that large circles are not clipped to tiles
44316 const stencilMode = StencilMode.disabled;
44317 const colorMode = painter.colorModeForRenderPass();
44318 const segmentsRenderStates = [];
44319 for (let i = 0; i < coords.length; i++) {
44320 const coord = coords[i];
44321 const tile = sourceCache.getTile(coord);
44322 const bucket = tile.getBucket(layer);
44323 if (!bucket)
44324 continue;
44325 const programConfiguration = bucket.programConfigurations.get(layer.id);
44326 const program = painter.useProgram('circle', programConfiguration);
44327 const layoutVertexBuffer = bucket.layoutVertexBuffer;
44328 const indexBuffer = bucket.indexBuffer;
44329 const uniformValues = circleUniformValues(painter, coord, tile, layer);
44330 const state = {
44331 programConfiguration,
44332 program,
44333 layoutVertexBuffer,
44334 indexBuffer,
44335 uniformValues,
44336 };
44337 if (sortFeaturesByKey) {
44338 const oldSegments = bucket.segments.get();
44339 for (const segment of oldSegments) {
44340 segmentsRenderStates.push({
44341 segments: new performance.SegmentVector([segment]),
44342 sortKey: segment.sortKey,
44343 state
44344 });
44345 }
44346 }
44347 else {
44348 segmentsRenderStates.push({
44349 segments: bucket.segments,
44350 sortKey: 0,
44351 state
44352 });
44353 }
44354 }
44355 if (sortFeaturesByKey) {
44356 segmentsRenderStates.sort((a, b) => a.sortKey - b.sortKey);
44357 }
44358 for (const segmentsState of segmentsRenderStates) {
44359 const { programConfiguration, program, layoutVertexBuffer, indexBuffer, uniformValues } = segmentsState.state;
44360 const segments = segmentsState.segments;
44361 program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, layoutVertexBuffer, indexBuffer, segments, layer.paint, painter.transform.zoom, programConfiguration);
44362 }
44363}
44364
44365function drawHeatmap(painter, sourceCache, layer, coords) {
44366 if (layer.paint.get('heatmap-opacity') === 0) {
44367 return;
44368 }
44369 if (painter.renderPass === 'offscreen') {
44370 const context = painter.context;
44371 const gl = context.gl;
44372 // Allow kernels to be drawn across boundaries, so that
44373 // large kernels are not clipped to tiles
44374 const stencilMode = StencilMode.disabled;
44375 // Turn on additive blending for kernels, which is a key aspect of kernel density estimation formula
44376 const colorMode = new ColorMode([gl.ONE, gl.ONE], performance.Color.transparent, [true, true, true, true]);
44377 bindFramebuffer(context, painter, layer);
44378 context.clear({ color: performance.Color.transparent });
44379 for (let i = 0; i < coords.length; i++) {
44380 const coord = coords[i];
44381 // Skip tiles that have uncovered parents to avoid flickering; we don't need
44382 // to use complex tile masking here because the change between zoom levels is subtle,
44383 // so it's fine to simply render the parent until all its 4 children are loaded
44384 if (sourceCache.hasRenderableParent(coord))
44385 continue;
44386 const tile = sourceCache.getTile(coord);
44387 const bucket = tile.getBucket(layer);
44388 if (!bucket)
44389 continue;
44390 const programConfiguration = bucket.programConfigurations.get(layer.id);
44391 const program = painter.useProgram('heatmap', programConfiguration);
44392 const { zoom } = painter.transform;
44393 program.draw(context, gl.TRIANGLES, DepthMode.disabled, stencilMode, colorMode, CullFaceMode.disabled, heatmapUniformValues(coord.posMatrix, tile, zoom, layer.paint.get('heatmap-intensity')), layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration);
44394 }
44395 context.viewport.set([0, 0, painter.width, painter.height]);
44396 }
44397 else if (painter.renderPass === 'translucent') {
44398 painter.context.setColorMode(painter.colorModeForRenderPass());
44399 renderTextureToMap(painter, layer);
44400 }
44401}
44402function bindFramebuffer(context, painter, layer) {
44403 const gl = context.gl;
44404 context.activeTexture.set(gl.TEXTURE1);
44405 // Use a 4x downscaled screen texture for better performance
44406 context.viewport.set([0, 0, painter.width / 4, painter.height / 4]);
44407 let fbo = layer.heatmapFbo;
44408 if (!fbo) {
44409 const texture = gl.createTexture();
44410 gl.bindTexture(gl.TEXTURE_2D, texture);
44411 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
44412 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
44413 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
44414 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
44415 fbo = layer.heatmapFbo = context.createFramebuffer(painter.width / 4, painter.height / 4, false);
44416 bindTextureToFramebuffer(context, painter, texture, fbo);
44417 }
44418 else {
44419 gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get());
44420 context.bindFramebuffer.set(fbo.framebuffer);
44421 }
44422}
44423function bindTextureToFramebuffer(context, painter, texture, fbo) {
44424 const gl = context.gl;
44425 // Use the higher precision half-float texture where available (producing much smoother looking heatmaps);
44426 // Otherwise, fall back to a low precision texture
44427 const internalFormat = context.extRenderToTextureHalfFloat ? context.extTextureHalfFloat.HALF_FLOAT_OES : gl.UNSIGNED_BYTE;
44428 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, painter.width / 4, painter.height / 4, 0, gl.RGBA, internalFormat, null);
44429 fbo.colorAttachment.set(texture);
44430}
44431function renderTextureToMap(painter, layer) {
44432 const context = painter.context;
44433 const gl = context.gl;
44434 // Here we bind two different textures from which we'll sample in drawing
44435 // heatmaps: the kernel texture, prepared in the offscreen pass, and a
44436 // color ramp texture.
44437 const fbo = layer.heatmapFbo;
44438 if (!fbo)
44439 return;
44440 context.activeTexture.set(gl.TEXTURE0);
44441 gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get());
44442 context.activeTexture.set(gl.TEXTURE1);
44443 let colorRampTexture = layer.colorRampTexture;
44444 if (!colorRampTexture) {
44445 colorRampTexture = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA);
44446 }
44447 colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
44448 painter.useProgram('heatmapTexture').draw(context, gl.TRIANGLES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, heatmapTextureUniformValues(painter, layer, 0, 1), layer.id, painter.viewportBuffer, painter.quadTriangleIndexBuffer, painter.viewportSegments, layer.paint, painter.transform.zoom);
44449}
44450
44451function drawLine(painter, sourceCache, layer, coords) {
44452 if (painter.renderPass !== 'translucent')
44453 return;
44454 const opacity = layer.paint.get('line-opacity');
44455 const width = layer.paint.get('line-width');
44456 if (opacity.constantOr(1) === 0 || width.constantOr(1) === 0)
44457 return;
44458 const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);
44459 const colorMode = painter.colorModeForRenderPass();
44460 const dasharray = layer.paint.get('line-dasharray');
44461 const patternProperty = layer.paint.get('line-pattern');
44462 const image = patternProperty.constantOr(1);
44463 const gradient = layer.paint.get('line-gradient');
44464 const crossfade = layer.getCrossfadeParameters();
44465 const programId = image ? 'linePattern' :
44466 dasharray ? 'lineSDF' :
44467 gradient ? 'lineGradient' : 'line';
44468 const context = painter.context;
44469 const gl = context.gl;
44470 let firstTile = true;
44471 for (const coord of coords) {
44472 const tile = sourceCache.getTile(coord);
44473 if (image && !tile.patternsLoaded())
44474 continue;
44475 const bucket = tile.getBucket(layer);
44476 if (!bucket)
44477 continue;
44478 const programConfiguration = bucket.programConfigurations.get(layer.id);
44479 const prevProgram = painter.context.program.get();
44480 const program = painter.useProgram(programId, programConfiguration);
44481 const programChanged = firstTile || program.program !== prevProgram;
44482 const constantPattern = patternProperty.constantOr(null);
44483 if (constantPattern && tile.imageAtlas) {
44484 const atlas = tile.imageAtlas;
44485 const posTo = atlas.patternPositions[constantPattern.to.toString()];
44486 const posFrom = atlas.patternPositions[constantPattern.from.toString()];
44487 if (posTo && posFrom)
44488 programConfiguration.setConstantPatternPositions(posTo, posFrom);
44489 }
44490 const uniformValues = image ? linePatternUniformValues(painter, tile, layer, crossfade) :
44491 dasharray ? lineSDFUniformValues(painter, tile, layer, dasharray, crossfade) :
44492 gradient ? lineGradientUniformValues(painter, tile, layer, bucket.lineClipsArray.length) :
44493 lineUniformValues(painter, tile, layer);
44494 if (image) {
44495 context.activeTexture.set(gl.TEXTURE0);
44496 tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
44497 programConfiguration.updatePaintBuffers(crossfade);
44498 }
44499 else if (dasharray && (programChanged || painter.lineAtlas.dirty)) {
44500 context.activeTexture.set(gl.TEXTURE0);
44501 painter.lineAtlas.bind(context);
44502 }
44503 else if (gradient) {
44504 const layerGradient = bucket.gradients[layer.id];
44505 let gradientTexture = layerGradient.texture;
44506 if (layer.gradientVersion !== layerGradient.version) {
44507 let textureResolution = 256;
44508 if (layer.stepInterpolant) {
44509 const sourceMaxZoom = sourceCache.getSource().maxzoom;
44510 const potentialOverzoom = coord.canonical.z === sourceMaxZoom ?
44511 Math.ceil(1 << (painter.transform.maxZoom - coord.canonical.z)) : 1;
44512 const lineLength = bucket.maxLineLength / performance.EXTENT;
44513 // Logical pixel tile size is 512px, and 1024px right before current zoom + 1
44514 const maxTilePixelSize = 1024;
44515 // Maximum possible texture coverage heuristic, bound by hardware max texture size
44516 const maxTextureCoverage = lineLength * maxTilePixelSize * potentialOverzoom;
44517 textureResolution = performance.clamp(performance.nextPowerOfTwo(maxTextureCoverage), 256, context.maxTextureSize);
44518 }
44519 layerGradient.gradient = performance.renderColorRamp({
44520 expression: layer.gradientExpression(),
44521 evaluationKey: 'lineProgress',
44522 resolution: textureResolution,
44523 image: layerGradient.gradient || undefined,
44524 clips: bucket.lineClipsArray
44525 });
44526 if (layerGradient.texture) {
44527 layerGradient.texture.update(layerGradient.gradient);
44528 }
44529 else {
44530 layerGradient.texture = new Texture(context, layerGradient.gradient, gl.RGBA);
44531 }
44532 layerGradient.version = layer.gradientVersion;
44533 gradientTexture = layerGradient.texture;
44534 }
44535 context.activeTexture.set(gl.TEXTURE0);
44536 gradientTexture.bind(layer.stepInterpolant ? gl.NEAREST : gl.LINEAR, gl.CLAMP_TO_EDGE);
44537 }
44538 program.draw(context, gl.TRIANGLES, depthMode, painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration, bucket.layoutVertexBuffer2);
44539 firstTile = false;
44540 // once refactored so that bound texture state is managed, we'll also be able to remove this firstTile/programChanged logic
44541 }
44542}
44543
44544function drawFill(painter, sourceCache, layer, coords) {
44545 const color = layer.paint.get('fill-color');
44546 const opacity = layer.paint.get('fill-opacity');
44547 if (opacity.constantOr(1) === 0) {
44548 return;
44549 }
44550 const colorMode = painter.colorModeForRenderPass();
44551 const pattern = layer.paint.get('fill-pattern');
44552 const pass = painter.opaquePassEnabledForLayer() &&
44553 (!pattern.constantOr(1) &&
44554 color.constantOr(performance.Color.transparent).a === 1 &&
44555 opacity.constantOr(0) === 1) ? 'opaque' : 'translucent';
44556 // Draw fill
44557 if (painter.renderPass === pass) {
44558 const depthMode = painter.depthModeForSublayer(1, painter.renderPass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly);
44559 drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, false);
44560 }
44561 // Draw stroke
44562 if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) {
44563 // If we defined a different color for the fill outline, we are
44564 // going to ignore the bits in 0x07 and just care about the global
44565 // clipping mask.
44566 // Otherwise, we only want to drawFill the antialiased parts that are
44567 // *outside* the current shape. This is important in case the fill
44568 // or stroke color is translucent. If we wouldn't clip to outside
44569 // the current shape, some pixels from the outline stroke overlapped
44570 // the (non-antialiased) fill.
44571 const depthMode = painter.depthModeForSublayer(layer.getPaintProperty('fill-outline-color') ? 2 : 0, DepthMode.ReadOnly);
44572 drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, true);
44573 }
44574}
44575function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, isOutline) {
44576 const gl = painter.context.gl;
44577 const patternProperty = layer.paint.get('fill-pattern');
44578 const image = patternProperty && patternProperty.constantOr(1);
44579 const crossfade = layer.getCrossfadeParameters();
44580 let drawMode, programName, uniformValues, indexBuffer, segments;
44581 if (!isOutline) {
44582 programName = image ? 'fillPattern' : 'fill';
44583 drawMode = gl.TRIANGLES;
44584 }
44585 else {
44586 programName = image && !layer.getPaintProperty('fill-outline-color') ? 'fillOutlinePattern' : 'fillOutline';
44587 drawMode = gl.LINES;
44588 }
44589 for (const coord of coords) {
44590 const tile = sourceCache.getTile(coord);
44591 if (image && !tile.patternsLoaded())
44592 continue;
44593 const bucket = tile.getBucket(layer);
44594 if (!bucket)
44595 continue;
44596 const programConfiguration = bucket.programConfigurations.get(layer.id);
44597 const program = painter.useProgram(programName, programConfiguration);
44598 if (image) {
44599 painter.context.activeTexture.set(gl.TEXTURE0);
44600 tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
44601 programConfiguration.updatePaintBuffers(crossfade);
44602 }
44603 const constantPattern = patternProperty.constantOr(null);
44604 if (constantPattern && tile.imageAtlas) {
44605 const atlas = tile.imageAtlas;
44606 const posTo = atlas.patternPositions[constantPattern.to.toString()];
44607 const posFrom = atlas.patternPositions[constantPattern.from.toString()];
44608 if (posTo && posFrom)
44609 programConfiguration.setConstantPatternPositions(posTo, posFrom);
44610 }
44611 const tileMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('fill-translate'), layer.paint.get('fill-translate-anchor'));
44612 if (!isOutline) {
44613 indexBuffer = bucket.indexBuffer;
44614 segments = bucket.segments;
44615 uniformValues = image ?
44616 fillPatternUniformValues(tileMatrix, painter, crossfade, tile) :
44617 fillUniformValues(tileMatrix);
44618 }
44619 else {
44620 indexBuffer = bucket.indexBuffer2;
44621 segments = bucket.segments2;
44622 const drawingBufferSize = [gl.drawingBufferWidth, gl.drawingBufferHeight];
44623 uniformValues = (programName === 'fillOutlinePattern' && image) ?
44624 fillOutlinePatternUniformValues(tileMatrix, painter, crossfade, tile, drawingBufferSize) :
44625 fillOutlineUniformValues(tileMatrix, drawingBufferSize);
44626 }
44627 program.draw(painter.context, drawMode, depthMode, painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, indexBuffer, segments, layer.paint, painter.transform.zoom, programConfiguration);
44628 }
44629}
44630
44631function draw$1(painter, source, layer, coords) {
44632 const opacity = layer.paint.get('fill-extrusion-opacity');
44633 if (opacity === 0) {
44634 return;
44635 }
44636 if (painter.renderPass === 'translucent') {
44637 const depthMode = new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);
44638 if (opacity === 1 && !layer.paint.get('fill-extrusion-pattern').constantOr(1)) {
44639 const colorMode = painter.colorModeForRenderPass();
44640 drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, colorMode);
44641 }
44642 else {
44643 // Draw transparent buildings in two passes so that only the closest surface is drawn.
44644 // First draw all the extrusions into only the depth buffer. No colors are drawn.
44645 drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, ColorMode.disabled);
44646 // Then draw all the extrusions a second type, only coloring fragments if they have the
44647 // same depth value as the closest fragment in the previous pass. Use the stencil buffer
44648 // to prevent the second draw in cases where we have coincident polygons.
44649 drawExtrusionTiles(painter, source, layer, coords, depthMode, painter.stencilModeFor3D(), painter.colorModeForRenderPass());
44650 }
44651 }
44652}
44653function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMode, colorMode) {
44654 const context = painter.context;
44655 const gl = context.gl;
44656 const patternProperty = layer.paint.get('fill-extrusion-pattern');
44657 const image = patternProperty.constantOr(1);
44658 const crossfade = layer.getCrossfadeParameters();
44659 const opacity = layer.paint.get('fill-extrusion-opacity');
44660 for (const coord of coords) {
44661 const tile = source.getTile(coord);
44662 const bucket = tile.getBucket(layer);
44663 if (!bucket)
44664 continue;
44665 const programConfiguration = bucket.programConfigurations.get(layer.id);
44666 const program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration);
44667 if (image) {
44668 painter.context.activeTexture.set(gl.TEXTURE0);
44669 tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
44670 programConfiguration.updatePaintBuffers(crossfade);
44671 }
44672 const constantPattern = patternProperty.constantOr(null);
44673 if (constantPattern && tile.imageAtlas) {
44674 const atlas = tile.imageAtlas;
44675 const posTo = atlas.patternPositions[constantPattern.to.toString()];
44676 const posFrom = atlas.patternPositions[constantPattern.from.toString()];
44677 if (posTo && posFrom)
44678 programConfiguration.setConstantPatternPositions(posTo, posFrom);
44679 }
44680 const matrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('fill-extrusion-translate'), layer.paint.get('fill-extrusion-translate-anchor'));
44681 const shouldUseVerticalGradient = layer.paint.get('fill-extrusion-vertical-gradient');
44682 const uniformValues = image ?
44683 fillExtrusionPatternUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile) :
44684 fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity);
44685 program.draw(context, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.backCCW, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration);
44686 }
44687}
44688
44689function drawHillshade(painter, sourceCache, layer, tileIDs) {
44690 if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent')
44691 return;
44692 const context = painter.context;
44693 const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);
44694 const colorMode = painter.colorModeForRenderPass();
44695 const [stencilModes, coords] = painter.renderPass === 'translucent' ?
44696 painter.stencilConfigForOverlap(tileIDs) : [{}, tileIDs];
44697 for (const coord of coords) {
44698 const tile = sourceCache.getTile(coord);
44699 if (tile.needsHillshadePrepare && painter.renderPass === 'offscreen') {
44700 prepareHillshade(painter, tile, layer, depthMode, StencilMode.disabled, colorMode);
44701 }
44702 else if (painter.renderPass === 'translucent') {
44703 renderHillshade(painter, tile, layer, depthMode, stencilModes[coord.overscaledZ], colorMode);
44704 }
44705 }
44706 context.viewport.set([0, 0, painter.width, painter.height]);
44707}
44708function renderHillshade(painter, tile, layer, depthMode, stencilMode, colorMode) {
44709 const context = painter.context;
44710 const gl = context.gl;
44711 const fbo = tile.fbo;
44712 if (!fbo)
44713 return;
44714 const program = painter.useProgram('hillshade');
44715 context.activeTexture.set(gl.TEXTURE0);
44716 gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get());
44717 const uniformValues = hillshadeUniformValues(painter, tile, layer);
44718 program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments);
44719}
44720// hillshade rendering is done in two steps. the prepare step first calculates the slope of the terrain in the x and y
44721// directions for each pixel, and saves those values to a framebuffer texture in the r and g channels.
44722function prepareHillshade(painter, tile, layer, depthMode, stencilMode, colorMode) {
44723 const context = painter.context;
44724 const gl = context.gl;
44725 const dem = tile.dem;
44726 if (dem && dem.data) {
44727 const tileSize = dem.dim;
44728 const textureStride = dem.stride;
44729 const pixelData = dem.getPixels();
44730 context.activeTexture.set(gl.TEXTURE1);
44731 context.pixelStoreUnpackPremultiplyAlpha.set(false);
44732 tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride);
44733 if (tile.demTexture) {
44734 const demTexture = tile.demTexture;
44735 demTexture.update(pixelData, { premultiply: false });
44736 demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);
44737 }
44738 else {
44739 tile.demTexture = new Texture(context, pixelData, gl.RGBA, { premultiply: false });
44740 tile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);
44741 }
44742 context.activeTexture.set(gl.TEXTURE0);
44743 let fbo = tile.fbo;
44744 if (!fbo) {
44745 const renderTexture = new Texture(context, { width: tileSize, height: tileSize, data: null }, gl.RGBA);
44746 renderTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
44747 fbo = tile.fbo = context.createFramebuffer(tileSize, tileSize, true);
44748 fbo.colorAttachment.set(renderTexture.texture);
44749 }
44750 context.bindFramebuffer.set(fbo.framebuffer);
44751 context.viewport.set([0, 0, tileSize, tileSize]);
44752 painter.useProgram('hillshadePrepare').draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, hillshadeUniformPrepareValues(tile.tileID, dem), layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments);
44753 tile.needsHillshadePrepare = false;
44754 }
44755}
44756
44757function drawRaster(painter, sourceCache, layer, tileIDs) {
44758 if (painter.renderPass !== 'translucent')
44759 return;
44760 if (layer.paint.get('raster-opacity') === 0)
44761 return;
44762 if (!tileIDs.length)
44763 return;
44764 const context = painter.context;
44765 const gl = context.gl;
44766 const source = sourceCache.getSource();
44767 const program = painter.useProgram('raster');
44768 const colorMode = painter.colorModeForRenderPass();
44769 const [stencilModes, coords] = source instanceof ImageSource ? [{}, tileIDs] :
44770 painter.stencilConfigForOverlap(tileIDs);
44771 const minTileZ = coords[coords.length - 1].overscaledZ;
44772 const align = !painter.options.moving;
44773 for (const coord of coords) {
44774 // Set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers
44775 // Use gl.LESS to prevent double drawing in areas where tiles overlap.
44776 const depthMode = painter.depthModeForSublayer(coord.overscaledZ - minTileZ, layer.paint.get('raster-opacity') === 1 ? DepthMode.ReadWrite : DepthMode.ReadOnly, gl.LESS);
44777 const tile = sourceCache.getTile(coord);
44778 const posMatrix = painter.transform.calculatePosMatrix(coord.toUnwrapped(), align);
44779 tile.registerFadeDuration(layer.paint.get('raster-fade-duration'));
44780 const parentTile = sourceCache.findLoadedParent(coord, 0), fade = getFadeValues(tile, parentTile, sourceCache, layer, painter.transform);
44781 let parentScaleBy, parentTL;
44782 const textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR;
44783 context.activeTexture.set(gl.TEXTURE0);
44784 tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST);
44785 context.activeTexture.set(gl.TEXTURE1);
44786 if (parentTile) {
44787 parentTile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST);
44788 parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ);
44789 parentTL = [tile.tileID.canonical.x * parentScaleBy % 1, tile.tileID.canonical.y * parentScaleBy % 1];
44790 }
44791 else {
44792 tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST);
44793 }
44794 const uniformValues = rasterUniformValues(posMatrix, parentTL || [0, 0], parentScaleBy || 1, fade, layer);
44795 if (source instanceof ImageSource) {
44796 program.draw(context, gl.TRIANGLES, depthMode, StencilMode.disabled, colorMode, CullFaceMode.disabled, uniformValues, layer.id, source.boundsBuffer, painter.quadTriangleIndexBuffer, source.boundsSegments);
44797 }
44798 else {
44799 program.draw(context, gl.TRIANGLES, depthMode, stencilModes[coord.overscaledZ], colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments);
44800 }
44801 }
44802}
44803function getFadeValues(tile, parentTile, sourceCache, layer, transform) {
44804 const fadeDuration = layer.paint.get('raster-fade-duration');
44805 if (fadeDuration > 0) {
44806 const now = performance.exported.now();
44807 const sinceTile = (now - tile.timeAdded) / fadeDuration;
44808 const sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1;
44809 const source = sourceCache.getSource();
44810 const idealZ = transform.coveringZoomLevel({
44811 tileSize: source.tileSize,
44812 roundZoom: source.roundZoom
44813 });
44814 // if no parent or parent is older, fade in; if parent is younger, fade out
44815 const fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ);
44816 const childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : performance.clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1);
44817 // we don't crossfade tiles that were just refreshed upon expiring:
44818 // once they're old enough to pass the crossfading threshold
44819 // (fadeDuration), unset the `refreshedUponExpiration` flag so we don't
44820 // incorrectly fail to crossfade them when zooming
44821 if (tile.refreshedUponExpiration && sinceTile >= 1)
44822 tile.refreshedUponExpiration = false;
44823 if (parentTile) {
44824 return {
44825 opacity: 1,
44826 mix: 1 - childOpacity
44827 };
44828 }
44829 else {
44830 return {
44831 opacity: childOpacity,
44832 mix: 0
44833 };
44834 }
44835 }
44836 else {
44837 return {
44838 opacity: 1,
44839 mix: 0
44840 };
44841 }
44842}
44843
44844function drawBackground(painter, sourceCache, layer) {
44845 const color = layer.paint.get('background-color');
44846 const opacity = layer.paint.get('background-opacity');
44847 if (opacity === 0)
44848 return;
44849 const context = painter.context;
44850 const gl = context.gl;
44851 const transform = painter.transform;
44852 const tileSize = transform.tileSize;
44853 const image = layer.paint.get('background-pattern');
44854 if (painter.isPatternMissing(image))
44855 return;
44856 const pass = (!image && color.a === 1 && opacity === 1 && painter.opaquePassEnabledForLayer()) ? 'opaque' : 'translucent';
44857 if (painter.renderPass !== pass)
44858 return;
44859 const stencilMode = StencilMode.disabled;
44860 const depthMode = painter.depthModeForSublayer(0, pass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly);
44861 const colorMode = painter.colorModeForRenderPass();
44862 const program = painter.useProgram(image ? 'backgroundPattern' : 'background');
44863 const tileIDs = transform.coveringTiles({ tileSize });
44864 if (image) {
44865 context.activeTexture.set(gl.TEXTURE0);
44866 painter.imageManager.bind(painter.context);
44867 }
44868 const crossfade = layer.getCrossfadeParameters();
44869 for (const tileID of tileIDs) {
44870 const matrix = painter.transform.calculatePosMatrix(tileID.toUnwrapped());
44871 const uniformValues = image ?
44872 backgroundPatternUniformValues(matrix, opacity, painter, image, { tileID, tileSize }, crossfade) :
44873 backgroundUniformValues(matrix, opacity, color);
44874 program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.tileExtentBuffer, painter.quadTriangleIndexBuffer, painter.tileExtentSegments);
44875 }
44876}
44877
44878const topColor = new performance.Color(1, 0, 0, 1);
44879const btmColor = new performance.Color(0, 1, 0, 1);
44880const leftColor = new performance.Color(0, 0, 1, 1);
44881const rightColor = new performance.Color(1, 0, 1, 1);
44882const centerColor = new performance.Color(0, 1, 1, 1);
44883function drawDebugPadding(painter) {
44884 const padding = painter.transform.padding;
44885 const lineWidth = 3;
44886 // Top
44887 drawHorizontalLine(painter, painter.transform.height - (padding.top || 0), lineWidth, topColor);
44888 // Bottom
44889 drawHorizontalLine(painter, padding.bottom || 0, lineWidth, btmColor);
44890 // Left
44891 drawVerticalLine(painter, padding.left || 0, lineWidth, leftColor);
44892 // Right
44893 drawVerticalLine(painter, painter.transform.width - (padding.right || 0), lineWidth, rightColor);
44894 // Center
44895 const center = painter.transform.centerPoint;
44896 drawCrosshair(painter, center.x, painter.transform.height - center.y, centerColor);
44897}
44898function drawCrosshair(painter, x, y, color) {
44899 const size = 20;
44900 const lineWidth = 2;
44901 //Vertical line
44902 drawDebugSSRect(painter, x - lineWidth / 2, y - size / 2, lineWidth, size, color);
44903 //Horizontal line
44904 drawDebugSSRect(painter, x - size / 2, y - lineWidth / 2, size, lineWidth, color);
44905}
44906function drawHorizontalLine(painter, y, lineWidth, color) {
44907 drawDebugSSRect(painter, 0, y + lineWidth / 2, painter.transform.width, lineWidth, color);
44908}
44909function drawVerticalLine(painter, x, lineWidth, color) {
44910 drawDebugSSRect(painter, x - lineWidth / 2, 0, lineWidth, painter.transform.height, color);
44911}
44912function drawDebugSSRect(painter, x, y, width, height, color) {
44913 const context = painter.context;
44914 const gl = context.gl;
44915 gl.enable(gl.SCISSOR_TEST);
44916 gl.scissor(x * painter.pixelRatio, y * painter.pixelRatio, width * painter.pixelRatio, height * painter.pixelRatio);
44917 context.clear({ color });
44918 gl.disable(gl.SCISSOR_TEST);
44919}
44920function drawDebug(painter, sourceCache, coords) {
44921 for (let i = 0; i < coords.length; i++) {
44922 drawDebugTile(painter, sourceCache, coords[i]);
44923 }
44924}
44925function drawDebugTile(painter, sourceCache, coord) {
44926 const context = painter.context;
44927 const gl = context.gl;
44928 const posMatrix = coord.posMatrix;
44929 const program = painter.useProgram('debug');
44930 const depthMode = DepthMode.disabled;
44931 const stencilMode = StencilMode.disabled;
44932 const colorMode = painter.colorModeForRenderPass();
44933 const id = '$debug';
44934 context.activeTexture.set(gl.TEXTURE0);
44935 // Bind the empty texture for drawing outlines
44936 painter.emptyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
44937 program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, CullFaceMode.disabled, debugUniformValues(posMatrix, performance.Color.red), id, painter.debugBuffer, painter.tileBorderIndexBuffer, painter.debugSegments);
44938 const tileRawData = sourceCache.getTileByID(coord.key).latestRawTileData;
44939 const tileByteLength = (tileRawData && tileRawData.byteLength) || 0;
44940 const tileSizeKb = Math.floor(tileByteLength / 1024);
44941 const tileSize = sourceCache.getTile(coord).tileSize;
44942 const scaleRatio = (512 / Math.min(tileSize, 512) * (coord.overscaledZ / painter.transform.zoom)) * 0.5;
44943 let tileIdText = coord.canonical.toString();
44944 if (coord.overscaledZ !== coord.canonical.z) {
44945 tileIdText += ` => ${coord.overscaledZ}`;
44946 }
44947 const tileLabel = `${tileIdText} ${tileSizeKb}kb`;
44948 drawTextToOverlay(painter, tileLabel);
44949 program.draw(context, gl.TRIANGLES, depthMode, stencilMode, ColorMode.alphaBlended, CullFaceMode.disabled, debugUniformValues(posMatrix, performance.Color.transparent, scaleRatio), id, painter.debugBuffer, painter.quadTriangleIndexBuffer, painter.debugSegments);
44950}
44951function drawTextToOverlay(painter, text) {
44952 painter.initDebugOverlayCanvas();
44953 const canvas = painter.debugOverlayCanvas;
44954 const gl = painter.context.gl;
44955 const ctx2d = painter.debugOverlayCanvas.getContext('2d');
44956 ctx2d.clearRect(0, 0, canvas.width, canvas.height);
44957 ctx2d.shadowColor = 'white';
44958 ctx2d.shadowBlur = 2;
44959 ctx2d.lineWidth = 1.5;
44960 ctx2d.strokeStyle = 'white';
44961 ctx2d.textBaseline = 'top';
44962 ctx2d.font = `bold ${36}px Open Sans, sans-serif`;
44963 ctx2d.fillText(text, 5, 5);
44964 ctx2d.strokeText(text, 5, 5);
44965 painter.debugOverlayTexture.update(canvas);
44966 painter.debugOverlayTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
44967}
44968
44969function drawCustom(painter, sourceCache, layer) {
44970 const context = painter.context;
44971 const implementation = layer.implementation;
44972 if (painter.renderPass === 'offscreen') {
44973 const prerender = implementation.prerender;
44974 if (prerender) {
44975 painter.setCustomLayerDefaults();
44976 context.setColorMode(painter.colorModeForRenderPass());
44977 prerender.call(implementation, context.gl, painter.transform.customLayerMatrix());
44978 context.setDirty();
44979 painter.setBaseState();
44980 }
44981 }
44982 else if (painter.renderPass === 'translucent') {
44983 painter.setCustomLayerDefaults();
44984 context.setColorMode(painter.colorModeForRenderPass());
44985 context.setStencilMode(StencilMode.disabled);
44986 const depthMode = implementation.renderingMode === '3d' ?
44987 new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D) :
44988 painter.depthModeForSublayer(0, DepthMode.ReadOnly);
44989 context.setDepthMode(depthMode);
44990 implementation.render(context.gl, painter.transform.customLayerMatrix());
44991 context.setDirty();
44992 painter.setBaseState();
44993 context.bindFramebuffer.set(null);
44994 }
44995}
44996
44997const draw = {
44998 symbol: drawSymbols,
44999 circle: drawCircles,
45000 heatmap: drawHeatmap,
45001 line: drawLine,
45002 fill: drawFill,
45003 'fill-extrusion': draw$1,
45004 hillshade: drawHillshade,
45005 raster: drawRaster,
45006 background: drawBackground,
45007 debug: drawDebug,
45008 custom: drawCustom
45009};
45010/**
45011 * Initialize a new painter object.
45012 *
45013 * @param {Canvas} gl an experimental-webgl drawing context
45014 * @private
45015 */
45016class Painter {
45017 constructor(gl, transform) {
45018 this.context = new Context(gl);
45019 this.transform = transform;
45020 this._tileTextures = {};
45021 this.setup();
45022 // Within each layer there are multiple distinct z-planes that can be drawn to.
45023 // This is implemented using the WebGL depth buffer.
45024 this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1;
45025 this.depthEpsilon = 1 / Math.pow(2, 16);
45026 this.crossTileSymbolIndex = new CrossTileSymbolIndex();
45027 this.gpuTimers = {};
45028 }
45029 /*
45030 * Update the GL viewport, projection matrix, and transforms to compensate
45031 * for a new width and height value.
45032 */
45033 resize(width, height, pixelRatio) {
45034 this.width = width * pixelRatio;
45035 this.height = height * pixelRatio;
45036 this.pixelRatio = pixelRatio;
45037 this.context.viewport.set([0, 0, this.width, this.height]);
45038 if (this.style) {
45039 for (const layerId of this.style._order) {
45040 this.style._layers[layerId].resize();
45041 }
45042 }
45043 }
45044 setup() {
45045 const context = this.context;
45046 const tileExtentArray = new performance.PosArray();
45047 tileExtentArray.emplaceBack(0, 0);
45048 tileExtentArray.emplaceBack(performance.EXTENT, 0);
45049 tileExtentArray.emplaceBack(0, performance.EXTENT);
45050 tileExtentArray.emplaceBack(performance.EXTENT, performance.EXTENT);
45051 this.tileExtentBuffer = context.createVertexBuffer(tileExtentArray, posAttributes.members);
45052 this.tileExtentSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
45053 const debugArray = new performance.PosArray();
45054 debugArray.emplaceBack(0, 0);
45055 debugArray.emplaceBack(performance.EXTENT, 0);
45056 debugArray.emplaceBack(0, performance.EXTENT);
45057 debugArray.emplaceBack(performance.EXTENT, performance.EXTENT);
45058 this.debugBuffer = context.createVertexBuffer(debugArray, posAttributes.members);
45059 this.debugSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 5);
45060 const rasterBoundsArray = new performance.RasterBoundsArray();
45061 rasterBoundsArray.emplaceBack(0, 0, 0, 0);
45062 rasterBoundsArray.emplaceBack(performance.EXTENT, 0, performance.EXTENT, 0);
45063 rasterBoundsArray.emplaceBack(0, performance.EXTENT, 0, performance.EXTENT);
45064 rasterBoundsArray.emplaceBack(performance.EXTENT, performance.EXTENT, performance.EXTENT, performance.EXTENT);
45065 this.rasterBoundsBuffer = context.createVertexBuffer(rasterBoundsArray, rasterBoundsAttributes.members);
45066 this.rasterBoundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
45067 const viewportArray = new performance.PosArray();
45068 viewportArray.emplaceBack(0, 0);
45069 viewportArray.emplaceBack(1, 0);
45070 viewportArray.emplaceBack(0, 1);
45071 viewportArray.emplaceBack(1, 1);
45072 this.viewportBuffer = context.createVertexBuffer(viewportArray, posAttributes.members);
45073 this.viewportSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
45074 const tileLineStripIndices = new performance.LineStripIndexArray();
45075 tileLineStripIndices.emplaceBack(0);
45076 tileLineStripIndices.emplaceBack(1);
45077 tileLineStripIndices.emplaceBack(3);
45078 tileLineStripIndices.emplaceBack(2);
45079 tileLineStripIndices.emplaceBack(0);
45080 this.tileBorderIndexBuffer = context.createIndexBuffer(tileLineStripIndices);
45081 const quadTriangleIndices = new performance.TriangleIndexArray();
45082 quadTriangleIndices.emplaceBack(0, 1, 2);
45083 quadTriangleIndices.emplaceBack(2, 1, 3);
45084 this.quadTriangleIndexBuffer = context.createIndexBuffer(quadTriangleIndices);
45085 this.emptyTexture = new Texture(context, {
45086 width: 1,
45087 height: 1,
45088 data: new Uint8Array([0, 0, 0, 0])
45089 }, context.gl.RGBA);
45090 const gl = this.context.gl;
45091 this.stencilClearMode = new StencilMode({ func: gl.ALWAYS, mask: 0 }, 0x0, 0xFF, gl.ZERO, gl.ZERO, gl.ZERO);
45092 }
45093 /*
45094 * Reset the drawing canvas by clearing the stencil buffer so that we can draw
45095 * new tiles at the same location, while retaining previously drawn pixels.
45096 */
45097 clearStencil() {
45098 const context = this.context;
45099 const gl = context.gl;
45100 this.nextStencilID = 1;
45101 this.currentStencilSource = undefined;
45102 // As a temporary workaround for https://github.com/mapbox/mapbox-gl-js/issues/5490,
45103 // pending an upstream fix, we draw a fullscreen stencil=0 clipping mask here,
45104 // effectively clearing the stencil buffer: once an upstream patch lands, remove
45105 // this function in favor of context.clear({ stencil: 0x0 })
45106 const matrix = performance.create();
45107 performance.ortho(matrix, 0, this.width, this.height, 0, 0, 1);
45108 performance.scale(matrix, matrix, [gl.drawingBufferWidth, gl.drawingBufferHeight, 0]);
45109 this.useProgram('clippingMask').draw(context, gl.TRIANGLES, DepthMode.disabled, this.stencilClearMode, ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(matrix), '$clipping', this.viewportBuffer, this.quadTriangleIndexBuffer, this.viewportSegments);
45110 }
45111 _renderTileClippingMasks(layer, tileIDs) {
45112 if (this.currentStencilSource === layer.source || !layer.isTileClipped() || !tileIDs || !tileIDs.length)
45113 return;
45114 this.currentStencilSource = layer.source;
45115 const context = this.context;
45116 const gl = context.gl;
45117 if (this.nextStencilID + tileIDs.length > 256) {
45118 // we'll run out of fresh IDs so we need to clear and start from scratch
45119 this.clearStencil();
45120 }
45121 context.setColorMode(ColorMode.disabled);
45122 context.setDepthMode(DepthMode.disabled);
45123 const program = this.useProgram('clippingMask');
45124 this._tileClippingMaskIDs = {};
45125 for (const tileID of tileIDs) {
45126 const id = this._tileClippingMaskIDs[tileID.key] = this.nextStencilID++;
45127 program.draw(context, gl.TRIANGLES, DepthMode.disabled,
45128 // Tests will always pass, and ref value will be written to stencil buffer.
45129 new StencilMode({ func: gl.ALWAYS, mask: 0 }, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE), ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(tileID.posMatrix), '$clipping', this.tileExtentBuffer, this.quadTriangleIndexBuffer, this.tileExtentSegments);
45130 }
45131 }
45132 stencilModeFor3D() {
45133 this.currentStencilSource = undefined;
45134 if (this.nextStencilID + 1 > 256) {
45135 this.clearStencil();
45136 }
45137 const id = this.nextStencilID++;
45138 const gl = this.context.gl;
45139 return new StencilMode({ func: gl.NOTEQUAL, mask: 0xFF }, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE);
45140 }
45141 stencilModeForClipping(tileID) {
45142 const gl = this.context.gl;
45143 return new StencilMode({ func: gl.EQUAL, mask: 0xFF }, this._tileClippingMaskIDs[tileID.key], 0x00, gl.KEEP, gl.KEEP, gl.REPLACE);
45144 }
45145 /*
45146 * Sort coordinates by Z as drawing tiles is done in Z-descending order.
45147 * All children with the same Z write the same stencil value. Children
45148 * stencil values are greater than parent's. This is used only for raster
45149 * and raster-dem tiles, which are already clipped to tile boundaries, to
45150 * mask area of tile overlapped by children tiles.
45151 * Stencil ref values continue range used in _tileClippingMaskIDs.
45152 *
45153 * Returns [StencilMode for tile overscaleZ map, sortedCoords].
45154 */
45155 stencilConfigForOverlap(tileIDs) {
45156 const gl = this.context.gl;
45157 const coords = tileIDs.sort((a, b) => b.overscaledZ - a.overscaledZ);
45158 const minTileZ = coords[coords.length - 1].overscaledZ;
45159 const stencilValues = coords[0].overscaledZ - minTileZ + 1;
45160 if (stencilValues > 1) {
45161 this.currentStencilSource = undefined;
45162 if (this.nextStencilID + stencilValues > 256) {
45163 this.clearStencil();
45164 }
45165 const zToStencilMode = {};
45166 for (let i = 0; i < stencilValues; i++) {
45167 zToStencilMode[i + minTileZ] = new StencilMode({ func: gl.GEQUAL, mask: 0xFF }, i + this.nextStencilID, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE);
45168 }
45169 this.nextStencilID += stencilValues;
45170 return [zToStencilMode, coords];
45171 }
45172 return [{ [minTileZ]: StencilMode.disabled }, coords];
45173 }
45174 colorModeForRenderPass() {
45175 const gl = this.context.gl;
45176 if (this._showOverdrawInspector) {
45177 const numOverdrawSteps = 8;
45178 const a = 1 / numOverdrawSteps;
45179 return new ColorMode([gl.CONSTANT_COLOR, gl.ONE], new performance.Color(a, a, a, 0), [true, true, true, true]);
45180 }
45181 else if (this.renderPass === 'opaque') {
45182 return ColorMode.unblended;
45183 }
45184 else {
45185 return ColorMode.alphaBlended;
45186 }
45187 }
45188 depthModeForSublayer(n, mask, func) {
45189 if (!this.opaquePassEnabledForLayer())
45190 return DepthMode.disabled;
45191 const depth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon;
45192 return new DepthMode(func || this.context.gl.LEQUAL, mask, [depth, depth]);
45193 }
45194 /*
45195 * The opaque pass and 3D layers both use the depth buffer.
45196 * Layers drawn above 3D layers need to be drawn using the
45197 * painter's algorithm so that they appear above 3D features.
45198 * This returns true for layers that can be drawn using the
45199 * opaque pass.
45200 */
45201 opaquePassEnabledForLayer() {
45202 return this.currentLayer < this.opaquePassCutoff;
45203 }
45204 render(style, options) {
45205 this.style = style;
45206 this.options = options;
45207 this.lineAtlas = style.lineAtlas;
45208 this.imageManager = style.imageManager;
45209 this.glyphManager = style.glyphManager;
45210 this.symbolFadeChange = style.placement.symbolFadeChange(performance.exported.now());
45211 this.imageManager.beginFrame();
45212 const layerIds = this.style._order;
45213 const sourceCaches = this.style.sourceCaches;
45214 for (const id in sourceCaches) {
45215 const sourceCache = sourceCaches[id];
45216 if (sourceCache.used) {
45217 sourceCache.prepare(this.context);
45218 }
45219 }
45220 const coordsAscending = {};
45221 const coordsDescending = {};
45222 const coordsDescendingSymbol = {};
45223 for (const id in sourceCaches) {
45224 const sourceCache = sourceCaches[id];
45225 coordsAscending[id] = sourceCache.getVisibleCoordinates();
45226 coordsDescending[id] = coordsAscending[id].slice().reverse();
45227 coordsDescendingSymbol[id] = sourceCache.getVisibleCoordinates(true).reverse();
45228 }
45229 this.opaquePassCutoff = Infinity;
45230 for (let i = 0; i < layerIds.length; i++) {
45231 const layerId = layerIds[i];
45232 if (this.style._layers[layerId].is3D()) {
45233 this.opaquePassCutoff = i;
45234 break;
45235 }
45236 }
45237 // Offscreen pass ===============================================
45238 // We first do all rendering that requires rendering to a separate
45239 // framebuffer, and then save those for rendering back to the map
45240 // later: in doing this we avoid doing expensive framebuffer restores.
45241 this.renderPass = 'offscreen';
45242 for (const layerId of layerIds) {
45243 const layer = this.style._layers[layerId];
45244 if (!layer.hasOffscreenPass() || layer.isHidden(this.transform.zoom))
45245 continue;
45246 const coords = coordsDescending[layer.source];
45247 if (layer.type !== 'custom' && !coords.length)
45248 continue;
45249 this.renderLayer(this, sourceCaches[layer.source], layer, coords);
45250 }
45251 // Rebind the main framebuffer now that all offscreen layers have been rendered:
45252 this.context.bindFramebuffer.set(null);
45253 // Clear buffers in preparation for drawing to the main framebuffer
45254 this.context.clear({ color: options.showOverdrawInspector ? performance.Color.black : performance.Color.transparent, depth: 1 });
45255 this.clearStencil();
45256 this._showOverdrawInspector = options.showOverdrawInspector;
45257 this.depthRangeFor3D = [0, 1 - ((style._order.length + 2) * this.numSublayers * this.depthEpsilon)];
45258 // Opaque pass ===============================================
45259 // Draw opaque layers top-to-bottom first.
45260 this.renderPass = 'opaque';
45261 for (this.currentLayer = layerIds.length - 1; this.currentLayer >= 0; this.currentLayer--) {
45262 const layer = this.style._layers[layerIds[this.currentLayer]];
45263 const sourceCache = sourceCaches[layer.source];
45264 const coords = coordsAscending[layer.source];
45265 this._renderTileClippingMasks(layer, coords);
45266 this.renderLayer(this, sourceCache, layer, coords);
45267 }
45268 // Translucent pass ===============================================
45269 // Draw all other layers bottom-to-top.
45270 this.renderPass = 'translucent';
45271 for (this.currentLayer = 0; this.currentLayer < layerIds.length; this.currentLayer++) {
45272 const layer = this.style._layers[layerIds[this.currentLayer]];
45273 const sourceCache = sourceCaches[layer.source];
45274 // For symbol layers in the translucent pass, we add extra tiles to the renderable set
45275 // for cross-tile symbol fading. Symbol layers don't use tile clipping, so no need to render
45276 // separate clipping masks
45277 const coords = (layer.type === 'symbol' ? coordsDescendingSymbol : coordsDescending)[layer.source];
45278 this._renderTileClippingMasks(layer, coordsAscending[layer.source]);
45279 this.renderLayer(this, sourceCache, layer, coords);
45280 }
45281 if (this.options.showTileBoundaries) {
45282 //Use source with highest maxzoom
45283 let selectedSource;
45284 let sourceCache;
45285 const layers = Object.values(this.style._layers);
45286 layers.forEach((layer) => {
45287 if (layer.source && !layer.isHidden(this.transform.zoom)) {
45288 if (layer.source !== (sourceCache && sourceCache.id)) {
45289 sourceCache = this.style.sourceCaches[layer.source];
45290 }
45291 if (!selectedSource || (selectedSource.getSource().maxzoom < sourceCache.getSource().maxzoom)) {
45292 selectedSource = sourceCache;
45293 }
45294 }
45295 });
45296 if (selectedSource) {
45297 draw.debug(this, selectedSource, selectedSource.getVisibleCoordinates());
45298 }
45299 }
45300 if (this.options.showPadding) {
45301 drawDebugPadding(this);
45302 }
45303 // Set defaults for most GL values so that anyone using the state after the render
45304 // encounters more expected values.
45305 this.context.setDefault();
45306 }
45307 renderLayer(painter, sourceCache, layer, coords) {
45308 if (layer.isHidden(this.transform.zoom))
45309 return;
45310 if (layer.type !== 'background' && layer.type !== 'custom' && !coords.length)
45311 return;
45312 this.id = layer.id;
45313 this.gpuTimingStart(layer);
45314 draw[layer.type](painter, sourceCache, layer, coords, this.style.placement.variableOffsets);
45315 this.gpuTimingEnd();
45316 }
45317 gpuTimingStart(layer) {
45318 if (!this.options.gpuTiming)
45319 return;
45320 const ext = this.context.extTimerQuery;
45321 // This tries to time the draw call itself, but note that the cost for drawing a layer
45322 // may be dominated by the cost of uploading vertices to the GPU.
45323 // To instrument that, we'd need to pass the layerTimers object down into the bucket
45324 // uploading logic.
45325 let layerTimer = this.gpuTimers[layer.id];
45326 if (!layerTimer) {
45327 layerTimer = this.gpuTimers[layer.id] = {
45328 calls: 0,
45329 cpuTime: 0,
45330 query: ext.createQueryEXT()
45331 };
45332 }
45333 layerTimer.calls++;
45334 ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, layerTimer.query);
45335 }
45336 gpuTimingEnd() {
45337 if (!this.options.gpuTiming)
45338 return;
45339 const ext = this.context.extTimerQuery;
45340 ext.endQueryEXT(ext.TIME_ELAPSED_EXT);
45341 }
45342 collectGpuTimers() {
45343 const currentLayerTimers = this.gpuTimers;
45344 this.gpuTimers = {};
45345 return currentLayerTimers;
45346 }
45347 queryGpuTimers(gpuTimers) {
45348 const layers = {};
45349 for (const layerId in gpuTimers) {
45350 const gpuTimer = gpuTimers[layerId];
45351 const ext = this.context.extTimerQuery;
45352 const gpuTime = ext.getQueryObjectEXT(gpuTimer.query, ext.QUERY_RESULT_EXT) / (1000 * 1000);
45353 ext.deleteQueryEXT(gpuTimer.query);
45354 layers[layerId] = gpuTime;
45355 }
45356 return layers;
45357 }
45358 /**
45359 * Transform a matrix to incorporate the *-translate and *-translate-anchor properties into it.
45360 * @param inViewportPixelUnitsUnits True when the units accepted by the matrix are in viewport pixels instead of tile units.
45361 * @returns {mat4} matrix
45362 * @private
45363 */
45364 translatePosMatrix(matrix, tile, translate, translateAnchor, inViewportPixelUnitsUnits) {
45365 if (!translate[0] && !translate[1])
45366 return matrix;
45367 const angle = inViewportPixelUnitsUnits ?
45368 (translateAnchor === 'map' ? this.transform.angle : 0) :
45369 (translateAnchor === 'viewport' ? -this.transform.angle : 0);
45370 if (angle) {
45371 const sinA = Math.sin(angle);
45372 const cosA = Math.cos(angle);
45373 translate = [
45374 translate[0] * cosA - translate[1] * sinA,
45375 translate[0] * sinA + translate[1] * cosA
45376 ];
45377 }
45378 const translation = [
45379 inViewportPixelUnitsUnits ? translate[0] : pixelsToTileUnits(tile, translate[0], this.transform.zoom),
45380 inViewportPixelUnitsUnits ? translate[1] : pixelsToTileUnits(tile, translate[1], this.transform.zoom),
45381 0
45382 ];
45383 const translatedMatrix = new Float32Array(16);
45384 performance.translate(translatedMatrix, matrix, translation);
45385 return translatedMatrix;
45386 }
45387 saveTileTexture(texture) {
45388 const textures = this._tileTextures[texture.size[0]];
45389 if (!textures) {
45390 this._tileTextures[texture.size[0]] = [texture];
45391 }
45392 else {
45393 textures.push(texture);
45394 }
45395 }
45396 getTileTexture(size) {
45397 const textures = this._tileTextures[size];
45398 return textures && textures.length > 0 ? textures.pop() : null;
45399 }
45400 /**
45401 * Checks whether a pattern image is needed, and if it is, whether it is not loaded.
45402 *
45403 * @returns true if a needed image is missing and rendering needs to be skipped.
45404 * @private
45405 */
45406 isPatternMissing(image) {
45407 if (!image)
45408 return false;
45409 if (!image.from || !image.to)
45410 return true;
45411 const imagePosA = this.imageManager.getPattern(image.from.toString());
45412 const imagePosB = this.imageManager.getPattern(image.to.toString());
45413 return !imagePosA || !imagePosB;
45414 }
45415 useProgram(name, programConfiguration) {
45416 this.cache = this.cache || {};
45417 const key = `${name}${programConfiguration ? programConfiguration.cacheKey : ''}${this._showOverdrawInspector ? '/overdraw' : ''}`;
45418 if (!this.cache[key]) {
45419 this.cache[key] = new Program(this.context, name, shaders[name], programConfiguration, programUniforms[name], this._showOverdrawInspector);
45420 }
45421 return this.cache[key];
45422 }
45423 /*
45424 * Reset some GL state to default values to avoid hard-to-debug bugs
45425 * in custom layers.
45426 */
45427 setCustomLayerDefaults() {
45428 // Prevent custom layers from unintentionally modify the last VAO used.
45429 // All other state is state is restored on it's own, but for VAOs it's
45430 // simpler to unbind so that we don't have to track the state of VAOs.
45431 this.context.unbindVAO();
45432 // The default values for this state is meaningful and often expected.
45433 // Leaving this state dirty could cause a lot of confusion for users.
45434 this.context.cullFace.setDefault();
45435 this.context.activeTexture.setDefault();
45436 this.context.pixelStoreUnpack.setDefault();
45437 this.context.pixelStoreUnpackPremultiplyAlpha.setDefault();
45438 this.context.pixelStoreUnpackFlipY.setDefault();
45439 }
45440 /*
45441 * Set GL state that is shared by all layers.
45442 */
45443 setBaseState() {
45444 const gl = this.context.gl;
45445 this.context.cullFace.set(false);
45446 this.context.viewport.set([0, 0, this.width, this.height]);
45447 this.context.blendEquation.set(gl.FUNC_ADD);
45448 }
45449 initDebugOverlayCanvas() {
45450 if (this.debugOverlayCanvas == null) {
45451 this.debugOverlayCanvas = document.createElement('canvas');
45452 this.debugOverlayCanvas.width = 512;
45453 this.debugOverlayCanvas.height = 512;
45454 const gl = this.context.gl;
45455 this.debugOverlayTexture = new Texture(this.context, this.debugOverlayCanvas, gl.RGBA);
45456 }
45457 }
45458 destroy() {
45459 this.emptyTexture.destroy();
45460 if (this.debugOverlayTexture) {
45461 this.debugOverlayTexture.destroy();
45462 }
45463 }
45464}
45465
45466class Frustum {
45467 constructor(points, planes) {
45468 this.points = points;
45469 this.planes = planes;
45470 } // eslint-disable-line
45471 static fromInvProjectionMatrix(invProj, worldSize, zoom) {
45472 const clipSpaceCorners = [
45473 [-1, 1, -1, 1],
45474 [1, 1, -1, 1],
45475 [1, -1, -1, 1],
45476 [-1, -1, -1, 1],
45477 [-1, 1, 1, 1],
45478 [1, 1, 1, 1],
45479 [1, -1, 1, 1],
45480 [-1, -1, 1, 1]
45481 ];
45482 const scale = Math.pow(2, zoom);
45483 // Transform frustum corner points from clip space to tile space
45484 const frustumCoords = clipSpaceCorners
45485 .map(v => performance.transformMat4([], v, invProj))
45486 .map(v => performance.scale$1([], v, 1.0 / v[3] / worldSize * scale));
45487 const frustumPlanePointIndices = [
45488 [0, 1, 2],
45489 [6, 5, 4],
45490 [0, 3, 7],
45491 [2, 1, 5],
45492 [3, 2, 6],
45493 [0, 4, 5] // top
45494 ];
45495 const frustumPlanes = frustumPlanePointIndices.map((p) => {
45496 const a = performance.sub([], frustumCoords[p[0]], frustumCoords[p[1]]);
45497 const b = performance.sub([], frustumCoords[p[2]], frustumCoords[p[1]]);
45498 const n = performance.normalize([], performance.cross([], a, b));
45499 const d = -performance.dot(n, frustumCoords[p[1]]);
45500 return n.concat(d);
45501 });
45502 return new Frustum(frustumCoords, frustumPlanes);
45503 }
45504}
45505class Aabb {
45506 constructor(min_, max_) {
45507 this.min = min_;
45508 this.max = max_;
45509 this.center = performance.scale$2([], performance.add([], this.min, this.max), 0.5);
45510 }
45511 quadrant(index) {
45512 const split = [(index % 2) === 0, index < 2];
45513 const qMin = performance.clone$2(this.min);
45514 const qMax = performance.clone$2(this.max);
45515 for (let axis = 0; axis < split.length; axis++) {
45516 qMin[axis] = split[axis] ? this.min[axis] : this.center[axis];
45517 qMax[axis] = split[axis] ? this.center[axis] : this.max[axis];
45518 }
45519 // Elevation is always constant, hence quadrant.max.z = this.max.z
45520 qMax[2] = this.max[2];
45521 return new Aabb(qMin, qMax);
45522 }
45523 distanceX(point) {
45524 const pointOnAabb = Math.max(Math.min(this.max[0], point[0]), this.min[0]);
45525 return pointOnAabb - point[0];
45526 }
45527 distanceY(point) {
45528 const pointOnAabb = Math.max(Math.min(this.max[1], point[1]), this.min[1]);
45529 return pointOnAabb - point[1];
45530 }
45531 // Performs a frustum-aabb intersection test. Returns 0 if there's no intersection,
45532 // 1 if shapes are intersecting and 2 if the aabb if fully inside the frustum.
45533 intersects(frustum) {
45534 // Execute separating axis test between two convex objects to find intersections
45535 // Each frustum plane together with 3 major axes define the separating axes
45536 // Note: test only 4 points as both min and max points have equal elevation
45537 performance.assert(this.min[2] === 0 && this.max[2] === 0);
45538 const aabbPoints = [
45539 [this.min[0], this.min[1], 0.0, 1],
45540 [this.max[0], this.min[1], 0.0, 1],
45541 [this.max[0], this.max[1], 0.0, 1],
45542 [this.min[0], this.max[1], 0.0, 1]
45543 ];
45544 let fullyInside = true;
45545 for (let p = 0; p < frustum.planes.length; p++) {
45546 const plane = frustum.planes[p];
45547 let pointsInside = 0;
45548 for (let i = 0; i < aabbPoints.length; i++) {
45549 if (performance.dot$1(plane, aabbPoints[i]) >= 0) {
45550 pointsInside++;
45551 }
45552 }
45553 if (pointsInside === 0)
45554 return 0;
45555 if (pointsInside !== aabbPoints.length)
45556 fullyInside = false;
45557 }
45558 if (fullyInside)
45559 return 2;
45560 for (let axis = 0; axis < 3; axis++) {
45561 let projMin = Number.MAX_VALUE;
45562 let projMax = -Number.MAX_VALUE;
45563 for (let p = 0; p < frustum.points.length; p++) {
45564 const projectedPoint = frustum.points[p][axis] - this.min[axis];
45565 projMin = Math.min(projMin, projectedPoint);
45566 projMax = Math.max(projMax, projectedPoint);
45567 }
45568 if (projMax < 0 || projMin > this.max[axis] - this.min[axis])
45569 return 0;
45570 }
45571 return 1;
45572 }
45573}
45574
45575/**
45576 * An `EdgeInset` object represents screen space padding applied to the edges of the viewport.
45577 * This shifts the apprent center or the vanishing point of the map. This is useful for adding floating UI elements
45578 * on top of the map and having the vanishing point shift as UI elements resize.
45579 *
45580 * @param {number} [top=0]
45581 * @param {number} [bottom=0]
45582 * @param {number} [left=0]
45583 * @param {number} [right=0]
45584 */
45585class EdgeInsets {
45586 constructor(top = 0, bottom = 0, left = 0, right = 0) {
45587 if (isNaN(top) || top < 0 ||
45588 isNaN(bottom) || bottom < 0 ||
45589 isNaN(left) || left < 0 ||
45590 isNaN(right) || right < 0) {
45591 throw new Error('Invalid value for edge-insets, top, bottom, left and right must all be numbers');
45592 }
45593 this.top = top;
45594 this.bottom = bottom;
45595 this.left = left;
45596 this.right = right;
45597 }
45598 /**
45599 * Interpolates the inset in-place.
45600 * This maintains the current inset value for any inset not present in `target`.
45601 * @param {PaddingOptions | EdgeInsets} start interpolation start
45602 * @param {PaddingOptions} target interpolation target
45603 * @param {number} t interpolation step/weight
45604 * @returns {EdgeInsets} the insets
45605 * @memberof EdgeInsets
45606 */
45607 interpolate(start, target, t) {
45608 if (target.top != null && start.top != null)
45609 this.top = performance.number(start.top, target.top, t);
45610 if (target.bottom != null && start.bottom != null)
45611 this.bottom = performance.number(start.bottom, target.bottom, t);
45612 if (target.left != null && start.left != null)
45613 this.left = performance.number(start.left, target.left, t);
45614 if (target.right != null && start.right != null)
45615 this.right = performance.number(start.right, target.right, t);
45616 return this;
45617 }
45618 /**
45619 * Utility method that computes the new apprent center or vanishing point after applying insets.
45620 * This is in pixels and with the top left being (0.0) and +y being downwards.
45621 *
45622 * @param {number} width the width
45623 * @param {number} height the height
45624 * @returns {Point} the point
45625 * @memberof EdgeInsets
45626 */
45627 getCenter(width, height) {
45628 // Clamp insets so they never overflow width/height and always calculate a valid center
45629 const x = performance.clamp((this.left + width - this.right) / 2, 0, width);
45630 const y = performance.clamp((this.top + height - this.bottom) / 2, 0, height);
45631 return new performance.pointGeometry(x, y);
45632 }
45633 equals(other) {
45634 return this.top === other.top &&
45635 this.bottom === other.bottom &&
45636 this.left === other.left &&
45637 this.right === other.right;
45638 }
45639 clone() {
45640 return new EdgeInsets(this.top, this.bottom, this.left, this.right);
45641 }
45642 /**
45643 * Returns the current state as json, useful when you want to have a
45644 * read-only representation of the inset.
45645 *
45646 * @returns {PaddingOptions} state as json
45647 * @memberof EdgeInsets
45648 */
45649 toJSON() {
45650 return {
45651 top: this.top,
45652 bottom: this.bottom,
45653 left: this.left,
45654 right: this.right
45655 };
45656 }
45657}
45658
45659/**
45660 * A single transform, generally used for a single tile to be
45661 * scaled, rotated, and zoomed.
45662 * @private
45663 */
45664class Transform {
45665 constructor(minZoom, maxZoom, minPitch, maxPitch, renderWorldCopies) {
45666 this.tileSize = 512; // constant
45667 this.maxValidLatitude = 85.051129; // constant
45668 this._renderWorldCopies = renderWorldCopies === undefined ? true : !!renderWorldCopies;
45669 this._minZoom = minZoom || 0;
45670 this._maxZoom = maxZoom || 22;
45671 this._minPitch = (minPitch === undefined || minPitch === null) ? 0 : minPitch;
45672 this._maxPitch = (maxPitch === undefined || maxPitch === null) ? 60 : maxPitch;
45673 this.setMaxBounds();
45674 this.width = 0;
45675 this.height = 0;
45676 this._center = new performance.LngLat(0, 0);
45677 this.zoom = 0;
45678 this.angle = 0;
45679 this._fov = 0.6435011087932844;
45680 this._pitch = 0;
45681 this._unmodified = true;
45682 this._edgeInsets = new EdgeInsets();
45683 this._posMatrixCache = {};
45684 this._alignedPosMatrixCache = {};
45685 }
45686 clone() {
45687 const clone = new Transform(this._minZoom, this._maxZoom, this._minPitch, this.maxPitch, this._renderWorldCopies);
45688 clone.tileSize = this.tileSize;
45689 clone.latRange = this.latRange;
45690 clone.width = this.width;
45691 clone.height = this.height;
45692 clone._center = this._center;
45693 clone.zoom = this.zoom;
45694 clone.angle = this.angle;
45695 clone._fov = this._fov;
45696 clone._pitch = this._pitch;
45697 clone._unmodified = this._unmodified;
45698 clone._edgeInsets = this._edgeInsets.clone();
45699 clone._calcMatrices();
45700 return clone;
45701 }
45702 get minZoom() { return this._minZoom; }
45703 set minZoom(zoom) {
45704 if (this._minZoom === zoom)
45705 return;
45706 this._minZoom = zoom;
45707 this.zoom = Math.max(this.zoom, zoom);
45708 }
45709 get maxZoom() { return this._maxZoom; }
45710 set maxZoom(zoom) {
45711 if (this._maxZoom === zoom)
45712 return;
45713 this._maxZoom = zoom;
45714 this.zoom = Math.min(this.zoom, zoom);
45715 }
45716 get minPitch() { return this._minPitch; }
45717 set minPitch(pitch) {
45718 if (this._minPitch === pitch)
45719 return;
45720 this._minPitch = pitch;
45721 this.pitch = Math.max(this.pitch, pitch);
45722 }
45723 get maxPitch() { return this._maxPitch; }
45724 set maxPitch(pitch) {
45725 if (this._maxPitch === pitch)
45726 return;
45727 this._maxPitch = pitch;
45728 this.pitch = Math.min(this.pitch, pitch);
45729 }
45730 get renderWorldCopies() { return this._renderWorldCopies; }
45731 set renderWorldCopies(renderWorldCopies) {
45732 if (renderWorldCopies === undefined) {
45733 renderWorldCopies = true;
45734 }
45735 else if (renderWorldCopies === null) {
45736 renderWorldCopies = false;
45737 }
45738 this._renderWorldCopies = renderWorldCopies;
45739 }
45740 get worldSize() {
45741 return this.tileSize * this.scale;
45742 }
45743 get centerOffset() {
45744 return this.centerPoint._sub(this.size._div(2));
45745 }
45746 get size() {
45747 return new performance.pointGeometry(this.width, this.height);
45748 }
45749 get bearing() {
45750 return -this.angle / Math.PI * 180;
45751 }
45752 set bearing(bearing) {
45753 const b = -performance.wrap(bearing, -180, 180) * Math.PI / 180;
45754 if (this.angle === b)
45755 return;
45756 this._unmodified = false;
45757 this.angle = b;
45758 this._calcMatrices();
45759 // 2x2 matrix for rotating points
45760 this.rotationMatrix = performance.create$2();
45761 performance.rotate(this.rotationMatrix, this.rotationMatrix, this.angle);
45762 }
45763 get pitch() {
45764 return this._pitch / Math.PI * 180;
45765 }
45766 set pitch(pitch) {
45767 const p = performance.clamp(pitch, this.minPitch, this.maxPitch) / 180 * Math.PI;
45768 if (this._pitch === p)
45769 return;
45770 this._unmodified = false;
45771 this._pitch = p;
45772 this._calcMatrices();
45773 }
45774 get fov() {
45775 return this._fov / Math.PI * 180;
45776 }
45777 set fov(fov) {
45778 fov = Math.max(0.01, Math.min(60, fov));
45779 if (this._fov === fov)
45780 return;
45781 this._unmodified = false;
45782 this._fov = fov / 180 * Math.PI;
45783 this._calcMatrices();
45784 }
45785 get zoom() { return this._zoom; }
45786 set zoom(zoom) {
45787 const z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom);
45788 if (this._zoom === z)
45789 return;
45790 this._unmodified = false;
45791 this._zoom = z;
45792 this.scale = this.zoomScale(z);
45793 this.tileZoom = Math.floor(z);
45794 this.zoomFraction = z - this.tileZoom;
45795 this._constrain();
45796 this._calcMatrices();
45797 }
45798 get center() { return this._center; }
45799 set center(center) {
45800 if (center.lat === this._center.lat && center.lng === this._center.lng)
45801 return;
45802 this._unmodified = false;
45803 this._center = center;
45804 this._constrain();
45805 this._calcMatrices();
45806 }
45807 get padding() { return this._edgeInsets.toJSON(); }
45808 set padding(padding) {
45809 if (this._edgeInsets.equals(padding))
45810 return;
45811 this._unmodified = false;
45812 //Update edge-insets inplace
45813 this._edgeInsets.interpolate(this._edgeInsets, padding, 1);
45814 this._calcMatrices();
45815 }
45816 /**
45817 * The center of the screen in pixels with the top-left corner being (0,0)
45818 * and +y axis pointing downwards. This accounts for padding.
45819 *
45820 * @readonly
45821 * @type {Point}
45822 * @memberof Transform
45823 */
45824 get centerPoint() {
45825 return this._edgeInsets.getCenter(this.width, this.height);
45826 }
45827 /**
45828 * Returns if the padding params match
45829 *
45830 * @param {PaddingOptions} padding the padding to check against
45831 * @returns {boolean} true if they are equal, false otherwise
45832 * @memberof Transform
45833 */
45834 isPaddingEqual(padding) {
45835 return this._edgeInsets.equals(padding);
45836 }
45837 /**
45838 * Helper method to upadte edge-insets inplace
45839 *
45840 * @param {PaddingOptions} start the starting padding
45841 * @param {PaddingOptions} target the target padding
45842 * @param {number} t the step/weight
45843 * @memberof Transform
45844 */
45845 interpolatePadding(start, target, t) {
45846 this._unmodified = false;
45847 this._edgeInsets.interpolate(start, target, t);
45848 this._constrain();
45849 this._calcMatrices();
45850 }
45851 /**
45852 * Return a zoom level that will cover all tiles the transform
45853 * @param {Object} options options
45854 * @param {number} options.tileSize Tile size, expressed in screen pixels.
45855 * @param {boolean} options.roundZoom Target zoom level. If true, the value will be rounded to the closest integer. Otherwise the value will be floored.
45856 * @returns {number} zoom level An integer zoom level at which all tiles will be visible.
45857 */
45858 coveringZoomLevel(options) {
45859 const z = (options.roundZoom ? Math.round : Math.floor)(this.zoom + this.scaleZoom(this.tileSize / options.tileSize));
45860 // At negative zoom levels load tiles from z0 because negative tile zoom levels don't exist.
45861 return Math.max(0, z);
45862 }
45863 /**
45864 * Return any "wrapped" copies of a given tile coordinate that are visible
45865 * in the current view.
45866 *
45867 * @private
45868 */
45869 getVisibleUnwrappedCoordinates(tileID) {
45870 const result = [new performance.UnwrappedTileID(0, tileID)];
45871 if (this._renderWorldCopies) {
45872 const utl = this.pointCoordinate(new performance.pointGeometry(0, 0));
45873 const utr = this.pointCoordinate(new performance.pointGeometry(this.width, 0));
45874 const ubl = this.pointCoordinate(new performance.pointGeometry(this.width, this.height));
45875 const ubr = this.pointCoordinate(new performance.pointGeometry(0, this.height));
45876 const w0 = Math.floor(Math.min(utl.x, utr.x, ubl.x, ubr.x));
45877 const w1 = Math.floor(Math.max(utl.x, utr.x, ubl.x, ubr.x));
45878 // Add an extra copy of the world on each side to properly render ImageSources and CanvasSources.
45879 // Both sources draw outside the tile boundaries of the tile that "contains them" so we need
45880 // to add extra copies on both sides in case offscreen tiles need to draw into on-screen ones.
45881 const extraWorldCopy = 1;
45882 for (let w = w0 - extraWorldCopy; w <= w1 + extraWorldCopy; w++) {
45883 if (w === 0)
45884 continue;
45885 result.push(new performance.UnwrappedTileID(w, tileID));
45886 }
45887 }
45888 return result;
45889 }
45890 /**
45891 * Return all coordinates that could cover this transform for a covering
45892 * zoom level.
45893 * @param {Object} options
45894 * @param {number} options.tileSize
45895 * @param {number} options.minzoom
45896 * @param {number} options.maxzoom
45897 * @param {boolean} options.roundZoom
45898 * @param {boolean} options.reparseOverscaled
45899 * @param {boolean} options.renderWorldCopies
45900 * @returns {Array<OverscaledTileID>} OverscaledTileIDs
45901 * @private
45902 */
45903 coveringTiles(options) {
45904 let z = this.coveringZoomLevel(options);
45905 const actualZ = z;
45906 if (options.minzoom !== undefined && z < options.minzoom)
45907 return [];
45908 if (options.maxzoom !== undefined && z > options.maxzoom)
45909 z = options.maxzoom;
45910 const centerCoord = performance.MercatorCoordinate.fromLngLat(this.center);
45911 const numTiles = Math.pow(2, z);
45912 const centerPoint = [numTiles * centerCoord.x, numTiles * centerCoord.y, 0];
45913 const cameraFrustum = Frustum.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, z);
45914 // No change of LOD behavior for pitch lower than 60 and when there is no top padding: return only tile ids from the requested zoom level
45915 let minZoom = options.minzoom || 0;
45916 // Use 0.1 as an epsilon to avoid for explicit == 0.0 floating point checks
45917 if (this.pitch <= 60.0 && this._edgeInsets.top < 0.1)
45918 minZoom = z;
45919 // There should always be a certain number of maximum zoom level tiles surrounding the center location
45920 const radiusOfMaxLvlLodInTiles = 3;
45921 const newRootTile = (wrap) => {
45922 return {
45923 // All tiles are on zero elevation plane => z difference is zero
45924 aabb: new Aabb([wrap * numTiles, 0, 0], [(wrap + 1) * numTiles, numTiles, 0]),
45925 zoom: 0,
45926 x: 0,
45927 y: 0,
45928 wrap,
45929 fullyVisible: false
45930 };
45931 };
45932 // Do a depth-first traversal to find visible tiles and proper levels of detail
45933 const stack = [];
45934 const result = [];
45935 const maxZoom = z;
45936 const overscaledZ = options.reparseOverscaled ? actualZ : z;
45937 if (this._renderWorldCopies) {
45938 // Render copy of the globe thrice on both sides
45939 for (let i = 1; i <= 3; i++) {
45940 stack.push(newRootTile(-i));
45941 stack.push(newRootTile(i));
45942 }
45943 }
45944 stack.push(newRootTile(0));
45945 while (stack.length > 0) {
45946 const it = stack.pop();
45947 const x = it.x;
45948 const y = it.y;
45949 let fullyVisible = it.fullyVisible;
45950 // Visibility of a tile is not required if any of its ancestor if fully inside the frustum
45951 if (!fullyVisible) {
45952 const intersectResult = it.aabb.intersects(cameraFrustum);
45953 if (intersectResult === 0)
45954 continue;
45955 fullyVisible = intersectResult === 2;
45956 }
45957 const distanceX = it.aabb.distanceX(centerPoint);
45958 const distanceY = it.aabb.distanceY(centerPoint);
45959 const longestDim = Math.max(Math.abs(distanceX), Math.abs(distanceY));
45960 // We're using distance based heuristics to determine if a tile should be split into quadrants or not.
45961 // radiusOfMaxLvlLodInTiles defines that there's always a certain number of maxLevel tiles next to the map center.
45962 // Using the fact that a parent node in quadtree is twice the size of its children (per dimension)
45963 // we can define distance thresholds for each relative level:
45964 // f(k) = offset + 2 + 4 + 8 + 16 + ... + 2^k. This is the same as "offset+2^(k+1)-2"
45965 const distToSplit = radiusOfMaxLvlLodInTiles + (1 << (maxZoom - it.zoom)) - 2;
45966 // Have we reached the target depth or is the tile too far away to be any split further?
45967 if (it.zoom === maxZoom || (longestDim > distToSplit && it.zoom >= minZoom)) {
45968 result.push({
45969 tileID: new performance.OverscaledTileID(it.zoom === maxZoom ? overscaledZ : it.zoom, it.wrap, it.zoom, x, y),
45970 distanceSq: performance.sqrLen([centerPoint[0] - 0.5 - x, centerPoint[1] - 0.5 - y])
45971 });
45972 continue;
45973 }
45974 for (let i = 0; i < 4; i++) {
45975 const childX = (x << 1) + (i % 2);
45976 const childY = (y << 1) + (i >> 1);
45977 stack.push({ aabb: it.aabb.quadrant(i), zoom: it.zoom + 1, x: childX, y: childY, wrap: it.wrap, fullyVisible });
45978 }
45979 }
45980 return result.sort((a, b) => a.distanceSq - b.distanceSq).map(a => a.tileID);
45981 }
45982 resize(width, height) {
45983 this.width = width;
45984 this.height = height;
45985 this.pixelsToGLUnits = [2 / width, -2 / height];
45986 this._constrain();
45987 this._calcMatrices();
45988 }
45989 get unmodified() { return this._unmodified; }
45990 zoomScale(zoom) { return Math.pow(2, zoom); }
45991 scaleZoom(scale) { return Math.log(scale) / Math.LN2; }
45992 project(lnglat) {
45993 const lat = performance.clamp(lnglat.lat, -this.maxValidLatitude, this.maxValidLatitude);
45994 return new performance.pointGeometry(performance.mercatorXfromLng(lnglat.lng) * this.worldSize, performance.mercatorYfromLat(lat) * this.worldSize);
45995 }
45996 unproject(point) {
45997 return new performance.MercatorCoordinate(point.x / this.worldSize, point.y / this.worldSize).toLngLat();
45998 }
45999 get point() { return this.project(this.center); }
46000 setLocationAtPoint(lnglat, point) {
46001 const a = this.pointCoordinate(point);
46002 const b = this.pointCoordinate(this.centerPoint);
46003 const loc = this.locationCoordinate(lnglat);
46004 const newCenter = new performance.MercatorCoordinate(loc.x - (a.x - b.x), loc.y - (a.y - b.y));
46005 this.center = this.coordinateLocation(newCenter);
46006 if (this._renderWorldCopies) {
46007 this.center = this.center.wrap();
46008 }
46009 }
46010 /**
46011 * Given a location, return the screen point that corresponds to it
46012 * @param {LngLat} lnglat location
46013 * @returns {Point} screen point
46014 * @private
46015 */
46016 locationPoint(lnglat) {
46017 return this.coordinatePoint(this.locationCoordinate(lnglat));
46018 }
46019 /**
46020 * Given a point on screen, return its lnglat
46021 * @param {Point} p screen point
46022 * @returns {LngLat} lnglat location
46023 * @private
46024 */
46025 pointLocation(p) {
46026 return this.coordinateLocation(this.pointCoordinate(p));
46027 }
46028 /**
46029 * Given a geographical lnglat, return an unrounded
46030 * coordinate that represents it at this transform's zoom level.
46031 * @param {LngLat} lnglat
46032 * @returns {Coordinate}
46033 * @private
46034 */
46035 locationCoordinate(lnglat) {
46036 return performance.MercatorCoordinate.fromLngLat(lnglat);
46037 }
46038 /**
46039 * Given a Coordinate, return its geographical position.
46040 * @param {Coordinate} coord
46041 * @returns {LngLat} lnglat
46042 * @private
46043 */
46044 coordinateLocation(coord) {
46045 return coord.toLngLat();
46046 }
46047 pointCoordinate(p) {
46048 const targetZ = 0;
46049 // since we don't know the correct projected z value for the point,
46050 // unproject two points to get a line and then find the point on that
46051 // line with z=0
46052 const coord0 = [p.x, p.y, 0, 1];
46053 const coord1 = [p.x, p.y, 1, 1];
46054 performance.transformMat4(coord0, coord0, this.pixelMatrixInverse);
46055 performance.transformMat4(coord1, coord1, this.pixelMatrixInverse);
46056 const w0 = coord0[3];
46057 const w1 = coord1[3];
46058 const x0 = coord0[0] / w0;
46059 const x1 = coord1[0] / w1;
46060 const y0 = coord0[1] / w0;
46061 const y1 = coord1[1] / w1;
46062 const z0 = coord0[2] / w0;
46063 const z1 = coord1[2] / w1;
46064 const t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0);
46065 return new performance.MercatorCoordinate(performance.number(x0, x1, t) / this.worldSize, performance.number(y0, y1, t) / this.worldSize);
46066 }
46067 /**
46068 * Given a coordinate, return the screen point that corresponds to it
46069 * @param {Coordinate} coord
46070 * @returns {Point} screen point
46071 * @private
46072 */
46073 coordinatePoint(coord) {
46074 const p = [coord.x * this.worldSize, coord.y * this.worldSize, 0, 1];
46075 performance.transformMat4(p, p, this.pixelMatrix);
46076 return new performance.pointGeometry(p[0] / p[3], p[1] / p[3]);
46077 }
46078 /**
46079 * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not
46080 * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region.
46081 * @returns {LngLatBounds} Returns a {@link LngLatBounds} object describing the map's geographical bounds.
46082 */
46083 getBounds() {
46084 return new performance.LngLatBounds()
46085 .extend(this.pointLocation(new performance.pointGeometry(0, 0)))
46086 .extend(this.pointLocation(new performance.pointGeometry(this.width, 0)))
46087 .extend(this.pointLocation(new performance.pointGeometry(this.width, this.height)))
46088 .extend(this.pointLocation(new performance.pointGeometry(0, this.height)));
46089 }
46090 /**
46091 * Returns the maximum geographical bounds the map is constrained to, or `null` if none set.
46092 * @returns {LngLatBounds} {@link LngLatBounds}
46093 */
46094 getMaxBounds() {
46095 if (!this.latRange || this.latRange.length !== 2 ||
46096 !this.lngRange || this.lngRange.length !== 2)
46097 return null;
46098 return new performance.LngLatBounds([this.lngRange[0], this.latRange[0]], [this.lngRange[1], this.latRange[1]]);
46099 }
46100 /**
46101 * Sets or clears the map's geographical constraints.
46102 * @param {LngLatBounds} bounds A {@link LngLatBounds} object describing the new geographic boundaries of the map.
46103 */
46104 setMaxBounds(bounds) {
46105 if (bounds) {
46106 this.lngRange = [bounds.getWest(), bounds.getEast()];
46107 this.latRange = [bounds.getSouth(), bounds.getNorth()];
46108 this._constrain();
46109 }
46110 else {
46111 this.lngRange = null;
46112 this.latRange = [-this.maxValidLatitude, this.maxValidLatitude];
46113 }
46114 }
46115 /**
46116 * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map.
46117 * @param {UnwrappedTileID} unwrappedTileID;
46118 * @private
46119 */
46120 calculatePosMatrix(unwrappedTileID, aligned = false) {
46121 const posMatrixKey = unwrappedTileID.key;
46122 const cache = aligned ? this._alignedPosMatrixCache : this._posMatrixCache;
46123 if (cache[posMatrixKey]) {
46124 return cache[posMatrixKey];
46125 }
46126 const canonical = unwrappedTileID.canonical;
46127 const scale = this.worldSize / this.zoomScale(canonical.z);
46128 const unwrappedX = canonical.x + Math.pow(2, canonical.z) * unwrappedTileID.wrap;
46129 const posMatrix = performance.identity(new Float64Array(16));
46130 performance.translate(posMatrix, posMatrix, [unwrappedX * scale, canonical.y * scale, 0]);
46131 performance.scale(posMatrix, posMatrix, [scale / performance.EXTENT, scale / performance.EXTENT, 1]);
46132 performance.multiply(posMatrix, aligned ? this.alignedProjMatrix : this.projMatrix, posMatrix);
46133 cache[posMatrixKey] = new Float32Array(posMatrix);
46134 return cache[posMatrixKey];
46135 }
46136 customLayerMatrix() {
46137 return this.mercatorMatrix.slice();
46138 }
46139 _constrain() {
46140 if (!this.center || !this.width || !this.height || this._constraining)
46141 return;
46142 this._constraining = true;
46143 let minY = -90;
46144 let maxY = 90;
46145 let minX = -180;
46146 let maxX = 180;
46147 let sy, sx, x2, y2;
46148 const size = this.size, unmodified = this._unmodified;
46149 if (this.latRange) {
46150 const latRange = this.latRange;
46151 minY = performance.mercatorYfromLat(latRange[1]) * this.worldSize;
46152 maxY = performance.mercatorYfromLat(latRange[0]) * this.worldSize;
46153 sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0;
46154 }
46155 if (this.lngRange) {
46156 const lngRange = this.lngRange;
46157 minX = performance.mercatorXfromLng(lngRange[0]) * this.worldSize;
46158 maxX = performance.mercatorXfromLng(lngRange[1]) * this.worldSize;
46159 sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0;
46160 }
46161 const point = this.point;
46162 // how much the map should scale to fit the screen into given latitude/longitude ranges
46163 const s = Math.max(sx || 0, sy || 0);
46164 if (s) {
46165 this.center = this.unproject(new performance.pointGeometry(sx ? (maxX + minX) / 2 : point.x, sy ? (maxY + minY) / 2 : point.y));
46166 this.zoom += this.scaleZoom(s);
46167 this._unmodified = unmodified;
46168 this._constraining = false;
46169 return;
46170 }
46171 if (this.latRange) {
46172 const y = point.y, h2 = size.y / 2;
46173 if (y - h2 < minY)
46174 y2 = minY + h2;
46175 if (y + h2 > maxY)
46176 y2 = maxY - h2;
46177 }
46178 if (this.lngRange) {
46179 const x = point.x, w2 = size.x / 2;
46180 if (x - w2 < minX)
46181 x2 = minX + w2;
46182 if (x + w2 > maxX)
46183 x2 = maxX - w2;
46184 }
46185 // pan the map if the screen goes off the range
46186 if (x2 !== undefined || y2 !== undefined) {
46187 this.center = this.unproject(new performance.pointGeometry(x2 !== undefined ? x2 : point.x, y2 !== undefined ? y2 : point.y));
46188 }
46189 this._unmodified = unmodified;
46190 this._constraining = false;
46191 }
46192 _calcMatrices() {
46193 if (!this.height)
46194 return;
46195 const halfFov = this._fov / 2;
46196 const offset = this.centerOffset;
46197 this.cameraToCenterDistance = 0.5 / Math.tan(halfFov) * this.height;
46198 // Find the distance from the center point [width/2 + offset.x, height/2 + offset.y] to the
46199 // center top point [width/2 + offset.x, 0] in Z units, using the law of sines.
46200 // 1 Z unit is equivalent to 1 horizontal px at the center of the map
46201 // (the distance between[width/2, height/2] and [width/2 + 1, height/2])
46202 const groundAngle = Math.PI / 2 + this._pitch;
46203 const fovAboveCenter = this._fov * (0.5 + offset.y / this.height);
46204 const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * this.cameraToCenterDistance / Math.sin(performance.clamp(Math.PI - groundAngle - fovAboveCenter, 0.01, Math.PI - 0.01));
46205 const point = this.point;
46206 const x = point.x, y = point.y;
46207 // Calculate z distance of the farthest fragment that should be rendered.
46208 const furthestDistance = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.cameraToCenterDistance;
46209 // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance`
46210 const farZ = furthestDistance * 1.01;
46211 // The larger the value of nearZ is
46212 // - the more depth precision is available for features (good)
46213 // - clipping starts appearing sooner when the camera is close to 3d features (bad)
46214 //
46215 // Smaller values worked well for mapbox-gl-js but deckgl was encountering precision issues
46216 // when rendering it's layers using custom layers. This value was experimentally chosen and
46217 // seems to solve z-fighting issues in deckgl while not clipping buildings too close to the camera.
46218 const nearZ = this.height / 50;
46219 // matrix for conversion from location to GL coordinates (-1 .. 1)
46220 let m = new Float64Array(16);
46221 performance.perspective(m, this._fov, this.width / this.height, nearZ, farZ);
46222 //Apply center of perspective offset
46223 m[8] = -offset.x * 2 / this.width;
46224 m[9] = offset.y * 2 / this.height;
46225 performance.scale(m, m, [1, -1, 1]);
46226 performance.translate(m, m, [0, 0, -this.cameraToCenterDistance]);
46227 performance.rotateX(m, m, this._pitch);
46228 performance.rotateZ(m, m, this.angle);
46229 performance.translate(m, m, [-x, -y, 0]);
46230 // The mercatorMatrix can be used to transform points from mercator coordinates
46231 // ([0, 0] nw, [1, 1] se) to GL coordinates.
46232 this.mercatorMatrix = performance.scale([], m, [this.worldSize, this.worldSize, this.worldSize]);
46233 // scale vertically to meters per pixel (inverse of ground resolution):
46234 performance.scale(m, m, [1, 1, performance.mercatorZfromAltitude(1, this.center.lat) * this.worldSize]);
46235 this.projMatrix = m;
46236 this.invProjMatrix = performance.invert([], this.projMatrix);
46237 // Make a second projection matrix that is aligned to a pixel grid for rendering raster tiles.
46238 // We're rounding the (floating point) x/y values to achieve to avoid rendering raster images to fractional
46239 // coordinates. Additionally, we adjust by half a pixel in either direction in case that viewport dimension
46240 // is an odd integer to preserve rendering to the pixel grid. We're rotating this shift based on the angle
46241 // of the transformation so that 0°, 90°, 180°, and 270° rasters are crisp, and adjust the shift so that
46242 // it is always <= 0.5 pixels.
46243 const xShift = (this.width % 2) / 2, yShift = (this.height % 2) / 2, angleCos = Math.cos(this.angle), angleSin = Math.sin(this.angle), dx = x - Math.round(x) + angleCos * xShift + angleSin * yShift, dy = y - Math.round(y) + angleCos * yShift + angleSin * xShift;
46244 const alignedM = new Float64Array(m);
46245 performance.translate(alignedM, alignedM, [dx > 0.5 ? dx - 1 : dx, dy > 0.5 ? dy - 1 : dy, 0]);
46246 this.alignedProjMatrix = alignedM;
46247 m = performance.create();
46248 performance.scale(m, m, [this.width / 2, -this.height / 2, 1]);
46249 performance.translate(m, m, [1, -1, 0]);
46250 this.labelPlaneMatrix = m;
46251 m = performance.create();
46252 performance.scale(m, m, [1, -1, 1]);
46253 performance.translate(m, m, [-1, -1, 0]);
46254 performance.scale(m, m, [2 / this.width, 2 / this.height, 1]);
46255 this.glCoordMatrix = m;
46256 // matrix for conversion from location to screen coordinates
46257 this.pixelMatrix = performance.multiply(new Float64Array(16), this.labelPlaneMatrix, this.projMatrix);
46258 // inverse matrix for conversion from screen coordinaes to location
46259 m = performance.invert(new Float64Array(16), this.pixelMatrix);
46260 if (!m)
46261 throw new Error('failed to invert matrix');
46262 this.pixelMatrixInverse = m;
46263 this._posMatrixCache = {};
46264 this._alignedPosMatrixCache = {};
46265 }
46266 maxPitchScaleFactor() {
46267 // calcMatrices hasn't run yet
46268 if (!this.pixelMatrixInverse)
46269 return 1;
46270 const coord = this.pointCoordinate(new performance.pointGeometry(0, 0));
46271 const p = [coord.x * this.worldSize, coord.y * this.worldSize, 0, 1];
46272 const topPoint = performance.transformMat4(p, p, this.pixelMatrix);
46273 return topPoint[3] / this.cameraToCenterDistance;
46274 }
46275 /*
46276 * The camera looks at the map from a 3D (lng, lat, altitude) location. Let's use `cameraLocation`
46277 * as the name for the location under the camera and on the surface of the earth (lng, lat, 0).
46278 * `cameraPoint` is the projected position of the `cameraLocation`.
46279 *
46280 * This point is useful to us because only fill-extrusions that are between `cameraPoint` and
46281 * the query point on the surface of the earth can extend and intersect the query.
46282 *
46283 * When the map is not pitched the `cameraPoint` is equivalent to the center of the map because
46284 * the camera is right above the center of the map.
46285 */
46286 getCameraPoint() {
46287 const pitch = this._pitch;
46288 const yOffset = Math.tan(pitch) * (this.cameraToCenterDistance || 1);
46289 return this.centerPoint.add(new performance.pointGeometry(0, yOffset));
46290 }
46291 /*
46292 * When the map is pitched, some of the 3D features that intersect a query will not intersect
46293 * the query at the surface of the earth. Instead the feature may be closer and only intersect
46294 * the query because it extrudes into the air.
46295 *
46296 * This returns a geometry that includes all of the original query as well as all possible ares of the
46297 * screen where the *base* of a visible extrusion could be.
46298 * - For point queries, the line from the query point to the "camera point"
46299 * - For other geometries, the envelope of the query geometry and the "camera point"
46300 */
46301 getCameraQueryGeometry(queryGeometry) {
46302 const c = this.getCameraPoint();
46303 if (queryGeometry.length === 1) {
46304 return [queryGeometry[0], c];
46305 }
46306 else {
46307 let minX = c.x;
46308 let minY = c.y;
46309 let maxX = c.x;
46310 let maxY = c.y;
46311 for (const p of queryGeometry) {
46312 minX = Math.min(minX, p.x);
46313 minY = Math.min(minY, p.y);
46314 maxX = Math.max(maxX, p.x);
46315 maxY = Math.max(maxY, p.y);
46316 }
46317 return [
46318 new performance.pointGeometry(minX, minY),
46319 new performance.pointGeometry(maxX, minY),
46320 new performance.pointGeometry(maxX, maxY),
46321 new performance.pointGeometry(minX, maxY),
46322 new performance.pointGeometry(minX, minY)
46323 ];
46324 }
46325 }
46326}
46327
46328/**
46329 * Throttle the given function to run at most every `period` milliseconds.
46330 * @private
46331 */
46332function throttle(fn, time) {
46333 let pending = false;
46334 let timerId = null;
46335 const later = () => {
46336 timerId = null;
46337 if (pending) {
46338 fn();
46339 timerId = setTimeout(later, time);
46340 pending = false;
46341 }
46342 };
46343 return () => {
46344 pending = true;
46345 if (!timerId) {
46346 later();
46347 }
46348 return timerId;
46349 };
46350}
46351
46352/*
46353 * Adds the map's position to its page's location hash.
46354 * Passed as an option to the map object.
46355 *
46356 * @returns {Hash} `this`
46357 */
46358class Hash {
46359 constructor(hashName) {
46360 this._hashName = hashName && encodeURIComponent(hashName);
46361 performance.bindAll([
46362 '_getCurrentHash',
46363 '_onHashChange',
46364 '_updateHash'
46365 ], this);
46366 // Mobile Safari doesn't allow updating the hash more than 100 times per 30 seconds.
46367 this._updateHash = throttle(this._updateHashUnthrottled.bind(this), 30 * 1000 / 100);
46368 }
46369 /*
46370 * Map element to listen for coordinate changes
46371 *
46372 * @param {Object} map
46373 * @returns {Hash} `this`
46374 */
46375 addTo(map) {
46376 this._map = map;
46377 addEventListener('hashchange', this._onHashChange, false);
46378 this._map.on('moveend', this._updateHash);
46379 return this;
46380 }
46381 /*
46382 * Removes hash
46383 *
46384 * @returns {Popup} `this`
46385 */
46386 remove() {
46387 removeEventListener('hashchange', this._onHashChange, false);
46388 this._map.off('moveend', this._updateHash);
46389 clearTimeout(this._updateHash());
46390 delete this._map;
46391 return this;
46392 }
46393 getHashString(mapFeedback) {
46394 const center = this._map.getCenter(), zoom = Math.round(this._map.getZoom() * 100) / 100,
46395 // derived from equation: 512px * 2^z / 360 / 10^d < 0.5px
46396 precision = Math.ceil((zoom * Math.LN2 + Math.log(512 / 360 / 0.5)) / Math.LN10), m = Math.pow(10, precision), lng = Math.round(center.lng * m) / m, lat = Math.round(center.lat * m) / m, bearing = this._map.getBearing(), pitch = this._map.getPitch();
46397 let hash = '';
46398 if (mapFeedback) {
46399 // new map feedback site has some constraints that don't allow
46400 // us to use the same hash format as we do for the Map hash option.
46401 hash += `/${lng}/${lat}/${zoom}`;
46402 }
46403 else {
46404 hash += `${zoom}/${lat}/${lng}`;
46405 }
46406 if (bearing || pitch)
46407 hash += (`/${Math.round(bearing * 10) / 10}`);
46408 if (pitch)
46409 hash += (`/${Math.round(pitch)}`);
46410 if (this._hashName) {
46411 const hashName = this._hashName;
46412 let found = false;
46413 const parts = window.location.hash.slice(1).split('&').map(part => {
46414 const key = part.split('=')[0];
46415 if (key === hashName) {
46416 found = true;
46417 return `${key}=${hash}`;
46418 }
46419 return part;
46420 }).filter(a => a);
46421 if (!found) {
46422 parts.push(`${hashName}=${hash}`);
46423 }
46424 return `#${parts.join('&')}`;
46425 }
46426 return `#${hash}`;
46427 }
46428 _getCurrentHash() {
46429 // Get the current hash from location, stripped from its number sign
46430 const hash = window.location.hash.replace('#', '');
46431 if (this._hashName) {
46432 // Split the parameter-styled hash into parts and find the value we need
46433 let keyval;
46434 hash.split('&').map(part => part.split('=')).forEach(part => {
46435 if (part[0] === this._hashName) {
46436 keyval = part;
46437 }
46438 });
46439 return (keyval ? keyval[1] || '' : '').split('/');
46440 }
46441 return hash.split('/');
46442 }
46443 _onHashChange() {
46444 const loc = this._getCurrentHash();
46445 if (loc.length >= 3 && !loc.some(v => isNaN(v))) {
46446 const bearing = this._map.dragRotate.isEnabled() && this._map.touchZoomRotate.isEnabled() ? +(loc[3] || 0) : this._map.getBearing();
46447 this._map.jumpTo({
46448 center: [+loc[2], +loc[1]],
46449 zoom: +loc[0],
46450 bearing,
46451 pitch: +(loc[4] || 0)
46452 });
46453 return true;
46454 }
46455 return false;
46456 }
46457 _updateHashUnthrottled() {
46458 // Replace if already present, else append the updated hash string
46459 const location = window.location.href.replace(/(#.+)?$/, this.getHashString());
46460 try {
46461 window.history.replaceState(window.history.state, null, location);
46462 }
46463 catch (SecurityError) {
46464 // IE11 does not allow this if the page is within an iframe created
46465 // with iframe.contentWindow.document.write(...).
46466 // https://github.com/mapbox/mapbox-gl-js/issues/7410
46467 }
46468 }
46469}
46470
46471const defaultInertiaOptions = {
46472 linearity: 0.3,
46473 easing: performance.bezier(0, 0, 0.3, 1),
46474};
46475const defaultPanInertiaOptions = performance.extend({
46476 deceleration: 2500,
46477 maxSpeed: 1400
46478}, defaultInertiaOptions);
46479const defaultZoomInertiaOptions = performance.extend({
46480 deceleration: 20,
46481 maxSpeed: 1400
46482}, defaultInertiaOptions);
46483const defaultBearingInertiaOptions = performance.extend({
46484 deceleration: 1000,
46485 maxSpeed: 360
46486}, defaultInertiaOptions);
46487const defaultPitchInertiaOptions = performance.extend({
46488 deceleration: 1000,
46489 maxSpeed: 90
46490}, defaultInertiaOptions);
46491class HandlerInertia {
46492 constructor(map) {
46493 this._map = map;
46494 this.clear();
46495 }
46496 clear() {
46497 this._inertiaBuffer = [];
46498 }
46499 record(settings) {
46500 this._drainInertiaBuffer();
46501 this._inertiaBuffer.push({ time: performance.exported.now(), settings });
46502 }
46503 _drainInertiaBuffer() {
46504 const inertia = this._inertiaBuffer, now = performance.exported.now(), cutoff = 160; //msec
46505 while (inertia.length > 0 && now - inertia[0].time > cutoff)
46506 inertia.shift();
46507 }
46508 _onMoveEnd(panInertiaOptions) {
46509 this._drainInertiaBuffer();
46510 if (this._inertiaBuffer.length < 2) {
46511 return;
46512 }
46513 const deltas = {
46514 zoom: 0,
46515 bearing: 0,
46516 pitch: 0,
46517 pan: new performance.pointGeometry(0, 0),
46518 pinchAround: undefined,
46519 around: undefined
46520 };
46521 for (const { settings } of this._inertiaBuffer) {
46522 deltas.zoom += settings.zoomDelta || 0;
46523 deltas.bearing += settings.bearingDelta || 0;
46524 deltas.pitch += settings.pitchDelta || 0;
46525 if (settings.panDelta)
46526 deltas.pan._add(settings.panDelta);
46527 if (settings.around)
46528 deltas.around = settings.around;
46529 if (settings.pinchAround)
46530 deltas.pinchAround = settings.pinchAround;
46531 }
46532 const lastEntry = this._inertiaBuffer[this._inertiaBuffer.length - 1];
46533 const duration = (lastEntry.time - this._inertiaBuffer[0].time);
46534 const easeOptions = {};
46535 if (deltas.pan.mag()) {
46536 const result = calculateEasing(deltas.pan.mag(), duration, performance.extend({}, defaultPanInertiaOptions, panInertiaOptions || {}));
46537 easeOptions.offset = deltas.pan.mult(result.amount / deltas.pan.mag());
46538 easeOptions.center = this._map.transform.center;
46539 extendDuration(easeOptions, result);
46540 }
46541 if (deltas.zoom) {
46542 const result = calculateEasing(deltas.zoom, duration, defaultZoomInertiaOptions);
46543 easeOptions.zoom = this._map.transform.zoom + result.amount;
46544 extendDuration(easeOptions, result);
46545 }
46546 if (deltas.bearing) {
46547 const result = calculateEasing(deltas.bearing, duration, defaultBearingInertiaOptions);
46548 easeOptions.bearing = this._map.transform.bearing + performance.clamp(result.amount, -179, 179);
46549 extendDuration(easeOptions, result);
46550 }
46551 if (deltas.pitch) {
46552 const result = calculateEasing(deltas.pitch, duration, defaultPitchInertiaOptions);
46553 easeOptions.pitch = this._map.transform.pitch + result.amount;
46554 extendDuration(easeOptions, result);
46555 }
46556 if (easeOptions.zoom || easeOptions.bearing) {
46557 const last = deltas.pinchAround === undefined ? deltas.around : deltas.pinchAround;
46558 easeOptions.around = last ? this._map.unproject(last) : this._map.getCenter();
46559 }
46560 this.clear();
46561 return performance.extend(easeOptions, {
46562 noMoveStart: true
46563 });
46564 }
46565}
46566// Unfortunately zoom, bearing, etc can't have different durations and easings so
46567// we need to choose one. We use the longest duration and it's corresponding easing.
46568function extendDuration(easeOptions, result) {
46569 if (!easeOptions.duration || easeOptions.duration < result.duration) {
46570 easeOptions.duration = result.duration;
46571 easeOptions.easing = result.easing;
46572 }
46573}
46574function calculateEasing(amount, inertiaDuration, inertiaOptions) {
46575 const { maxSpeed, linearity, deceleration } = inertiaOptions;
46576 const speed = performance.clamp(amount * linearity / (inertiaDuration / 1000), -maxSpeed, maxSpeed);
46577 const duration = Math.abs(speed) / (deceleration * linearity);
46578 return {
46579 easing: inertiaOptions.easing,
46580 duration: duration * 1000,
46581 amount: speed * (duration / 2)
46582 };
46583}
46584
46585/**
46586 * `MapMouseEvent` is the event type for mouse-related map events.
46587 * @extends {Event}
46588 * @example
46589 * // The `click` event is an example of a `MapMouseEvent`.
46590 * // Set up an event listener on the map.
46591 * map.on('click', function(e) {
46592 * // The event object (e) contains information like the
46593 * // coordinates of the point on the map that was clicked.
46594 * console.log('A click event has occurred at ' + e.lngLat);
46595 * });
46596 */
46597class MapMouseEvent extends performance.Event {
46598 /**
46599 * @private
46600 */
46601 constructor(type, map, originalEvent, data = {}) {
46602 const point = DOM.mousePos(map.getCanvasContainer(), originalEvent);
46603 const lngLat = map.unproject(point);
46604 super(type, performance.extend({ point, lngLat, originalEvent }, data));
46605 this._defaultPrevented = false;
46606 this.target = map;
46607 }
46608 /**
46609 * Prevents subsequent default processing of the event by the map.
46610 *
46611 * Calling this method will prevent the following default map behaviors:
46612 *
46613 * * On `mousedown` events, the behavior of {@link DragPanHandler}
46614 * * On `mousedown` events, the behavior of {@link DragRotateHandler}
46615 * * On `mousedown` events, the behavior of {@link BoxZoomHandler}
46616 * * On `dblclick` events, the behavior of {@link DoubleClickZoomHandler}
46617 *
46618 */
46619 preventDefault() {
46620 this._defaultPrevented = true;
46621 }
46622 /**
46623 * `true` if `preventDefault` has been called.
46624 * @private
46625 */
46626 get defaultPrevented() {
46627 return this._defaultPrevented;
46628 }
46629}
46630/**
46631 * `MapTouchEvent` is the event type for touch-related map events.
46632 * @extends {Event}
46633 */
46634class MapTouchEvent extends performance.Event {
46635 /**
46636 * @private
46637 */
46638 constructor(type, map, originalEvent) {
46639 const touches = type === 'touchend' ? originalEvent.changedTouches : originalEvent.touches;
46640 const points = DOM.touchPos(map.getCanvasContainer(), touches);
46641 const lngLats = points.map((t) => map.unproject(t));
46642 const point = points.reduce((prev, curr, i, arr) => {
46643 return prev.add(curr.div(arr.length));
46644 }, new performance.pointGeometry(0, 0));
46645 const lngLat = map.unproject(point);
46646 super(type, { points, point, lngLats, lngLat, originalEvent });
46647 this._defaultPrevented = false;
46648 }
46649 /**
46650 * Prevents subsequent default processing of the event by the map.
46651 *
46652 * Calling this method will prevent the following default map behaviors:
46653 *
46654 * * On `touchstart` events, the behavior of {@link DragPanHandler}
46655 * * On `touchstart` events, the behavior of {@link TouchZoomRotateHandler}
46656 *
46657 */
46658 preventDefault() {
46659 this._defaultPrevented = true;
46660 }
46661 /**
46662 * `true` if `preventDefault` has been called.
46663 * @private
46664 */
46665 get defaultPrevented() {
46666 return this._defaultPrevented;
46667 }
46668}
46669/**
46670 * `MapWheelEvent` is the event type for the `wheel` map event.
46671 * @extends {Object}
46672 */
46673class MapWheelEvent extends performance.Event {
46674 /**
46675 * @private
46676 */
46677 constructor(type, map, originalEvent) {
46678 super(type, { originalEvent });
46679 this._defaultPrevented = false;
46680 }
46681 /**
46682 * Prevents subsequent default processing of the event by the map.
46683 *
46684 * Calling this method will prevent the the behavior of {@link ScrollZoomHandler}.
46685 */
46686 preventDefault() {
46687 this._defaultPrevented = true;
46688 }
46689 /**
46690 * `true` if `preventDefault` has been called.
46691 * @private
46692 */
46693 get defaultPrevented() {
46694 return this._defaultPrevented;
46695 }
46696}
46697
46698class MapEventHandler {
46699 constructor(map, options) {
46700 this._map = map;
46701 this._clickTolerance = options.clickTolerance;
46702 }
46703 reset() {
46704 delete this._mousedownPos;
46705 }
46706 wheel(e) {
46707 // If mapEvent.preventDefault() is called by the user, prevent handlers such as:
46708 // - ScrollZoom
46709 return this._firePreventable(new MapWheelEvent(e.type, this._map, e));
46710 }
46711 mousedown(e, point) {
46712 this._mousedownPos = point;
46713 // If mapEvent.preventDefault() is called by the user, prevent handlers such as:
46714 // - MousePan
46715 // - MouseRotate
46716 // - MousePitch
46717 // - DblclickHandler
46718 return this._firePreventable(new MapMouseEvent(e.type, this._map, e));
46719 }
46720 mouseup(e) {
46721 this._map.fire(new MapMouseEvent(e.type, this._map, e));
46722 }
46723 click(e, point) {
46724 if (this._mousedownPos && this._mousedownPos.dist(point) >= this._clickTolerance)
46725 return;
46726 this._map.fire(new MapMouseEvent(e.type, this._map, e));
46727 }
46728 dblclick(e) {
46729 // If mapEvent.preventDefault() is called by the user, prevent handlers such as:
46730 // - DblClickZoom
46731 return this._firePreventable(new MapMouseEvent(e.type, this._map, e));
46732 }
46733 mouseover(e) {
46734 this._map.fire(new MapMouseEvent(e.type, this._map, e));
46735 }
46736 mouseout(e) {
46737 this._map.fire(new MapMouseEvent(e.type, this._map, e));
46738 }
46739 touchstart(e) {
46740 // If mapEvent.preventDefault() is called by the user, prevent handlers such as:
46741 // - TouchPan
46742 // - TouchZoom
46743 // - TouchRotate
46744 // - TouchPitch
46745 // - TapZoom
46746 // - SwipeZoom
46747 return this._firePreventable(new MapTouchEvent(e.type, this._map, e));
46748 }
46749 touchmove(e) {
46750 this._map.fire(new MapTouchEvent(e.type, this._map, e));
46751 }
46752 touchend(e) {
46753 this._map.fire(new MapTouchEvent(e.type, this._map, e));
46754 }
46755 touchcancel(e) {
46756 this._map.fire(new MapTouchEvent(e.type, this._map, e));
46757 }
46758 _firePreventable(mapEvent) {
46759 this._map.fire(mapEvent);
46760 if (mapEvent.defaultPrevented) {
46761 // returning an object marks the handler as active and resets other handlers
46762 return {};
46763 }
46764 }
46765 isEnabled() {
46766 return true;
46767 }
46768 isActive() {
46769 return false;
46770 }
46771 enable() { }
46772 disable() { }
46773}
46774class BlockableMapEventHandler {
46775 constructor(map) {
46776 this._map = map;
46777 }
46778 reset() {
46779 this._delayContextMenu = false;
46780 delete this._contextMenuEvent;
46781 }
46782 mousemove(e) {
46783 // mousemove map events should not be fired when interaction handlers (pan, rotate, etc) are active
46784 this._map.fire(new MapMouseEvent(e.type, this._map, e));
46785 }
46786 mousedown() {
46787 this._delayContextMenu = true;
46788 }
46789 mouseup() {
46790 this._delayContextMenu = false;
46791 if (this._contextMenuEvent) {
46792 this._map.fire(new MapMouseEvent('contextmenu', this._map, this._contextMenuEvent));
46793 delete this._contextMenuEvent;
46794 }
46795 }
46796 contextmenu(e) {
46797 if (this._delayContextMenu) {
46798 // Mac: contextmenu fired on mousedown; we save it until mouseup for consistency's sake
46799 this._contextMenuEvent = e;
46800 }
46801 else {
46802 // Windows: contextmenu fired on mouseup, so fire event now
46803 this._map.fire(new MapMouseEvent(e.type, this._map, e));
46804 }
46805 // prevent browser context menu when necessary
46806 if (this._map.listens('contextmenu')) {
46807 e.preventDefault();
46808 }
46809 }
46810 isEnabled() {
46811 return true;
46812 }
46813 isActive() {
46814 return false;
46815 }
46816 enable() { }
46817 disable() { }
46818}
46819
46820/**
46821 * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box.
46822 * The bounding box is defined by clicking and holding `shift` while dragging the cursor.
46823 */
46824class BoxZoomHandler {
46825 /**
46826 * @private
46827 */
46828 constructor(map, options) {
46829 this._map = map;
46830 this._el = map.getCanvasContainer();
46831 this._container = map.getContainer();
46832 this._clickTolerance = options.clickTolerance || 1;
46833 }
46834 /**
46835 * Returns a Boolean indicating whether the "box zoom" interaction is enabled.
46836 *
46837 * @returns {boolean} `true` if the "box zoom" interaction is enabled.
46838 */
46839 isEnabled() {
46840 return !!this._enabled;
46841 }
46842 /**
46843 * Returns a Boolean indicating whether the "box zoom" interaction is active, i.e. currently being used.
46844 *
46845 * @returns {boolean} `true` if the "box zoom" interaction is active.
46846 */
46847 isActive() {
46848 return !!this._active;
46849 }
46850 /**
46851 * Enables the "box zoom" interaction.
46852 *
46853 * @example
46854 * map.boxZoom.enable();
46855 */
46856 enable() {
46857 if (this.isEnabled())
46858 return;
46859 this._enabled = true;
46860 }
46861 /**
46862 * Disables the "box zoom" interaction.
46863 *
46864 * @example
46865 * map.boxZoom.disable();
46866 */
46867 disable() {
46868 if (!this.isEnabled())
46869 return;
46870 this._enabled = false;
46871 }
46872 mousedown(e, point) {
46873 if (!this.isEnabled())
46874 return;
46875 if (!(e.shiftKey && e.button === 0))
46876 return;
46877 DOM.disableDrag();
46878 this._startPos = this._lastPos = point;
46879 this._active = true;
46880 }
46881 mousemoveWindow(e, point) {
46882 if (!this._active)
46883 return;
46884 const pos = point;
46885 if (this._lastPos.equals(pos) || (!this._box && pos.dist(this._startPos) < this._clickTolerance)) {
46886 return;
46887 }
46888 const p0 = this._startPos;
46889 this._lastPos = pos;
46890 if (!this._box) {
46891 this._box = DOM.create('div', 'maplibregl-boxzoom mapboxgl-boxzoom', this._container);
46892 this._container.classList.add('maplibregl-crosshair', 'mapboxgl-crosshair');
46893 this._fireEvent('boxzoomstart', e);
46894 }
46895 const minX = Math.min(p0.x, pos.x), maxX = Math.max(p0.x, pos.x), minY = Math.min(p0.y, pos.y), maxY = Math.max(p0.y, pos.y);
46896 DOM.setTransform(this._box, `translate(${minX}px,${minY}px)`);
46897 this._box.style.width = `${maxX - minX}px`;
46898 this._box.style.height = `${maxY - minY}px`;
46899 }
46900 mouseupWindow(e, point) {
46901 if (!this._active)
46902 return;
46903 if (e.button !== 0)
46904 return;
46905 const p0 = this._startPos, p1 = point;
46906 this.reset();
46907 DOM.suppressClick();
46908 if (p0.x === p1.x && p0.y === p1.y) {
46909 this._fireEvent('boxzoomcancel', e);
46910 }
46911 else {
46912 this._map.fire(new performance.Event('boxzoomend', { originalEvent: e }));
46913 return {
46914 cameraAnimation: map => map.fitScreenCoordinates(p0, p1, this._map.getBearing(), { linear: true })
46915 };
46916 }
46917 }
46918 keydown(e) {
46919 if (!this._active)
46920 return;
46921 if (e.keyCode === 27) {
46922 this.reset();
46923 this._fireEvent('boxzoomcancel', e);
46924 }
46925 }
46926 reset() {
46927 this._active = false;
46928 this._container.classList.remove('maplibregl-crosshair', 'mapboxgl-crosshair');
46929 if (this._box) {
46930 DOM.remove(this._box);
46931 this._box = null;
46932 }
46933 DOM.enableDrag();
46934 delete this._startPos;
46935 delete this._lastPos;
46936 }
46937 _fireEvent(type, e) {
46938 return this._map.fire(new performance.Event(type, { originalEvent: e }));
46939 }
46940}
46941
46942function indexTouches(touches, points) {
46943 performance.assert(touches.length === points.length);
46944 const obj = {};
46945 for (let i = 0; i < touches.length; i++) {
46946 obj[touches[i].identifier] = points[i];
46947 }
46948 return obj;
46949}
46950
46951function getCentroid(points) {
46952 const sum = new performance.pointGeometry(0, 0);
46953 for (const point of points) {
46954 sum._add(point);
46955 }
46956 return sum.div(points.length);
46957}
46958const MAX_TAP_INTERVAL = 500;
46959const MAX_TOUCH_TIME = 500;
46960const MAX_DIST = 30;
46961class SingleTapRecognizer {
46962 constructor(options) {
46963 this.reset();
46964 this.numTouches = options.numTouches;
46965 }
46966 reset() {
46967 delete this.centroid;
46968 delete this.startTime;
46969 delete this.touches;
46970 this.aborted = false;
46971 }
46972 touchstart(e, points, mapTouches) {
46973 if (this.centroid || mapTouches.length > this.numTouches) {
46974 this.aborted = true;
46975 }
46976 if (this.aborted) {
46977 return;
46978 }
46979 if (this.startTime === undefined) {
46980 this.startTime = e.timeStamp;
46981 }
46982 if (mapTouches.length === this.numTouches) {
46983 this.centroid = getCentroid(points);
46984 this.touches = indexTouches(mapTouches, points);
46985 }
46986 }
46987 touchmove(e, points, mapTouches) {
46988 if (this.aborted || !this.centroid)
46989 return;
46990 const newTouches = indexTouches(mapTouches, points);
46991 for (const id in this.touches) {
46992 const prevPos = this.touches[id];
46993 const pos = newTouches[id];
46994 if (!pos || pos.dist(prevPos) > MAX_DIST) {
46995 this.aborted = true;
46996 }
46997 }
46998 }
46999 touchend(e, points, mapTouches) {
47000 if (!this.centroid || e.timeStamp - this.startTime > MAX_TOUCH_TIME) {
47001 this.aborted = true;
47002 }
47003 if (mapTouches.length === 0) {
47004 const centroid = !this.aborted && this.centroid;
47005 this.reset();
47006 if (centroid)
47007 return centroid;
47008 }
47009 }
47010}
47011class TapRecognizer {
47012 constructor(options) {
47013 this.singleTap = new SingleTapRecognizer(options);
47014 this.numTaps = options.numTaps;
47015 this.reset();
47016 }
47017 reset() {
47018 this.lastTime = Infinity;
47019 delete this.lastTap;
47020 this.count = 0;
47021 this.singleTap.reset();
47022 }
47023 touchstart(e, points, mapTouches) {
47024 this.singleTap.touchstart(e, points, mapTouches);
47025 }
47026 touchmove(e, points, mapTouches) {
47027 this.singleTap.touchmove(e, points, mapTouches);
47028 }
47029 touchend(e, points, mapTouches) {
47030 const tap = this.singleTap.touchend(e, points, mapTouches);
47031 if (tap) {
47032 const soonEnough = e.timeStamp - this.lastTime < MAX_TAP_INTERVAL;
47033 const closeEnough = !this.lastTap || this.lastTap.dist(tap) < MAX_DIST;
47034 if (!soonEnough || !closeEnough) {
47035 this.reset();
47036 }
47037 this.count++;
47038 this.lastTime = e.timeStamp;
47039 this.lastTap = tap;
47040 if (this.count === this.numTaps) {
47041 this.reset();
47042 return tap;
47043 }
47044 }
47045 }
47046}
47047
47048class TapZoomHandler {
47049 constructor() {
47050 this._zoomIn = new TapRecognizer({
47051 numTouches: 1,
47052 numTaps: 2
47053 });
47054 this._zoomOut = new TapRecognizer({
47055 numTouches: 2,
47056 numTaps: 1
47057 });
47058 this.reset();
47059 }
47060 reset() {
47061 this._active = false;
47062 this._zoomIn.reset();
47063 this._zoomOut.reset();
47064 }
47065 touchstart(e, points, mapTouches) {
47066 this._zoomIn.touchstart(e, points, mapTouches);
47067 this._zoomOut.touchstart(e, points, mapTouches);
47068 }
47069 touchmove(e, points, mapTouches) {
47070 this._zoomIn.touchmove(e, points, mapTouches);
47071 this._zoomOut.touchmove(e, points, mapTouches);
47072 }
47073 touchend(e, points, mapTouches) {
47074 const zoomInPoint = this._zoomIn.touchend(e, points, mapTouches);
47075 const zoomOutPoint = this._zoomOut.touchend(e, points, mapTouches);
47076 if (zoomInPoint) {
47077 this._active = true;
47078 e.preventDefault();
47079 setTimeout(() => this.reset(), 0);
47080 return {
47081 cameraAnimation: (map) => map.easeTo({
47082 duration: 300,
47083 zoom: map.getZoom() + 1,
47084 around: map.unproject(zoomInPoint)
47085 }, { originalEvent: e })
47086 };
47087 }
47088 else if (zoomOutPoint) {
47089 this._active = true;
47090 e.preventDefault();
47091 setTimeout(() => this.reset(), 0);
47092 return {
47093 cameraAnimation: (map) => map.easeTo({
47094 duration: 300,
47095 zoom: map.getZoom() - 1,
47096 around: map.unproject(zoomOutPoint)
47097 }, { originalEvent: e })
47098 };
47099 }
47100 }
47101 touchcancel() {
47102 this.reset();
47103 }
47104 enable() {
47105 this._enabled = true;
47106 }
47107 disable() {
47108 this._enabled = false;
47109 this.reset();
47110 }
47111 isEnabled() {
47112 return this._enabled;
47113 }
47114 isActive() {
47115 return this._active;
47116 }
47117}
47118
47119const LEFT_BUTTON = 0;
47120const RIGHT_BUTTON = 2;
47121// the values for each button in MouseEvent.buttons
47122const BUTTONS_FLAGS = {
47123 [LEFT_BUTTON]: 1,
47124 [RIGHT_BUTTON]: 2
47125};
47126function buttonStillPressed(e, button) {
47127 const flag = BUTTONS_FLAGS[button];
47128 return e.buttons === undefined || (e.buttons & flag) !== flag;
47129}
47130class MouseHandler {
47131 constructor(options) {
47132 this.reset();
47133 this._clickTolerance = options.clickTolerance || 1;
47134 }
47135 reset() {
47136 this._active = false;
47137 this._moved = false;
47138 delete this._lastPoint;
47139 delete this._eventButton;
47140 }
47141 _correctButton(e, button) {
47142 return false; // implemented by child
47143 }
47144 _move(lastPoint, point) {
47145 return {}; // implemented by child
47146 }
47147 mousedown(e, point) {
47148 if (this._lastPoint)
47149 return;
47150 const eventButton = DOM.mouseButton(e);
47151 if (!this._correctButton(e, eventButton))
47152 return;
47153 this._lastPoint = point;
47154 this._eventButton = eventButton;
47155 }
47156 mousemoveWindow(e, point) {
47157 const lastPoint = this._lastPoint;
47158 if (!lastPoint)
47159 return;
47160 e.preventDefault();
47161 if (buttonStillPressed(e, this._eventButton)) {
47162 // Some browsers don't fire a `mouseup` when the mouseup occurs outside
47163 // the window or iframe:
47164 // https://github.com/mapbox/mapbox-gl-js/issues/4622
47165 //
47166 // If the button is no longer pressed during this `mousemove` it may have
47167 // been released outside of the window or iframe.
47168 this.reset();
47169 return;
47170 }
47171 if (!this._moved && point.dist(lastPoint) < this._clickTolerance)
47172 return;
47173 this._moved = true;
47174 this._lastPoint = point;
47175 // implemented by child class
47176 return this._move(lastPoint, point);
47177 }
47178 mouseupWindow(e) {
47179 if (!this._lastPoint)
47180 return;
47181 const eventButton = DOM.mouseButton(e);
47182 if (eventButton !== this._eventButton)
47183 return;
47184 if (this._moved)
47185 DOM.suppressClick();
47186 this.reset();
47187 }
47188 enable() {
47189 this._enabled = true;
47190 }
47191 disable() {
47192 this._enabled = false;
47193 this.reset();
47194 }
47195 isEnabled() {
47196 return this._enabled;
47197 }
47198 isActive() {
47199 return this._active;
47200 }
47201}
47202class MousePanHandler extends MouseHandler {
47203 mousedown(e, point) {
47204 super.mousedown(e, point);
47205 if (this._lastPoint)
47206 this._active = true;
47207 }
47208 _correctButton(e, button) {
47209 return button === LEFT_BUTTON && !e.ctrlKey;
47210 }
47211 _move(lastPoint, point) {
47212 return {
47213 around: point,
47214 panDelta: point.sub(lastPoint)
47215 };
47216 }
47217}
47218class MouseRotateHandler extends MouseHandler {
47219 _correctButton(e, button) {
47220 return (button === LEFT_BUTTON && e.ctrlKey) || (button === RIGHT_BUTTON);
47221 }
47222 _move(lastPoint, point) {
47223 const degreesPerPixelMoved = 0.8;
47224 const bearingDelta = (point.x - lastPoint.x) * degreesPerPixelMoved;
47225 if (bearingDelta) {
47226 this._active = true;
47227 return { bearingDelta };
47228 }
47229 }
47230 contextmenu(e) {
47231 // prevent browser context menu when necessary; we don't allow it with rotation
47232 // because we can't discern rotation gesture start from contextmenu on Mac
47233 e.preventDefault();
47234 }
47235}
47236class MousePitchHandler extends MouseHandler {
47237 _correctButton(e, button) {
47238 return (button === LEFT_BUTTON && e.ctrlKey) || (button === RIGHT_BUTTON);
47239 }
47240 _move(lastPoint, point) {
47241 const degreesPerPixelMoved = -0.5;
47242 const pitchDelta = (point.y - lastPoint.y) * degreesPerPixelMoved;
47243 if (pitchDelta) {
47244 this._active = true;
47245 return { pitchDelta };
47246 }
47247 }
47248 contextmenu(e) {
47249 // prevent browser context menu when necessary; we don't allow it with rotation
47250 // because we can't discern rotation gesture start from contextmenu on Mac
47251 e.preventDefault();
47252 }
47253}
47254
47255class TouchPanHandler {
47256 constructor(options) {
47257 this._minTouches = 1;
47258 this._clickTolerance = options.clickTolerance || 1;
47259 this.reset();
47260 }
47261 reset() {
47262 this._active = false;
47263 this._touches = {};
47264 this._sum = new performance.pointGeometry(0, 0);
47265 }
47266 touchstart(e, points, mapTouches) {
47267 return this._calculateTransform(e, points, mapTouches);
47268 }
47269 touchmove(e, points, mapTouches) {
47270 if (!this._active || mapTouches.length < this._minTouches)
47271 return;
47272 e.preventDefault();
47273 return this._calculateTransform(e, points, mapTouches);
47274 }
47275 touchend(e, points, mapTouches) {
47276 this._calculateTransform(e, points, mapTouches);
47277 if (this._active && mapTouches.length < this._minTouches) {
47278 this.reset();
47279 }
47280 }
47281 touchcancel() {
47282 this.reset();
47283 }
47284 _calculateTransform(e, points, mapTouches) {
47285 if (mapTouches.length > 0)
47286 this._active = true;
47287 const touches = indexTouches(mapTouches, points);
47288 const touchPointSum = new performance.pointGeometry(0, 0);
47289 const touchDeltaSum = new performance.pointGeometry(0, 0);
47290 let touchDeltaCount = 0;
47291 for (const identifier in touches) {
47292 const point = touches[identifier];
47293 const prevPoint = this._touches[identifier];
47294 if (prevPoint) {
47295 touchPointSum._add(point);
47296 touchDeltaSum._add(point.sub(prevPoint));
47297 touchDeltaCount++;
47298 touches[identifier] = point;
47299 }
47300 }
47301 this._touches = touches;
47302 if (touchDeltaCount < this._minTouches || !touchDeltaSum.mag())
47303 return;
47304 const panDelta = touchDeltaSum.div(touchDeltaCount);
47305 this._sum._add(panDelta);
47306 if (this._sum.mag() < this._clickTolerance)
47307 return;
47308 const around = touchPointSum.div(touchDeltaCount);
47309 return {
47310 around,
47311 panDelta
47312 };
47313 }
47314 enable() {
47315 this._enabled = true;
47316 }
47317 disable() {
47318 this._enabled = false;
47319 this.reset();
47320 }
47321 isEnabled() {
47322 return this._enabled;
47323 }
47324 isActive() {
47325 return this._active;
47326 }
47327}
47328
47329class TwoTouchHandler {
47330 constructor() {
47331 this.reset();
47332 }
47333 reset() {
47334 this._active = false;
47335 delete this._firstTwoTouches;
47336 }
47337 _start(points) { } //eslint-disable-line
47338 _move(points, pinchAround, e) { return {}; } //eslint-disable-line
47339 touchstart(e, points, mapTouches) {
47340 //console.log(e.target, e.targetTouches.length ? e.targetTouches[0].target : null);
47341 //log('touchstart', points, e.target.innerHTML, e.targetTouches.length ? e.targetTouches[0].target.innerHTML: undefined);
47342 if (this._firstTwoTouches || mapTouches.length < 2)
47343 return;
47344 this._firstTwoTouches = [
47345 mapTouches[0].identifier,
47346 mapTouches[1].identifier
47347 ];
47348 // implemented by child classes
47349 this._start([points[0], points[1]]);
47350 }
47351 touchmove(e, points, mapTouches) {
47352 if (!this._firstTwoTouches)
47353 return;
47354 e.preventDefault();
47355 const [idA, idB] = this._firstTwoTouches;
47356 const a = getTouchById(mapTouches, points, idA);
47357 const b = getTouchById(mapTouches, points, idB);
47358 if (!a || !b)
47359 return;
47360 const pinchAround = this._aroundCenter ? null : a.add(b).div(2);
47361 // implemented by child classes
47362 return this._move([a, b], pinchAround, e);
47363 }
47364 touchend(e, points, mapTouches) {
47365 if (!this._firstTwoTouches)
47366 return;
47367 const [idA, idB] = this._firstTwoTouches;
47368 const a = getTouchById(mapTouches, points, idA);
47369 const b = getTouchById(mapTouches, points, idB);
47370 if (a && b)
47371 return;
47372 if (this._active)
47373 DOM.suppressClick();
47374 this.reset();
47375 }
47376 touchcancel() {
47377 this.reset();
47378 }
47379 enable(options) {
47380 this._enabled = true;
47381 this._aroundCenter = !!options && options.around === 'center';
47382 }
47383 disable() {
47384 this._enabled = false;
47385 this.reset();
47386 }
47387 isEnabled() {
47388 return this._enabled;
47389 }
47390 isActive() {
47391 return this._active;
47392 }
47393}
47394function getTouchById(mapTouches, points, identifier) {
47395 for (let i = 0; i < mapTouches.length; i++) {
47396 if (mapTouches[i].identifier === identifier)
47397 return points[i];
47398 }
47399}
47400/* ZOOM */
47401const ZOOM_THRESHOLD = 0.1;
47402function getZoomDelta(distance, lastDistance) {
47403 return Math.log(distance / lastDistance) / Math.LN2;
47404}
47405class TouchZoomHandler extends TwoTouchHandler {
47406 reset() {
47407 super.reset();
47408 delete this._distance;
47409 delete this._startDistance;
47410 }
47411 _start(points) {
47412 this._startDistance = this._distance = points[0].dist(points[1]);
47413 }
47414 _move(points, pinchAround) {
47415 const lastDistance = this._distance;
47416 this._distance = points[0].dist(points[1]);
47417 if (!this._active && Math.abs(getZoomDelta(this._distance, this._startDistance)) < ZOOM_THRESHOLD)
47418 return;
47419 this._active = true;
47420 return {
47421 zoomDelta: getZoomDelta(this._distance, lastDistance),
47422 pinchAround
47423 };
47424 }
47425}
47426/* ROTATE */
47427const ROTATION_THRESHOLD = 25; // pixels along circumference of touch circle
47428function getBearingDelta(a, b) {
47429 return a.angleWith(b) * 180 / Math.PI;
47430}
47431class TouchRotateHandler extends TwoTouchHandler {
47432 reset() {
47433 super.reset();
47434 delete this._minDiameter;
47435 delete this._startVector;
47436 delete this._vector;
47437 }
47438 _start(points) {
47439 this._startVector = this._vector = points[0].sub(points[1]);
47440 this._minDiameter = points[0].dist(points[1]);
47441 }
47442 _move(points, pinchAround) {
47443 const lastVector = this._vector;
47444 this._vector = points[0].sub(points[1]);
47445 if (!this._active && this._isBelowThreshold(this._vector))
47446 return;
47447 this._active = true;
47448 return {
47449 bearingDelta: getBearingDelta(this._vector, lastVector),
47450 pinchAround
47451 };
47452 }
47453 _isBelowThreshold(vector) {
47454 /*
47455 * The threshold before a rotation actually happens is configured in
47456 * pixels alongth circumference of the circle formed by the two fingers.
47457 * This makes the threshold in degrees larger when the fingers are close
47458 * together and smaller when the fingers are far apart.
47459 *
47460 * Use the smallest diameter from the whole gesture to reduce sensitivity
47461 * when pinching in and out.
47462 */
47463 this._minDiameter = Math.min(this._minDiameter, vector.mag());
47464 const circumference = Math.PI * this._minDiameter;
47465 const threshold = ROTATION_THRESHOLD / circumference * 360;
47466 const bearingDeltaSinceStart = getBearingDelta(vector, this._startVector);
47467 return Math.abs(bearingDeltaSinceStart) < threshold;
47468 }
47469}
47470/* PITCH */
47471function isVertical(vector) {
47472 return Math.abs(vector.y) > Math.abs(vector.x);
47473}
47474const ALLOWED_SINGLE_TOUCH_TIME = 100;
47475/**
47476 * The `TouchPitchHandler` allows the user to pitch the map by dragging up and down with two fingers.
47477 */
47478class TouchPitchHandler extends TwoTouchHandler {
47479 reset() {
47480 super.reset();
47481 this._valid = undefined;
47482 delete this._firstMove;
47483 delete this._lastPoints;
47484 }
47485 _start(points) {
47486 this._lastPoints = points;
47487 if (isVertical(points[0].sub(points[1]))) {
47488 // fingers are more horizontal than vertical
47489 this._valid = false;
47490 }
47491 }
47492 _move(points, center, e) {
47493 const vectorA = points[0].sub(this._lastPoints[0]);
47494 const vectorB = points[1].sub(this._lastPoints[1]);
47495 this._valid = this.gestureBeginsVertically(vectorA, vectorB, e.timeStamp);
47496 if (!this._valid)
47497 return;
47498 this._lastPoints = points;
47499 this._active = true;
47500 const yDeltaAverage = (vectorA.y + vectorB.y) / 2;
47501 const degreesPerPixelMoved = -0.5;
47502 return {
47503 pitchDelta: yDeltaAverage * degreesPerPixelMoved
47504 };
47505 }
47506 gestureBeginsVertically(vectorA, vectorB, timeStamp) {
47507 if (this._valid !== undefined)
47508 return this._valid;
47509 const threshold = 2;
47510 const movedA = vectorA.mag() >= threshold;
47511 const movedB = vectorB.mag() >= threshold;
47512 // neither finger has moved a meaningful amount, wait
47513 if (!movedA && !movedB)
47514 return;
47515 // One finger has moved and the other has not.
47516 // If enough time has passed, decide it is not a pitch.
47517 if (!movedA || !movedB) {
47518 if (this._firstMove === undefined) {
47519 this._firstMove = timeStamp;
47520 }
47521 if (timeStamp - this._firstMove < ALLOWED_SINGLE_TOUCH_TIME) {
47522 // still waiting for a movement from the second finger
47523 return undefined;
47524 }
47525 else {
47526 return false;
47527 }
47528 }
47529 const isSameDirection = vectorA.y > 0 === vectorB.y > 0;
47530 return isVertical(vectorA) && isVertical(vectorB) && isSameDirection;
47531 }
47532}
47533
47534const defaultOptions$5 = {
47535 panStep: 100,
47536 bearingStep: 15,
47537 pitchStep: 10
47538};
47539/**
47540 * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using
47541 * the following keyboard shortcuts:
47542 *
47543 * - `=` / `+`: Increase the zoom level by 1.
47544 * - `Shift-=` / `Shift-+`: Increase the zoom level by 2.
47545 * - `-`: Decrease the zoom level by 1.
47546 * - `Shift--`: Decrease the zoom level by 2.
47547 * - Arrow keys: Pan by 100 pixels.
47548 * - `Shift+⇢`: Increase the rotation by 15 degrees.
47549 * - `Shift+⇠`: Decrease the rotation by 15 degrees.
47550 * - `Shift+⇡`: Increase the pitch by 10 degrees.
47551 * - `Shift+⇣`: Decrease the pitch by 10 degrees.
47552 */
47553class KeyboardHandler {
47554 /**
47555 * @private
47556 */
47557 constructor() {
47558 const stepOptions = defaultOptions$5;
47559 this._panStep = stepOptions.panStep;
47560 this._bearingStep = stepOptions.bearingStep;
47561 this._pitchStep = stepOptions.pitchStep;
47562 this._rotationDisabled = false;
47563 }
47564 reset() {
47565 this._active = false;
47566 }
47567 keydown(e) {
47568 if (e.altKey || e.ctrlKey || e.metaKey)
47569 return;
47570 let zoomDir = 0;
47571 let bearingDir = 0;
47572 let pitchDir = 0;
47573 let xDir = 0;
47574 let yDir = 0;
47575 switch (e.keyCode) {
47576 case 61:
47577 case 107:
47578 case 171:
47579 case 187:
47580 zoomDir = 1;
47581 break;
47582 case 189:
47583 case 109:
47584 case 173:
47585 zoomDir = -1;
47586 break;
47587 case 37:
47588 if (e.shiftKey) {
47589 bearingDir = -1;
47590 }
47591 else {
47592 e.preventDefault();
47593 xDir = -1;
47594 }
47595 break;
47596 case 39:
47597 if (e.shiftKey) {
47598 bearingDir = 1;
47599 }
47600 else {
47601 e.preventDefault();
47602 xDir = 1;
47603 }
47604 break;
47605 case 38:
47606 if (e.shiftKey) {
47607 pitchDir = 1;
47608 }
47609 else {
47610 e.preventDefault();
47611 yDir = -1;
47612 }
47613 break;
47614 case 40:
47615 if (e.shiftKey) {
47616 pitchDir = -1;
47617 }
47618 else {
47619 e.preventDefault();
47620 yDir = 1;
47621 }
47622 break;
47623 default:
47624 return;
47625 }
47626 if (this._rotationDisabled) {
47627 bearingDir = 0;
47628 pitchDir = 0;
47629 }
47630 return {
47631 cameraAnimation: (map) => {
47632 const zoom = map.getZoom();
47633 map.easeTo({
47634 duration: 300,
47635 easeId: 'keyboardHandler',
47636 easing: easeOut,
47637 zoom: zoomDir ? Math.round(zoom) + zoomDir * (e.shiftKey ? 2 : 1) : zoom,
47638 bearing: map.getBearing() + bearingDir * this._bearingStep,
47639 pitch: map.getPitch() + pitchDir * this._pitchStep,
47640 offset: [-xDir * this._panStep, -yDir * this._panStep],
47641 center: map.getCenter()
47642 }, { originalEvent: e });
47643 }
47644 };
47645 }
47646 /**
47647 * Enables the "keyboard rotate and zoom" interaction.
47648 *
47649 * @example
47650 * map.keyboard.enable();
47651 */
47652 enable() {
47653 this._enabled = true;
47654 }
47655 /**
47656 * Disables the "keyboard rotate and zoom" interaction.
47657 *
47658 * @example
47659 * map.keyboard.disable();
47660 */
47661 disable() {
47662 this._enabled = false;
47663 this.reset();
47664 }
47665 /**
47666 * Returns a Boolean indicating whether the "keyboard rotate and zoom"
47667 * interaction is enabled.
47668 *
47669 * @returns {boolean} `true` if the "keyboard rotate and zoom"
47670 * interaction is enabled.
47671 */
47672 isEnabled() {
47673 return this._enabled;
47674 }
47675 /**
47676 * Returns true if the handler is enabled and has detected the start of a
47677 * zoom/rotate gesture.
47678 *
47679 * @returns {boolean} `true` if the handler is enabled and has detected the
47680 * start of a zoom/rotate gesture.
47681 */
47682 isActive() {
47683 return this._active;
47684 }
47685 /**
47686 * Disables the "keyboard pan/rotate" interaction, leaving the
47687 * "keyboard zoom" interaction enabled.
47688 *
47689 * @example
47690 * map.keyboard.disableRotation();
47691 */
47692 disableRotation() {
47693 this._rotationDisabled = true;
47694 }
47695 /**
47696 * Enables the "keyboard pan/rotate" interaction.
47697 *
47698 * @example
47699 * map.keyboard.enable();
47700 * map.keyboard.enableRotation();
47701 */
47702 enableRotation() {
47703 this._rotationDisabled = false;
47704 }
47705}
47706function easeOut(t) {
47707 return t * (2 - t);
47708}
47709
47710// deltaY value for mouse scroll wheel identification
47711const wheelZoomDelta = 4.000244140625;
47712// These magic numbers control the rate of zoom. Trackpad events fire at a greater
47713// frequency than mouse scroll wheel, so reduce the zoom rate per wheel tick
47714const defaultZoomRate = 1 / 100;
47715const wheelZoomRate = 1 / 450;
47716// upper bound on how much we scale the map in any single render frame; this
47717// is used to limit zoom rate in the case of very fast scrolling
47718const maxScalePerFrame = 2;
47719/**
47720 * The `ScrollZoomHandler` allows the user to zoom the map by scrolling.
47721 */
47722class ScrollZoomHandler {
47723 /**
47724 * @private
47725 */
47726 constructor(map, handler) {
47727 this._map = map;
47728 this._el = map.getCanvasContainer();
47729 this._handler = handler;
47730 this._delta = 0;
47731 this._defaultZoomRate = defaultZoomRate;
47732 this._wheelZoomRate = wheelZoomRate;
47733 performance.bindAll(['_onTimeout'], this);
47734 }
47735 /**
47736 * Set the zoom rate of a trackpad
47737 * @param {number} [zoomRate=1/100] The rate used to scale trackpad movement to a zoom value.
47738 * @example
47739 * // Speed up trackpad zoom
47740 * map.scrollZoom.setZoomRate(1/25);
47741 */
47742 setZoomRate(zoomRate) {
47743 this._defaultZoomRate = zoomRate;
47744 }
47745 /**
47746 * Set the zoom rate of a mouse wheel
47747 * @param {number} [wheelZoomRate=1/450] The rate used to scale mouse wheel movement to a zoom value.
47748 * @example
47749 * // Slow down zoom of mouse wheel
47750 * map.scrollZoom.setWheelZoomRate(1/600);
47751 */
47752 setWheelZoomRate(wheelZoomRate) {
47753 this._wheelZoomRate = wheelZoomRate;
47754 }
47755 /**
47756 * Returns a Boolean indicating whether the "scroll to zoom" interaction is enabled.
47757 *
47758 * @returns {boolean} `true` if the "scroll to zoom" interaction is enabled.
47759 */
47760 isEnabled() {
47761 return !!this._enabled;
47762 }
47763 /*
47764 * Active state is turned on and off with every scroll wheel event and is set back to false before the map
47765 * render is called, so _active is not a good candidate for determining if a scroll zoom animation is in
47766 * progress.
47767 */
47768 isActive() {
47769 return !!this._active || this._finishTimeout !== undefined;
47770 }
47771 isZooming() {
47772 return !!this._zooming;
47773 }
47774 /**
47775 * Enables the "scroll to zoom" interaction.
47776 *
47777 * @param {Object} [options] Options object.
47778 * @param {string} [options.around] If "center" is passed, map will zoom around center of map
47779 *
47780 * @example
47781 * map.scrollZoom.enable();
47782 * @example
47783 * map.scrollZoom.enable({ around: 'center' })
47784 */
47785 enable(options) {
47786 if (this.isEnabled())
47787 return;
47788 this._enabled = true;
47789 this._aroundCenter = options && options.around === 'center';
47790 }
47791 /**
47792 * Disables the "scroll to zoom" interaction.
47793 *
47794 * @example
47795 * map.scrollZoom.disable();
47796 */
47797 disable() {
47798 if (!this.isEnabled())
47799 return;
47800 this._enabled = false;
47801 }
47802 wheel(e) {
47803 if (!this.isEnabled())
47804 return;
47805 let value = e.deltaMode === WheelEvent.DOM_DELTA_LINE ? e.deltaY * 40 : e.deltaY;
47806 const now = performance.exported.now(), timeDelta = now - (this._lastWheelEventTime || 0);
47807 this._lastWheelEventTime = now;
47808 if (value !== 0 && (value % wheelZoomDelta) === 0) {
47809 // This one is definitely a mouse wheel event.
47810 this._type = 'wheel';
47811 }
47812 else if (value !== 0 && Math.abs(value) < 4) {
47813 // This one is definitely a trackpad event because it is so small.
47814 this._type = 'trackpad';
47815 }
47816 else if (timeDelta > 400) {
47817 // This is likely a new scroll action.
47818 this._type = null;
47819 this._lastValue = value;
47820 // Start a timeout in case this was a singular event, and dely it by up to 40ms.
47821 this._timeout = setTimeout(this._onTimeout, 40, e);
47822 }
47823 else if (!this._type) {
47824 // This is a repeating event, but we don't know the type of event just yet.
47825 // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode.
47826 this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel';
47827 // Make sure our delayed event isn't fired again, because we accumulate
47828 // the previous event (which was less than 40ms ago) into this event.
47829 if (this._timeout) {
47830 clearTimeout(this._timeout);
47831 this._timeout = null;
47832 value += this._lastValue;
47833 }
47834 }
47835 // Slow down zoom if shift key is held for more precise zooming
47836 if (e.shiftKey && value)
47837 value = value / 4;
47838 // Only fire the callback if we actually know what type of scrolling device the user uses.
47839 if (this._type) {
47840 this._lastWheelEvent = e;
47841 this._delta -= value;
47842 if (!this._active) {
47843 this._start(e);
47844 }
47845 }
47846 e.preventDefault();
47847 }
47848 _onTimeout(initialEvent) {
47849 this._type = 'wheel';
47850 this._delta -= this._lastValue;
47851 if (!this._active) {
47852 this._start(initialEvent);
47853 }
47854 }
47855 _start(e) {
47856 if (!this._delta)
47857 return;
47858 if (this._frameId) {
47859 this._frameId = null;
47860 }
47861 this._active = true;
47862 if (!this.isZooming()) {
47863 this._zooming = true;
47864 }
47865 if (this._finishTimeout) {
47866 clearTimeout(this._finishTimeout);
47867 delete this._finishTimeout;
47868 }
47869 const pos = DOM.mousePos(this._el, e);
47870 this._around = performance.LngLat.convert(this._aroundCenter ? this._map.getCenter() : this._map.unproject(pos));
47871 this._aroundPoint = this._map.transform.locationPoint(this._around);
47872 if (!this._frameId) {
47873 this._frameId = true;
47874 this._handler._triggerRenderFrame();
47875 }
47876 }
47877 renderFrame() {
47878 if (!this._frameId)
47879 return;
47880 this._frameId = null;
47881 if (!this.isActive())
47882 return;
47883 const tr = this._map.transform;
47884 // if we've had scroll events since the last render frame, consume the
47885 // accumulated delta, and update the target zoom level accordingly
47886 if (this._delta !== 0) {
47887 // For trackpad events and single mouse wheel ticks, use the default zoom rate
47888 const zoomRate = (this._type === 'wheel' && Math.abs(this._delta) > wheelZoomDelta) ? this._wheelZoomRate : this._defaultZoomRate;
47889 // Scale by sigmoid of scroll wheel delta.
47890 let scale = maxScalePerFrame / (1 + Math.exp(-Math.abs(this._delta * zoomRate)));
47891 if (this._delta < 0 && scale !== 0) {
47892 scale = 1 / scale;
47893 }
47894 const fromScale = typeof this._targetZoom === 'number' ? tr.zoomScale(this._targetZoom) : tr.scale;
47895 this._targetZoom = Math.min(tr.maxZoom, Math.max(tr.minZoom, tr.scaleZoom(fromScale * scale)));
47896 // if this is a mouse wheel, refresh the starting zoom and easing
47897 // function we're using to smooth out the zooming between wheel
47898 // events
47899 if (this._type === 'wheel') {
47900 this._startZoom = tr.zoom;
47901 this._easing = this._smoothOutEasing(200);
47902 }
47903 this._delta = 0;
47904 }
47905 const targetZoom = typeof this._targetZoom === 'number' ?
47906 this._targetZoom : tr.zoom;
47907 const startZoom = this._startZoom;
47908 const easing = this._easing;
47909 let finished = false;
47910 let zoom;
47911 if (this._type === 'wheel' && startZoom && easing) {
47912 performance.assert(easing && typeof startZoom === 'number');
47913 const t = Math.min((performance.exported.now() - this._lastWheelEventTime) / 200, 1);
47914 const k = easing(t);
47915 zoom = performance.number(startZoom, targetZoom, k);
47916 if (t < 1) {
47917 if (!this._frameId) {
47918 this._frameId = true;
47919 }
47920 }
47921 else {
47922 finished = true;
47923 }
47924 }
47925 else {
47926 zoom = targetZoom;
47927 finished = true;
47928 }
47929 this._active = true;
47930 if (finished) {
47931 this._active = false;
47932 this._finishTimeout = setTimeout(() => {
47933 this._zooming = false;
47934 this._handler._triggerRenderFrame();
47935 delete this._targetZoom;
47936 delete this._finishTimeout;
47937 }, 200);
47938 }
47939 return {
47940 noInertia: true,
47941 needsRenderFrame: !finished,
47942 zoomDelta: zoom - tr.zoom,
47943 around: this._aroundPoint,
47944 originalEvent: this._lastWheelEvent
47945 };
47946 }
47947 _smoothOutEasing(duration) {
47948 let easing = performance.ease;
47949 if (this._prevEase) {
47950 const ease = this._prevEase, t = (performance.exported.now() - ease.start) / ease.duration, speed = ease.easing(t + 0.01) - ease.easing(t),
47951 // Quick hack to make new bezier that is continuous with last
47952 x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01, y = Math.sqrt(0.27 * 0.27 - x * x);
47953 easing = performance.bezier(x, y, 0.25, 1);
47954 }
47955 this._prevEase = {
47956 start: performance.exported.now(),
47957 duration,
47958 easing
47959 };
47960 return easing;
47961 }
47962 reset() {
47963 this._active = false;
47964 }
47965}
47966
47967/**
47968 * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by
47969 * double clicking or double tapping.
47970 */
47971class DoubleClickZoomHandler {
47972 /**
47973 * @private
47974 */
47975 constructor(clickZoom, TapZoom) {
47976 this._clickZoom = clickZoom;
47977 this._tapZoom = TapZoom;
47978 }
47979 /**
47980 * Enables the "double click to zoom" interaction.
47981 *
47982 * @example
47983 * map.doubleClickZoom.enable();
47984 */
47985 enable() {
47986 this._clickZoom.enable();
47987 this._tapZoom.enable();
47988 }
47989 /**
47990 * Disables the "double click to zoom" interaction.
47991 *
47992 * @example
47993 * map.doubleClickZoom.disable();
47994 */
47995 disable() {
47996 this._clickZoom.disable();
47997 this._tapZoom.disable();
47998 }
47999 /**
48000 * Returns a Boolean indicating whether the "double click to zoom" interaction is enabled.
48001 *
48002 * @returns {boolean} `true` if the "double click to zoom" interaction is enabled.
48003 */
48004 isEnabled() {
48005 return this._clickZoom.isEnabled() && this._tapZoom.isEnabled();
48006 }
48007 /**
48008 * Returns a Boolean indicating whether the "double click to zoom" interaction is active, i.e. currently being used.
48009 *
48010 * @returns {boolean} `true` if the "double click to zoom" interaction is active.
48011 */
48012 isActive() {
48013 return this._clickZoom.isActive() || this._tapZoom.isActive();
48014 }
48015}
48016
48017class ClickZoomHandler {
48018 constructor() {
48019 this.reset();
48020 }
48021 reset() {
48022 this._active = false;
48023 }
48024 dblclick(e, point) {
48025 e.preventDefault();
48026 return {
48027 cameraAnimation: (map) => {
48028 map.easeTo({
48029 duration: 300,
48030 zoom: map.getZoom() + (e.shiftKey ? -1 : 1),
48031 around: map.unproject(point)
48032 }, { originalEvent: e });
48033 }
48034 };
48035 }
48036 enable() {
48037 this._enabled = true;
48038 }
48039 disable() {
48040 this._enabled = false;
48041 this.reset();
48042 }
48043 isEnabled() {
48044 return this._enabled;
48045 }
48046 isActive() {
48047 return this._active;
48048 }
48049}
48050
48051class TapDragZoomHandler {
48052 constructor() {
48053 this._tap = new TapRecognizer({
48054 numTouches: 1,
48055 numTaps: 1
48056 });
48057 this.reset();
48058 }
48059 reset() {
48060 this._active = false;
48061 delete this._swipePoint;
48062 delete this._swipeTouch;
48063 delete this._tapTime;
48064 this._tap.reset();
48065 }
48066 touchstart(e, points, mapTouches) {
48067 if (this._swipePoint)
48068 return;
48069 if (this._tapTime && e.timeStamp - this._tapTime > MAX_TAP_INTERVAL) {
48070 this.reset();
48071 }
48072 if (!this._tapTime) {
48073 this._tap.touchstart(e, points, mapTouches);
48074 }
48075 else if (mapTouches.length > 0) {
48076 this._swipePoint = points[0];
48077 this._swipeTouch = mapTouches[0].identifier;
48078 }
48079 }
48080 touchmove(e, points, mapTouches) {
48081 if (!this._tapTime) {
48082 this._tap.touchmove(e, points, mapTouches);
48083 }
48084 else if (this._swipePoint) {
48085 if (mapTouches[0].identifier !== this._swipeTouch) {
48086 return;
48087 }
48088 const newSwipePoint = points[0];
48089 const dist = newSwipePoint.y - this._swipePoint.y;
48090 this._swipePoint = newSwipePoint;
48091 e.preventDefault();
48092 this._active = true;
48093 return {
48094 zoomDelta: dist / 128
48095 };
48096 }
48097 }
48098 touchend(e, points, mapTouches) {
48099 if (!this._tapTime) {
48100 const point = this._tap.touchend(e, points, mapTouches);
48101 if (point) {
48102 this._tapTime = e.timeStamp;
48103 }
48104 }
48105 else if (this._swipePoint) {
48106 if (mapTouches.length === 0) {
48107 this.reset();
48108 }
48109 }
48110 }
48111 touchcancel() {
48112 this.reset();
48113 }
48114 enable() {
48115 this._enabled = true;
48116 }
48117 disable() {
48118 this._enabled = false;
48119 this.reset();
48120 }
48121 isEnabled() {
48122 return this._enabled;
48123 }
48124 isActive() {
48125 return this._active;
48126 }
48127}
48128
48129/**
48130 * The `DragPanHandler` allows the user to pan the map by clicking and dragging
48131 * the cursor.
48132 */
48133class DragPanHandler {
48134 /**
48135 * @private
48136 */
48137 constructor(el, mousePan, touchPan) {
48138 this._el = el;
48139 this._mousePan = mousePan;
48140 this._touchPan = touchPan;
48141 }
48142 /**
48143 * Enables the "drag to pan" interaction.
48144 *
48145 * @param {Object} [options] Options object
48146 * @param {number} [options.linearity=0] factor used to scale the drag velocity
48147 * @param {Function} [options.easing=bezier(0, 0, 0.3, 1)] easing function applled to `map.panTo` when applying the drag.
48148 * @param {number} [options.maxSpeed=1400] the maximum value of the drag velocity.
48149 * @param {number} [options.deceleration=2500] the rate at which the speed reduces after the pan ends.
48150 *
48151 * @example
48152 * map.dragPan.enable();
48153 * @example
48154 * map.dragPan.enable({
48155 * linearity: 0.3,
48156 * easing: bezier(0, 0, 0.3, 1),
48157 * maxSpeed: 1400,
48158 * deceleration: 2500,
48159 * });
48160 */
48161 enable(options) {
48162 this._inertiaOptions = options || {};
48163 this._mousePan.enable();
48164 this._touchPan.enable();
48165 this._el.classList.add('maplibregl-touch-drag-pan', 'mapboxgl-touch-drag-pan');
48166 }
48167 /**
48168 * Disables the "drag to pan" interaction.
48169 *
48170 * @example
48171 * map.dragPan.disable();
48172 */
48173 disable() {
48174 this._mousePan.disable();
48175 this._touchPan.disable();
48176 this._el.classList.remove('maplibregl-touch-drag-pan', 'mapboxgl-touch-drag-pan');
48177 }
48178 /**
48179 * Returns a Boolean indicating whether the "drag to pan" interaction is enabled.
48180 *
48181 * @returns {boolean} `true` if the "drag to pan" interaction is enabled.
48182 */
48183 isEnabled() {
48184 return this._mousePan.isEnabled() && this._touchPan.isEnabled();
48185 }
48186 /**
48187 * Returns a Boolean indicating whether the "drag to pan" interaction is active, i.e. currently being used.
48188 *
48189 * @returns {boolean} `true` if the "drag to pan" interaction is active.
48190 */
48191 isActive() {
48192 return this._mousePan.isActive() || this._touchPan.isActive();
48193 }
48194}
48195
48196/**
48197 * The `DragRotateHandler` allows the user to rotate the map by clicking and
48198 * dragging the cursor while holding the right mouse button or `ctrl` key.
48199 */
48200class DragRotateHandler {
48201 /**
48202 * @param {Object} [options]
48203 * @param {number} [options.bearingSnap] The threshold, measured in degrees, that determines when the map's
48204 * bearing will snap to north.
48205 * @param {bool} [options.pitchWithRotate=true] Control the map pitch in addition to the bearing
48206 * @private
48207 */
48208 constructor(options, mouseRotate, mousePitch) {
48209 this._pitchWithRotate = options.pitchWithRotate;
48210 this._mouseRotate = mouseRotate;
48211 this._mousePitch = mousePitch;
48212 }
48213 /**
48214 * Enables the "drag to rotate" interaction.
48215 *
48216 * @example
48217 * map.dragRotate.enable();
48218 */
48219 enable() {
48220 this._mouseRotate.enable();
48221 if (this._pitchWithRotate)
48222 this._mousePitch.enable();
48223 }
48224 /**
48225 * Disables the "drag to rotate" interaction.
48226 *
48227 * @example
48228 * map.dragRotate.disable();
48229 */
48230 disable() {
48231 this._mouseRotate.disable();
48232 this._mousePitch.disable();
48233 }
48234 /**
48235 * Returns a Boolean indicating whether the "drag to rotate" interaction is enabled.
48236 *
48237 * @returns {boolean} `true` if the "drag to rotate" interaction is enabled.
48238 */
48239 isEnabled() {
48240 return this._mouseRotate.isEnabled() && (!this._pitchWithRotate || this._mousePitch.isEnabled());
48241 }
48242 /**
48243 * Returns a Boolean indicating whether the "drag to rotate" interaction is active, i.e. currently being used.
48244 *
48245 * @returns {boolean} `true` if the "drag to rotate" interaction is active.
48246 */
48247 isActive() {
48248 return this._mouseRotate.isActive() || this._mousePitch.isActive();
48249 }
48250}
48251
48252/**
48253 * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by
48254 * pinching on a touchscreen.
48255 *
48256 * They can zoom with one finger by double tapping and dragging. On the second tap,
48257 * hold the finger down and drag up or down to zoom in or out.
48258 */
48259class TouchZoomRotateHandler {
48260 /**
48261 * @private
48262 */
48263 constructor(el, touchZoom, touchRotate, tapDragZoom) {
48264 this._el = el;
48265 this._touchZoom = touchZoom;
48266 this._touchRotate = touchRotate;
48267 this._tapDragZoom = tapDragZoom;
48268 this._rotationDisabled = false;
48269 this._enabled = true;
48270 }
48271 /**
48272 * Enables the "pinch to rotate and zoom" interaction.
48273 *
48274 * @param {Object} [options] Options object.
48275 * @param {string} [options.around] If "center" is passed, map will zoom around the center
48276 *
48277 * @example
48278 * map.touchZoomRotate.enable();
48279 * @example
48280 * map.touchZoomRotate.enable({ around: 'center' });
48281 */
48282 enable(options) {
48283 this._touchZoom.enable(options);
48284 if (!this._rotationDisabled)
48285 this._touchRotate.enable(options);
48286 this._tapDragZoom.enable();
48287 this._el.classList.add('maplibregl-touch-zoom-rotate', 'mapboxgl-touch-zoom-rotate');
48288 }
48289 /**
48290 * Disables the "pinch to rotate and zoom" interaction.
48291 *
48292 * @example
48293 * map.touchZoomRotate.disable();
48294 */
48295 disable() {
48296 this._touchZoom.disable();
48297 this._touchRotate.disable();
48298 this._tapDragZoom.disable();
48299 this._el.classList.remove('maplibregl-touch-zoom-rotate', 'mapboxgl-touch-zoom-rotate');
48300 }
48301 /**
48302 * Returns a Boolean indicating whether the "pinch to rotate and zoom" interaction is enabled.
48303 *
48304 * @returns {boolean} `true` if the "pinch to rotate and zoom" interaction is enabled.
48305 */
48306 isEnabled() {
48307 return this._touchZoom.isEnabled() &&
48308 (this._rotationDisabled || this._touchRotate.isEnabled()) &&
48309 this._tapDragZoom.isEnabled();
48310 }
48311 /**
48312 * Returns true if the handler is enabled and has detected the start of a zoom/rotate gesture.
48313 *
48314 * @returns {boolean} //eslint-disable-line
48315 */
48316 isActive() {
48317 return this._touchZoom.isActive() || this._touchRotate.isActive() || this._tapDragZoom.isActive();
48318 }
48319 /**
48320 * Disables the "pinch to rotate" interaction, leaving the "pinch to zoom"
48321 * interaction enabled.
48322 *
48323 * @example
48324 * map.touchZoomRotate.disableRotation();
48325 */
48326 disableRotation() {
48327 this._rotationDisabled = true;
48328 this._touchRotate.disable();
48329 }
48330 /**
48331 * Enables the "pinch to rotate" interaction.
48332 *
48333 * @example
48334 * map.touchZoomRotate.enable();
48335 * map.touchZoomRotate.enableRotation();
48336 */
48337 enableRotation() {
48338 this._rotationDisabled = false;
48339 if (this._touchZoom.isEnabled())
48340 this._touchRotate.enable();
48341 }
48342}
48343
48344const isMoving = p => p.zoom || p.drag || p.pitch || p.rotate;
48345class RenderFrameEvent extends performance.Event {
48346}
48347function hasChange(result) {
48348 return (result.panDelta && result.panDelta.mag()) || result.zoomDelta || result.bearingDelta || result.pitchDelta;
48349}
48350class HandlerManager {
48351 constructor(map, options) {
48352 this._map = map;
48353 this._el = this._map.getCanvasContainer();
48354 this._handlers = [];
48355 this._handlersById = {};
48356 this._changes = [];
48357 this._inertia = new HandlerInertia(map);
48358 this._bearingSnap = options.bearingSnap;
48359 this._previousActiveHandlers = {};
48360 // Track whether map is currently moving, to compute start/move/end events
48361 this._eventsInProgress = {};
48362 this._addDefaultHandlers(options);
48363 performance.bindAll(['handleEvent', 'handleWindowEvent'], this);
48364 const el = this._el;
48365 this._listeners = [
48366 // This needs to be `passive: true` so that a double tap fires two
48367 // pairs of touchstart/end events in iOS Safari 13. If this is set to
48368 // `passive: false` then the second pair of events is only fired if
48369 // preventDefault() is called on the first touchstart. Calling preventDefault()
48370 // undesirably prevents click events.
48371 [el, 'touchstart', { passive: true }],
48372 // This needs to be `passive: false` so that scrolls and pinches can be
48373 // prevented in browsers that don't support `touch-actions: none`, for example iOS Safari 12.
48374 [el, 'touchmove', { passive: false }],
48375 [el, 'touchend', undefined],
48376 [el, 'touchcancel', undefined],
48377 [el, 'mousedown', undefined],
48378 [el, 'mousemove', undefined],
48379 [el, 'mouseup', undefined],
48380 // Bind window-level event listeners for move and up/end events. In the absence of
48381 // the pointer capture API, which is not supported by all necessary platforms,
48382 // window-level event listeners give us the best shot at capturing events that
48383 // fall outside the map canvas element. Use `{capture: true}` for the move event
48384 // to prevent map move events from being fired during a drag.
48385 [document, 'mousemove', { capture: true }],
48386 [document, 'mouseup', undefined],
48387 [el, 'mouseover', undefined],
48388 [el, 'mouseout', undefined],
48389 [el, 'dblclick', undefined],
48390 [el, 'click', undefined],
48391 [el, 'keydown', { capture: false }],
48392 [el, 'keyup', undefined],
48393 [el, 'wheel', { passive: false }],
48394 [el, 'contextmenu', undefined],
48395 [window, 'blur', undefined]
48396 ];
48397 for (const [target, type, listenerOptions] of this._listeners) {
48398 DOM.addEventListener(target, type, target === document ? this.handleWindowEvent : this.handleEvent, listenerOptions);
48399 }
48400 }
48401 destroy() {
48402 for (const [target, type, listenerOptions] of this._listeners) {
48403 DOM.removeEventListener(target, type, target === document ? this.handleWindowEvent : this.handleEvent, listenerOptions);
48404 }
48405 }
48406 _addDefaultHandlers(options) {
48407 const map = this._map;
48408 const el = map.getCanvasContainer();
48409 this._add('mapEvent', new MapEventHandler(map, options));
48410 const boxZoom = map.boxZoom = new BoxZoomHandler(map, options);
48411 this._add('boxZoom', boxZoom);
48412 const tapZoom = new TapZoomHandler();
48413 const clickZoom = new ClickZoomHandler();
48414 map.doubleClickZoom = new DoubleClickZoomHandler(clickZoom, tapZoom);
48415 this._add('tapZoom', tapZoom);
48416 this._add('clickZoom', clickZoom);
48417 const tapDragZoom = new TapDragZoomHandler();
48418 this._add('tapDragZoom', tapDragZoom);
48419 const touchPitch = map.touchPitch = new TouchPitchHandler();
48420 this._add('touchPitch', touchPitch);
48421 const mouseRotate = new MouseRotateHandler(options);
48422 const mousePitch = new MousePitchHandler(options);
48423 map.dragRotate = new DragRotateHandler(options, mouseRotate, mousePitch);
48424 this._add('mouseRotate', mouseRotate, ['mousePitch']);
48425 this._add('mousePitch', mousePitch, ['mouseRotate']);
48426 const mousePan = new MousePanHandler(options);
48427 const touchPan = new TouchPanHandler(options);
48428 map.dragPan = new DragPanHandler(el, mousePan, touchPan);
48429 this._add('mousePan', mousePan);
48430 this._add('touchPan', touchPan, ['touchZoom', 'touchRotate']);
48431 const touchRotate = new TouchRotateHandler();
48432 const touchZoom = new TouchZoomHandler();
48433 map.touchZoomRotate = new TouchZoomRotateHandler(el, touchZoom, touchRotate, tapDragZoom);
48434 this._add('touchRotate', touchRotate, ['touchPan', 'touchZoom']);
48435 this._add('touchZoom', touchZoom, ['touchPan', 'touchRotate']);
48436 const scrollZoom = map.scrollZoom = new ScrollZoomHandler(map, this);
48437 this._add('scrollZoom', scrollZoom, ['mousePan']);
48438 const keyboard = map.keyboard = new KeyboardHandler();
48439 this._add('keyboard', keyboard);
48440 this._add('blockableMapEvent', new BlockableMapEventHandler(map));
48441 for (const name of ['boxZoom', 'doubleClickZoom', 'tapDragZoom', 'touchPitch', 'dragRotate', 'dragPan', 'touchZoomRotate', 'scrollZoom', 'keyboard']) {
48442 if (options.interactive && options[name]) {
48443 map[name].enable(options[name]);
48444 }
48445 }
48446 }
48447 _add(handlerName, handler, allowed) {
48448 this._handlers.push({ handlerName, handler, allowed });
48449 this._handlersById[handlerName] = handler;
48450 }
48451 stop(allowEndAnimation) {
48452 // do nothing if this method was triggered by a gesture update
48453 if (this._updatingCamera)
48454 return;
48455 for (const { handler } of this._handlers) {
48456 handler.reset();
48457 }
48458 this._inertia.clear();
48459 this._fireEvents({}, {}, allowEndAnimation);
48460 this._changes = [];
48461 }
48462 isActive() {
48463 for (const { handler } of this._handlers) {
48464 if (handler.isActive())
48465 return true;
48466 }
48467 return false;
48468 }
48469 isZooming() {
48470 return !!this._eventsInProgress.zoom || this._map.scrollZoom.isZooming();
48471 }
48472 isRotating() {
48473 return !!this._eventsInProgress.rotate;
48474 }
48475 isMoving() {
48476 return Boolean(isMoving(this._eventsInProgress)) || this.isZooming();
48477 }
48478 _blockedByActive(activeHandlers, allowed, myName) {
48479 for (const name in activeHandlers) {
48480 if (name === myName)
48481 continue;
48482 if (!allowed || allowed.indexOf(name) < 0) {
48483 return true;
48484 }
48485 }
48486 return false;
48487 }
48488 handleWindowEvent(e) {
48489 this.handleEvent(e, `${e.type}Window`);
48490 }
48491 _getMapTouches(touches) {
48492 const mapTouches = [];
48493 for (const t of touches) {
48494 const target = t.target;
48495 if (this._el.contains(target)) {
48496 mapTouches.push(t);
48497 }
48498 }
48499 return mapTouches;
48500 }
48501 handleEvent(e, eventName) {
48502 if (e.type === 'blur') {
48503 this.stop(true);
48504 return;
48505 }
48506 this._updatingCamera = true;
48507 performance.assert(e.timeStamp !== undefined);
48508 const inputEvent = e.type === 'renderFrame' ? undefined : e;
48509 /*
48510 * We don't call e.preventDefault() for any events by default.
48511 * Handlers are responsible for calling it where necessary.
48512 */
48513 const mergedHandlerResult = { needsRenderFrame: false };
48514 const eventsInProgress = {};
48515 const activeHandlers = {};
48516 const eventTouches = e.touches;
48517 const mapTouches = eventTouches ? this._getMapTouches(eventTouches) : undefined;
48518 const points = mapTouches ? DOM.touchPos(this._el, mapTouches) : DOM.mousePos(this._el, e);
48519 for (const { handlerName, handler, allowed } of this._handlers) {
48520 if (!handler.isEnabled())
48521 continue;
48522 let data;
48523 if (this._blockedByActive(activeHandlers, allowed, handlerName)) {
48524 handler.reset();
48525 }
48526 else {
48527 if (handler[eventName || e.type]) {
48528 data = handler[eventName || e.type](e, points, mapTouches);
48529 this.mergeHandlerResult(mergedHandlerResult, eventsInProgress, data, handlerName, inputEvent);
48530 if (data && data.needsRenderFrame) {
48531 this._triggerRenderFrame();
48532 }
48533 }
48534 }
48535 if (data || handler.isActive()) {
48536 activeHandlers[handlerName] = handler;
48537 }
48538 }
48539 const deactivatedHandlers = {};
48540 for (const name in this._previousActiveHandlers) {
48541 if (!activeHandlers[name]) {
48542 deactivatedHandlers[name] = inputEvent;
48543 }
48544 }
48545 this._previousActiveHandlers = activeHandlers;
48546 if (Object.keys(deactivatedHandlers).length || hasChange(mergedHandlerResult)) {
48547 this._changes.push([mergedHandlerResult, eventsInProgress, deactivatedHandlers]);
48548 this._triggerRenderFrame();
48549 }
48550 if (Object.keys(activeHandlers).length || hasChange(mergedHandlerResult)) {
48551 this._map._stop(true);
48552 }
48553 this._updatingCamera = false;
48554 const { cameraAnimation } = mergedHandlerResult;
48555 if (cameraAnimation) {
48556 this._inertia.clear();
48557 this._fireEvents({}, {}, true);
48558 this._changes = [];
48559 cameraAnimation(this._map);
48560 }
48561 }
48562 mergeHandlerResult(mergedHandlerResult, eventsInProgress, handlerResult, name, e) {
48563 if (!handlerResult)
48564 return;
48565 performance.extend(mergedHandlerResult, handlerResult);
48566 const eventData = { handlerName: name, originalEvent: handlerResult.originalEvent || e };
48567 // track which handler changed which camera property
48568 if (handlerResult.zoomDelta !== undefined) {
48569 eventsInProgress.zoom = eventData;
48570 }
48571 if (handlerResult.panDelta !== undefined) {
48572 eventsInProgress.drag = eventData;
48573 }
48574 if (handlerResult.pitchDelta !== undefined) {
48575 eventsInProgress.pitch = eventData;
48576 }
48577 if (handlerResult.bearingDelta !== undefined) {
48578 eventsInProgress.rotate = eventData;
48579 }
48580 }
48581 _applyChanges() {
48582 const combined = {};
48583 const combinedEventsInProgress = {};
48584 const combinedDeactivatedHandlers = {};
48585 for (const [change, eventsInProgress, deactivatedHandlers] of this._changes) {
48586 if (change.panDelta)
48587 combined.panDelta = (combined.panDelta || new performance.pointGeometry(0, 0))._add(change.panDelta);
48588 if (change.zoomDelta)
48589 combined.zoomDelta = (combined.zoomDelta || 0) + change.zoomDelta;
48590 if (change.bearingDelta)
48591 combined.bearingDelta = (combined.bearingDelta || 0) + change.bearingDelta;
48592 if (change.pitchDelta)
48593 combined.pitchDelta = (combined.pitchDelta || 0) + change.pitchDelta;
48594 if (change.around !== undefined)
48595 combined.around = change.around;
48596 if (change.pinchAround !== undefined)
48597 combined.pinchAround = change.pinchAround;
48598 if (change.noInertia)
48599 combined.noInertia = change.noInertia;
48600 performance.extend(combinedEventsInProgress, eventsInProgress);
48601 performance.extend(combinedDeactivatedHandlers, deactivatedHandlers);
48602 }
48603 this._updateMapTransform(combined, combinedEventsInProgress, combinedDeactivatedHandlers);
48604 this._changes = [];
48605 }
48606 _updateMapTransform(combinedResult, combinedEventsInProgress, deactivatedHandlers) {
48607 const map = this._map;
48608 const tr = map.transform;
48609 if (!hasChange(combinedResult)) {
48610 return this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true);
48611 }
48612 let { panDelta, zoomDelta, bearingDelta, pitchDelta, around, pinchAround } = combinedResult;
48613 if (pinchAround !== undefined) {
48614 around = pinchAround;
48615 }
48616 // stop any ongoing camera animations (easeTo, flyTo)
48617 map._stop(true);
48618 around = around || map.transform.centerPoint;
48619 const loc = tr.pointLocation(panDelta ? around.sub(panDelta) : around);
48620 if (bearingDelta)
48621 tr.bearing += bearingDelta;
48622 if (pitchDelta)
48623 tr.pitch += pitchDelta;
48624 if (zoomDelta)
48625 tr.zoom += zoomDelta;
48626 tr.setLocationAtPoint(loc, around);
48627 this._map._update();
48628 if (!combinedResult.noInertia)
48629 this._inertia.record(combinedResult);
48630 this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true);
48631 }
48632 _fireEvents(newEventsInProgress, deactivatedHandlers, allowEndAnimation) {
48633 const wasMoving = isMoving(this._eventsInProgress);
48634 const nowMoving = isMoving(newEventsInProgress);
48635 const startEvents = {};
48636 for (const eventName in newEventsInProgress) {
48637 const { originalEvent } = newEventsInProgress[eventName];
48638 if (!this._eventsInProgress[eventName]) {
48639 startEvents[`${eventName}start`] = originalEvent;
48640 }
48641 this._eventsInProgress[eventName] = newEventsInProgress[eventName];
48642 }
48643 // fire start events only after this._eventsInProgress has been updated
48644 if (!wasMoving && nowMoving) {
48645 this._fireEvent('movestart', nowMoving.originalEvent);
48646 }
48647 for (const name in startEvents) {
48648 this._fireEvent(name, startEvents[name]);
48649 }
48650 if (nowMoving) {
48651 this._fireEvent('move', nowMoving.originalEvent);
48652 }
48653 for (const eventName in newEventsInProgress) {
48654 const { originalEvent } = newEventsInProgress[eventName];
48655 this._fireEvent(eventName, originalEvent);
48656 }
48657 const endEvents = {};
48658 let originalEndEvent;
48659 for (const eventName in this._eventsInProgress) {
48660 const { handlerName, originalEvent } = this._eventsInProgress[eventName];
48661 if (!this._handlersById[handlerName].isActive()) {
48662 delete this._eventsInProgress[eventName];
48663 originalEndEvent = deactivatedHandlers[handlerName] || originalEvent;
48664 endEvents[`${eventName}end`] = originalEndEvent;
48665 }
48666 }
48667 for (const name in endEvents) {
48668 this._fireEvent(name, endEvents[name]);
48669 }
48670 const stillMoving = isMoving(this._eventsInProgress);
48671 if (allowEndAnimation && (wasMoving || nowMoving) && !stillMoving) {
48672 this._updatingCamera = true;
48673 const inertialEase = this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions);
48674 const shouldSnapToNorth = bearing => bearing !== 0 && -this._bearingSnap < bearing && bearing < this._bearingSnap;
48675 if (inertialEase) {
48676 if (shouldSnapToNorth(inertialEase.bearing || this._map.getBearing())) {
48677 inertialEase.bearing = 0;
48678 }
48679 this._map.easeTo(inertialEase, { originalEvent: originalEndEvent });
48680 }
48681 else {
48682 this._map.fire(new performance.Event('moveend', { originalEvent: originalEndEvent }));
48683 if (shouldSnapToNorth(this._map.getBearing())) {
48684 this._map.resetNorth();
48685 }
48686 }
48687 this._updatingCamera = false;
48688 }
48689 }
48690 _fireEvent(type, e) {
48691 this._map.fire(new performance.Event(type, e ? { originalEvent: e } : {}));
48692 }
48693 _requestFrame() {
48694 this._map.triggerRepaint();
48695 return this._map._renderTaskQueue.add(timeStamp => {
48696 delete this._frameId;
48697 this.handleEvent(new RenderFrameEvent('renderFrame', { timeStamp }));
48698 this._applyChanges();
48699 });
48700 }
48701 _triggerRenderFrame() {
48702 if (this._frameId === undefined) {
48703 this._frameId = this._requestFrame();
48704 }
48705 }
48706}
48707
48708/**
48709 * This is a private namespace for utility functions that will get automatically stripped
48710 * out in production builds.
48711 *
48712 * @private
48713 */
48714const Debug = {
48715 extend(dest, ...sources) {
48716 return performance.extend(dest, ...sources);
48717 },
48718 run(fn) {
48719 fn();
48720 },
48721 logToElement(message, overwrite = false, id = 'log') {
48722 const el = window.document.getElementById(id);
48723 if (el) {
48724 if (overwrite)
48725 el.innerHTML = '';
48726 el.innerHTML += `<br>${message}`;
48727 }
48728 }
48729};
48730
48731class Camera extends performance.Evented {
48732 constructor(transform, options) {
48733 super();
48734 this._moving = false;
48735 this._zooming = false;
48736 this.transform = transform;
48737 this._bearingSnap = options.bearingSnap;
48738 performance.bindAll(['_renderFrameCallback'], this);
48739 //addAssertions(this);
48740 }
48741 /**
48742 * Returns the map's geographical centerpoint.
48743 *
48744 * @memberof Map#
48745 * @returns The map's geographical centerpoint.
48746 * @example
48747 * // return a LngLat object such as {lng: 0, lat: 0}
48748 * var center = map.getCenter();
48749 * // access longitude and latitude values directly
48750 * var {lng, lat} = map.getCenter();
48751 */
48752 getCenter() { return new performance.LngLat(this.transform.center.lng, this.transform.center.lat); }
48753 /**
48754 * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`.
48755 *
48756 * @memberof Map#
48757 * @param center The centerpoint to set.
48758 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48759 * @fires movestart
48760 * @fires moveend
48761 * @returns {Map} `this`
48762 * @example
48763 * map.setCenter([-74, 38]);
48764 */
48765 setCenter(center, eventData) {
48766 return this.jumpTo({ center }, eventData);
48767 }
48768 /**
48769 * Pans the map by the specified offset.
48770 *
48771 * @memberof Map#
48772 * @param offset `x` and `y` coordinates by which to pan the map.
48773 * @param options Options object
48774 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48775 * @fires movestart
48776 * @fires moveend
48777 * @returns {Map} `this`
48778 * @see [Navigate the map with game-like controls](https://maplibre.org/maplibre-gl-js-docs/example/game-controls/)
48779 */
48780 panBy(offset, options, eventData) {
48781 offset = performance.pointGeometry.convert(offset).mult(-1);
48782 return this.panTo(this.transform.center, performance.extend({ offset }, options), eventData);
48783 }
48784 /**
48785 * Pans the map to the specified location with an animated transition.
48786 *
48787 * @memberof Map#
48788 * @param lnglat The location to pan the map to.
48789 * @param options Options describing the destination and animation of the transition.
48790 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48791 * @fires movestart
48792 * @fires moveend
48793 * @returns {Map} `this`
48794 * @example
48795 * map.panTo([-74, 38]);
48796 * @example
48797 * // Specify that the panTo animation should last 5000 milliseconds.
48798 * map.panTo([-74, 38], {duration: 5000});
48799 * @see [Update a feature in realtime](https://maplibre.org/maplibre-gl-js-docs/example/live-update-feature/)
48800 */
48801 panTo(lnglat, options, eventData) {
48802 return this.easeTo(performance.extend({
48803 center: lnglat
48804 }, options), eventData);
48805 }
48806 /**
48807 * Returns the map's current zoom level.
48808 *
48809 * @memberof Map#
48810 * @returns The map's current zoom level.
48811 * @example
48812 * map.getZoom();
48813 */
48814 getZoom() { return this.transform.zoom; }
48815 /**
48816 * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`.
48817 *
48818 * @memberof Map#
48819 * @param zoom The zoom level to set (0-20).
48820 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48821 * @fires movestart
48822 * @fires zoomstart
48823 * @fires move
48824 * @fires zoom
48825 * @fires moveend
48826 * @fires zoomend
48827 * @returns {Map} `this`
48828 * @example
48829 * // Zoom to the zoom level 5 without an animated transition
48830 * map.setZoom(5);
48831 */
48832 setZoom(zoom, eventData) {
48833 this.jumpTo({ zoom }, eventData);
48834 return this;
48835 }
48836 /**
48837 * Zooms the map to the specified zoom level, with an animated transition.
48838 *
48839 * @memberof Map#
48840 * @param zoom The zoom level to transition to.
48841 * @param options Options object
48842 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48843 * @fires movestart
48844 * @fires zoomstart
48845 * @fires move
48846 * @fires zoom
48847 * @fires moveend
48848 * @fires zoomend
48849 * @returns {Map} `this`
48850 * @example
48851 * // Zoom to the zoom level 5 without an animated transition
48852 * map.zoomTo(5);
48853 * // Zoom to the zoom level 8 with an animated transition
48854 * map.zoomTo(8, {
48855 * duration: 2000,
48856 * offset: [100, 50]
48857 * });
48858 */
48859 zoomTo(zoom, options, eventData) {
48860 return this.easeTo(performance.extend({
48861 zoom
48862 }, options), eventData);
48863 }
48864 /**
48865 * Increases the map's zoom level by 1.
48866 *
48867 * @memberof Map#
48868 * @param options Options object
48869 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48870 * @fires movestart
48871 * @fires zoomstart
48872 * @fires move
48873 * @fires zoom
48874 * @fires moveend
48875 * @fires zoomend
48876 * @returns {Map} `this`
48877 * @example
48878 * // zoom the map in one level with a custom animation duration
48879 * map.zoomIn({duration: 1000});
48880 */
48881 zoomIn(options, eventData) {
48882 this.zoomTo(this.getZoom() + 1, options, eventData);
48883 return this;
48884 }
48885 /**
48886 * Decreases the map's zoom level by 1.
48887 *
48888 * @memberof Map#
48889 * @param options Options object
48890 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48891 * @fires movestart
48892 * @fires zoomstart
48893 * @fires move
48894 * @fires zoom
48895 * @fires moveend
48896 * @fires zoomend
48897 * @returns {Map} `this`
48898 * @example
48899 * // zoom the map out one level with a custom animation offset
48900 * map.zoomOut({offset: [80, 60]});
48901 */
48902 zoomOut(options, eventData) {
48903 this.zoomTo(this.getZoom() - 1, options, eventData);
48904 return this;
48905 }
48906 /**
48907 * Returns the map's current bearing. The bearing is the compass direction that is "up"; for example, a bearing
48908 * of 90° orients the map so that east is up.
48909 *
48910 * @memberof Map#
48911 * @returns The map's current bearing.
48912 * @see [Navigate the map with game-like controls](https://maplibre.org/maplibre-gl-js-docs/example/game-controls/)
48913 */
48914 getBearing() { return this.transform.bearing; }
48915 /**
48916 * Sets the map's bearing (rotation). The bearing is the compass direction that is "up"; for example, a bearing
48917 * of 90° orients the map so that east is up.
48918 *
48919 * Equivalent to `jumpTo({bearing: bearing})`.
48920 *
48921 * @memberof Map#
48922 * @param bearing The desired bearing.
48923 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48924 * @fires movestart
48925 * @fires moveend
48926 * @returns {Map} `this`
48927 * @example
48928 * // rotate the map to 90 degrees
48929 * map.setBearing(90);
48930 */
48931 setBearing(bearing, eventData) {
48932 this.jumpTo({ bearing }, eventData);
48933 return this;
48934 }
48935 /**
48936 * Returns the current padding applied around the map viewport.
48937 *
48938 * @memberof Map#
48939 * @returns The current padding around the map viewport.
48940 */
48941 getPadding() { return this.transform.padding; }
48942 /**
48943 * Sets the padding in pixels around the viewport.
48944 *
48945 * Equivalent to `jumpTo({padding: padding})`.
48946 *
48947 * @memberof Map#
48948 * @param padding The desired padding. Format: { left: number, right: number, top: number, bottom: number }
48949 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48950 * @fires movestart
48951 * @fires moveend
48952 * @returns {Map} `this`
48953 * @example
48954 * // Sets a left padding of 300px, and a top padding of 50px
48955 * map.setPadding({ left: 300, top: 50 });
48956 */
48957 setPadding(padding, eventData) {
48958 this.jumpTo({ padding }, eventData);
48959 return this;
48960 }
48961 /**
48962 * Rotates the map to the specified bearing, with an animated transition. The bearing is the compass direction
48963 * that is \"up\"; for example, a bearing of 90° orients the map so that east is up.
48964 *
48965 * @memberof Map#
48966 * @param bearing The desired bearing.
48967 * @param options Options object
48968 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48969 * @fires movestart
48970 * @fires moveend
48971 * @returns {Map} `this`
48972 */
48973 rotateTo(bearing, options, eventData) {
48974 return this.easeTo(performance.extend({
48975 bearing
48976 }, options), eventData);
48977 }
48978 /**
48979 * Rotates the map so that north is up (0° bearing), with an animated transition.
48980 *
48981 * @memberof Map#
48982 * @param options Options object
48983 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48984 * @fires movestart
48985 * @fires moveend
48986 * @returns {Map} `this`
48987 */
48988 resetNorth(options, eventData) {
48989 this.rotateTo(0, performance.extend({ duration: 1000 }, options), eventData);
48990 return this;
48991 }
48992 /**
48993 * Rotates and pitches the map so that north is up (0° bearing) and pitch is 0°, with an animated transition.
48994 *
48995 * @memberof Map#
48996 * @param options Options object
48997 * @param eventData Additional properties to be added to event objects of events triggered by this method.
48998 * @fires movestart
48999 * @fires moveend
49000 * @returns {Map} `this`
49001 */
49002 resetNorthPitch(options, eventData) {
49003 this.easeTo(performance.extend({
49004 bearing: 0,
49005 pitch: 0,
49006 duration: 1000
49007 }, options), eventData);
49008 return this;
49009 }
49010 /**
49011 * Snaps the map so that north is up (0° bearing), if the current bearing is close enough to it (i.e. within the
49012 * `bearingSnap` threshold).
49013 *
49014 * @memberof Map#
49015 * @param options Options object
49016 * @param eventData Additional properties to be added to event objects of events triggered by this method.
49017 * @fires movestart
49018 * @fires moveend
49019 * @returns {Map} `this`
49020 */
49021 snapToNorth(options, eventData) {
49022 if (Math.abs(this.getBearing()) < this._bearingSnap) {
49023 return this.resetNorth(options, eventData);
49024 }
49025 return this;
49026 }
49027 /**
49028 * Returns the map's current pitch (tilt).
49029 *
49030 * @memberof Map#
49031 * @returns The map's current pitch, measured in degrees away from the plane of the screen.
49032 */
49033 getPitch() { return this.transform.pitch; }
49034 /**
49035 * Sets the map's pitch (tilt). Equivalent to `jumpTo({pitch: pitch})`.
49036 *
49037 * @memberof Map#
49038 * @param pitch The pitch to set, measured in degrees away from the plane of the screen (0-60).
49039 * @param eventData Additional properties to be added to event objects of events triggered by this method.
49040 * @fires pitchstart
49041 * @fires movestart
49042 * @fires moveend
49043 * @returns {Map} `this`
49044 */
49045 setPitch(pitch, eventData) {
49046 this.jumpTo({ pitch }, eventData);
49047 return this;
49048 }
49049 /**
49050 * @memberof Map#
49051 * @param {LngLatBoundsLike} bounds Calculate the center for these bounds in the viewport and use
49052 * the highest zoom level up to and including `Map#getMaxZoom()` that fits
49053 * in the viewport. LngLatBounds represent a box that is always axis-aligned with bearing 0.
49054 * @param options Options object
49055 * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.
49056 * @param {number} [options.bearing=0] Desired map bearing at end of animation, in degrees.
49057 * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.
49058 * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds.
49059 * @returns {CenterZoomBearing} If map is able to fit to provided bounds, returns `center`, `zoom`, and `bearing`.
49060 * If map is unable to fit, method will warn and return undefined.
49061 * @example
49062 * var bbox = [[-79, 43], [-73, 45]];
49063 * var newCameraTransform = map.cameraForBounds(bbox, {
49064 * padding: {top: 10, bottom:25, left: 15, right: 5}
49065 * });
49066 */
49067 cameraForBounds(bounds, options) {
49068 bounds = performance.LngLatBounds.convert(bounds);
49069 const bearing = options && options.bearing || 0;
49070 return this._cameraForBoxAndBearing(bounds.getNorthWest(), bounds.getSouthEast(), bearing, options);
49071 }
49072 /**
49073 * Calculate the center of these two points in the viewport and use
49074 * the highest zoom level up to and including `Map#getMaxZoom()` that fits
49075 * the points in the viewport at the specified bearing.
49076 * @memberof Map#
49077 * @param {LngLatLike} p0 First point
49078 * @param {LngLatLike} p1 Second point
49079 * @param bearing Desired map bearing at end of animation, in degrees
49080 * @param options
49081 * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.
49082 * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.
49083 * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds.
49084 * @returns {CenterZoomBearing} If map is able to fit to provided bounds, returns `center`, `zoom`, and `bearing`.
49085 * If map is unable to fit, method will warn and return undefined.
49086 * @private
49087 * @example
49088 * var p0 = [-79, 43];
49089 * var p1 = [-73, 45];
49090 * var bearing = 90;
49091 * var newCameraTransform = map._cameraForBoxAndBearing(p0, p1, bearing, {
49092 * padding: {top: 10, bottom:25, left: 15, right: 5}
49093 * });
49094 */
49095 _cameraForBoxAndBearing(p0, p1, bearing, options) {
49096 const defaultPadding = {
49097 top: 0,
49098 bottom: 0,
49099 right: 0,
49100 left: 0
49101 };
49102 options = performance.extend({
49103 padding: defaultPadding,
49104 offset: [0, 0],
49105 maxZoom: this.transform.maxZoom
49106 }, options);
49107 if (typeof options.padding === 'number') {
49108 const p = options.padding;
49109 options.padding = {
49110 top: p,
49111 bottom: p,
49112 right: p,
49113 left: p
49114 };
49115 }
49116 options.padding = performance.extend(defaultPadding, options.padding);
49117 const tr = this.transform;
49118 const edgePadding = tr.padding;
49119 // We want to calculate the upper right and lower left of the box defined by p0 and p1
49120 // in a coordinate system rotate to match the destination bearing.
49121 const p0world = tr.project(performance.LngLat.convert(p0));
49122 const p1world = tr.project(performance.LngLat.convert(p1));
49123 const p0rotated = p0world.rotate(-bearing * Math.PI / 180);
49124 const p1rotated = p1world.rotate(-bearing * Math.PI / 180);
49125 const upperRight = new performance.pointGeometry(Math.max(p0rotated.x, p1rotated.x), Math.max(p0rotated.y, p1rotated.y));
49126 const lowerLeft = new performance.pointGeometry(Math.min(p0rotated.x, p1rotated.x), Math.min(p0rotated.y, p1rotated.y));
49127 // Calculate zoom: consider the original bbox and padding.
49128 const size = upperRight.sub(lowerLeft);
49129 const scaleX = (tr.width - (edgePadding.left + edgePadding.right + options.padding.left + options.padding.right)) / size.x;
49130 const scaleY = (tr.height - (edgePadding.top + edgePadding.bottom + options.padding.top + options.padding.bottom)) / size.y;
49131 if (scaleY < 0 || scaleX < 0) {
49132 performance.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.');
49133 return undefined;
49134 }
49135 const zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom);
49136 // Calculate center: apply the zoom, the configured offset, as well as offset that exists as a result of padding.
49137 const offset = performance.pointGeometry.convert(options.offset);
49138 const paddingOffsetX = (options.padding.left - options.padding.right) / 2;
49139 const paddingOffsetY = (options.padding.top - options.padding.bottom) / 2;
49140 const paddingOffset = new performance.pointGeometry(paddingOffsetX, paddingOffsetY);
49141 const rotatedPaddingOffset = paddingOffset.rotate(bearing * Math.PI / 180);
49142 const offsetAtInitialZoom = offset.add(rotatedPaddingOffset);
49143 const offsetAtFinalZoom = offsetAtInitialZoom.mult(tr.scale / tr.zoomScale(zoom));
49144 const center = tr.unproject(p0world.add(p1world).div(2).sub(offsetAtFinalZoom));
49145 return {
49146 center,
49147 zoom,
49148 bearing
49149 };
49150 }
49151 /**
49152 * Pans and zooms the map to contain its visible area within the specified geographical bounds.
49153 * This function will also reset the map's bearing to 0 if bearing is nonzero.
49154 *
49155 * @memberof Map#
49156 * @param bounds Center these bounds in the viewport and use the highest
49157 * zoom level up to and including `Map#getMaxZoom()` that fits them in the viewport.
49158 * @param {FitBoundsOptions} [options] Options supports all properties from {@link AnimationOptions} and {@link CameraOptions} in addition to the fields below.
49159 * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.
49160 * @param {boolean} [options.linear=false] If `true`, the map transitions using
49161 * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See
49162 * those functions and {@link AnimationOptions} for information about options available.
49163 * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}.
49164 * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.
49165 * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds.
49166 * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.
49167 * @fires movestart
49168 * @fires moveend
49169 * @returns {Map} `this`
49170 * @example
49171 * var bbox = [[-79, 43], [-73, 45]];
49172 * map.fitBounds(bbox, {
49173 * padding: {top: 10, bottom:25, left: 15, right: 5}
49174 * });
49175 * @see [Fit a map to a bounding box](https://maplibre.org/maplibre-gl-js-docs/example/fitbounds/)
49176 */
49177 fitBounds(bounds, options, eventData) {
49178 return this._fitInternal(this.cameraForBounds(bounds, options), options, eventData);
49179 }
49180 /**
49181 * Pans, rotates and zooms the map to to fit the box made by points p0 and p1
49182 * once the map is rotated to the specified bearing. To zoom without rotating,
49183 * pass in the current map bearing.
49184 *
49185 * @memberof Map#
49186 * @param p0 First point on screen, in pixel coordinates
49187 * @param p1 Second point on screen, in pixel coordinates
49188 * @param bearing Desired map bearing at end of animation, in degrees
49189 * @param options Options object
49190 * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.
49191 * @param {boolean} [options.linear=false] If `true`, the map transitions using
49192 * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See
49193 * those functions and {@link AnimationOptions} for information about options available.
49194 * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}.
49195 * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.
49196 * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds.
49197 * @param eventData Additional properties to be added to event objects of events triggered by this method.
49198 * @fires movestart
49199 * @fires moveend
49200 * @returns {Map} `this`
49201 * @example
49202 * var p0 = [220, 400];
49203 * var p1 = [500, 900];
49204 * map.fitScreenCoordinates(p0, p1, map.getBearing(), {
49205 * padding: {top: 10, bottom:25, left: 15, right: 5}
49206 * });
49207 * @see Used by {@link BoxZoomHandler}
49208 */
49209 fitScreenCoordinates(p0, p1, bearing, options, eventData) {
49210 return this._fitInternal(this._cameraForBoxAndBearing(this.transform.pointLocation(performance.pointGeometry.convert(p0)), this.transform.pointLocation(performance.pointGeometry.convert(p1)), bearing, options), options, eventData);
49211 }
49212 _fitInternal(calculatedOptions, options, eventData) {
49213 // cameraForBounds warns + returns undefined if unable to fit:
49214 if (!calculatedOptions)
49215 return this;
49216 options = performance.extend(calculatedOptions, options);
49217 // Explictly remove the padding field because, calculatedOptions already accounts for padding by setting zoom and center accordingly.
49218 delete options.padding;
49219 return options.linear ?
49220 this.easeTo(options, eventData) :
49221 this.flyTo(options, eventData);
49222 }
49223 /**
49224 * Changes any combination of center, zoom, bearing, and pitch, without
49225 * an animated transition. The map will retain its current values for any
49226 * details not specified in `options`.
49227 *
49228 * @memberof Map#
49229 * @param options Options object
49230 * @param eventData Additional properties to be added to event objects of events triggered by this method.
49231 * @fires movestart
49232 * @fires zoomstart
49233 * @fires pitchstart
49234 * @fires rotate
49235 * @fires move
49236 * @fires zoom
49237 * @fires pitch
49238 * @fires moveend
49239 * @fires zoomend
49240 * @fires pitchend
49241 * @returns {Map} `this`
49242 * @example
49243 * // jump to coordinates at current zoom
49244 * map.jumpTo({center: [0, 0]});
49245 * // jump with zoom, pitch, and bearing options
49246 * map.jumpTo({
49247 * center: [0, 0],
49248 * zoom: 8,
49249 * pitch: 45,
49250 * bearing: 90
49251 * });
49252 * @see [Jump to a series of locations](https://maplibre.org/maplibre-gl-js-docs/example/jump-to/)
49253 * @see [Update a feature in realtime](https://maplibre.org/maplibre-gl-js-docs/example/live-update-feature/)
49254 */
49255 jumpTo(options, eventData) {
49256 this.stop();
49257 const tr = this.transform;
49258 let zoomChanged = false, bearingChanged = false, pitchChanged = false;
49259 if ('zoom' in options && tr.zoom !== +options.zoom) {
49260 zoomChanged = true;
49261 tr.zoom = +options.zoom;
49262 }
49263 if (options.center !== undefined) {
49264 tr.center = performance.LngLat.convert(options.center);
49265 }
49266 if ('bearing' in options && tr.bearing !== +options.bearing) {
49267 bearingChanged = true;
49268 tr.bearing = +options.bearing;
49269 }
49270 if ('pitch' in options && tr.pitch !== +options.pitch) {
49271 pitchChanged = true;
49272 tr.pitch = +options.pitch;
49273 }
49274 if (options.padding != null && !tr.isPaddingEqual(options.padding)) {
49275 tr.padding = options.padding;
49276 }
49277 this.fire(new performance.Event('movestart', eventData))
49278 .fire(new performance.Event('move', eventData));
49279 if (zoomChanged) {
49280 this.fire(new performance.Event('zoomstart', eventData))
49281 .fire(new performance.Event('zoom', eventData))
49282 .fire(new performance.Event('zoomend', eventData));
49283 }
49284 if (bearingChanged) {
49285 this.fire(new performance.Event('rotatestart', eventData))
49286 .fire(new performance.Event('rotate', eventData))
49287 .fire(new performance.Event('rotateend', eventData));
49288 }
49289 if (pitchChanged) {
49290 this.fire(new performance.Event('pitchstart', eventData))
49291 .fire(new performance.Event('pitch', eventData))
49292 .fire(new performance.Event('pitchend', eventData));
49293 }
49294 return this.fire(new performance.Event('moveend', eventData));
49295 }
49296 /**
49297 * Changes any combination of `center`, `zoom`, `bearing`, `pitch`, and `padding` with an animated transition
49298 * between old and new values. The map will retain its current values for any
49299 * details not specified in `options`.
49300 *
49301 * Note: The transition will happen instantly if the user has enabled
49302 * the `reduced motion` accesibility feature enabled in their operating system,
49303 * unless `options` includes `essential: true`.
49304 *
49305 * @memberof Map#
49306 * @param options Options describing the destination and animation of the transition.
49307 * Accepts {@link CameraOptions} and {@link AnimationOptions}.
49308 * @param eventData Additional properties to be added to event objects of events triggered by this method.
49309 * @fires movestart
49310 * @fires zoomstart
49311 * @fires pitchstart
49312 * @fires rotate
49313 * @fires move
49314 * @fires zoom
49315 * @fires pitch
49316 * @fires moveend
49317 * @fires zoomend
49318 * @fires pitchend
49319 * @returns {Map} `this`
49320 * @see [Navigate the map with game-like controls](https://maplibre.org/maplibre-gl-js-docs/example/game-controls/)
49321 */
49322 easeTo(options, eventData) {
49323 this._stop(false, options.easeId);
49324 options = performance.extend({
49325 offset: [0, 0],
49326 duration: 500,
49327 easing: performance.ease
49328 }, options);
49329 if (options.animate === false || (!options.essential && performance.exported.prefersReducedMotion))
49330 options.duration = 0;
49331 const tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), startPadding = this.getPadding(), zoom = 'zoom' in options ? +options.zoom : startZoom, bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing, pitch = 'pitch' in options ? +options.pitch : startPitch, padding = 'padding' in options ? options.padding : tr.padding;
49332 const offsetAsPoint = performance.pointGeometry.convert(options.offset);
49333 let pointAtOffset = tr.centerPoint.add(offsetAsPoint);
49334 const locationAtOffset = tr.pointLocation(pointAtOffset);
49335 const center = performance.LngLat.convert(options.center || locationAtOffset);
49336 this._normalizeCenter(center);
49337 const from = tr.project(locationAtOffset);
49338 const delta = tr.project(center).sub(from);
49339 const finalScale = tr.zoomScale(zoom - startZoom);
49340 let around, aroundPoint;
49341 if (options.around) {
49342 around = performance.LngLat.convert(options.around);
49343 aroundPoint = tr.locationPoint(around);
49344 }
49345 const currently = {
49346 moving: this._moving,
49347 zooming: this._zooming,
49348 rotating: this._rotating,
49349 pitching: this._pitching
49350 };
49351 this._zooming = this._zooming || (zoom !== startZoom);
49352 this._rotating = this._rotating || (startBearing !== bearing);
49353 this._pitching = this._pitching || (pitch !== startPitch);
49354 this._padding = !tr.isPaddingEqual(padding);
49355 this._easeId = options.easeId;
49356 this._prepareEase(eventData, options.noMoveStart, currently);
49357 this._ease((k) => {
49358 if (this._zooming) {
49359 tr.zoom = performance.number(startZoom, zoom, k);
49360 }
49361 if (this._rotating) {
49362 tr.bearing = performance.number(startBearing, bearing, k);
49363 }
49364 if (this._pitching) {
49365 tr.pitch = performance.number(startPitch, pitch, k);
49366 }
49367 if (this._padding) {
49368 tr.interpolatePadding(startPadding, padding, k);
49369 // When padding is being applied, Transform#centerPoint is changing continously,
49370 // thus we need to recalculate offsetPoint every frame
49371 pointAtOffset = tr.centerPoint.add(offsetAsPoint);
49372 }
49373 if (around) {
49374 tr.setLocationAtPoint(around, aroundPoint);
49375 }
49376 else {
49377 const scale = tr.zoomScale(tr.zoom - startZoom);
49378 const base = zoom > startZoom ?
49379 Math.min(2, finalScale) :
49380 Math.max(0.5, finalScale);
49381 const speedup = Math.pow(base, 1 - k);
49382 const newCenter = tr.unproject(from.add(delta.mult(k * speedup)).mult(scale));
49383 tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset);
49384 }
49385 this._fireMoveEvents(eventData);
49386 }, (interruptingEaseId) => {
49387 this._afterEase(eventData, interruptingEaseId);
49388 }, options);
49389 return this;
49390 }
49391 _prepareEase(eventData, noMoveStart, currently = {}) {
49392 this._moving = true;
49393 if (!noMoveStart && !currently.moving) {
49394 this.fire(new performance.Event('movestart', eventData));
49395 }
49396 if (this._zooming && !currently.zooming) {
49397 this.fire(new performance.Event('zoomstart', eventData));
49398 }
49399 if (this._rotating && !currently.rotating) {
49400 this.fire(new performance.Event('rotatestart', eventData));
49401 }
49402 if (this._pitching && !currently.pitching) {
49403 this.fire(new performance.Event('pitchstart', eventData));
49404 }
49405 }
49406 _fireMoveEvents(eventData) {
49407 this.fire(new performance.Event('move', eventData));
49408 if (this._zooming) {
49409 this.fire(new performance.Event('zoom', eventData));
49410 }
49411 if (this._rotating) {
49412 this.fire(new performance.Event('rotate', eventData));
49413 }
49414 if (this._pitching) {
49415 this.fire(new performance.Event('pitch', eventData));
49416 }
49417 }
49418 _afterEase(eventData, easeId) {
49419 // if this easing is being stopped to start another easing with
49420 // the same id then don't fire any events to avoid extra start/stop events
49421 if (this._easeId && easeId && this._easeId === easeId) {
49422 return;
49423 }
49424 delete this._easeId;
49425 const wasZooming = this._zooming;
49426 const wasRotating = this._rotating;
49427 const wasPitching = this._pitching;
49428 this._moving = false;
49429 this._zooming = false;
49430 this._rotating = false;
49431 this._pitching = false;
49432 this._padding = false;
49433 if (wasZooming) {
49434 this.fire(new performance.Event('zoomend', eventData));
49435 }
49436 if (wasRotating) {
49437 this.fire(new performance.Event('rotateend', eventData));
49438 }
49439 if (wasPitching) {
49440 this.fire(new performance.Event('pitchend', eventData));
49441 }
49442 this.fire(new performance.Event('moveend', eventData));
49443 }
49444 /**
49445 * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that
49446 * evokes flight. The animation seamlessly incorporates zooming and panning to help
49447 * the user maintain her bearings even after traversing a great distance.
49448 *
49449 * Note: The animation will be skipped, and this will behave equivalently to `jumpTo`
49450 * if the user has the `reduced motion` accesibility feature enabled in their operating system,
49451 * unless 'options' includes `essential: true`.
49452 *
49453 * @memberof Map#
49454 * @param {FlyToOptions} options Options describing the destination and animation of the transition.
49455 * Accepts {@link CameraOptions}, {@link AnimationOptions},
49456 * and the following additional options.
49457 * @param {number} [options.curve=1.42] The zooming "curve" that will occur along the
49458 * flight path. A high value maximizes zooming for an exaggerated animation, while a low
49459 * value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average
49460 * value selected by participants in the user study discussed in
49461 * [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of
49462 * `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A
49463 * value of 1 would produce a circular motion.
49464 * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If
49465 * `options.curve` is specified, this option is ignored.
49466 * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to
49467 * `options.curve`. A speed of 1.2 means that the map appears to move along the flight path
49468 * by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span.
49469 * It does not correspond to a fixed physical distance, but varies by zoom level.
49470 * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls
49471 * per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored.
49472 * @param {number} [options.maxDuration] The animation's maximum duration, measured in milliseconds.
49473 * If duration exceeds maximum duration, it resets to 0.
49474 * @param eventData Additional properties to be added to event objects of events triggered by this method.
49475 * @fires movestart
49476 * @fires zoomstart
49477 * @fires pitchstart
49478 * @fires move
49479 * @fires zoom
49480 * @fires rotate
49481 * @fires pitch
49482 * @fires moveend
49483 * @fires zoomend
49484 * @fires pitchend
49485 * @returns {Map} `this`
49486 * @example
49487 * // fly with default options to null island
49488 * map.flyTo({center: [0, 0], zoom: 9});
49489 * // using flyTo options
49490 * map.flyTo({
49491 * center: [0, 0],
49492 * zoom: 9,
49493 * speed: 0.2,
49494 * curve: 1,
49495 * easing(t) {
49496 * return t;
49497 * }
49498 * });
49499 * @see [Fly to a location](https://maplibre.org/maplibre-gl-js-docs/example/flyto/)
49500 * @see [Slowly fly to a location](https://maplibre.org/maplibre-gl-js-docs/example/flyto-options/)
49501 * @see [Fly to a location based on scroll position](https://maplibre.org/maplibre-gl-js-docs/example/scroll-fly-to/)
49502 */
49503 flyTo(options, eventData) {
49504 // Fall through to jumpTo if user has set prefers-reduced-motion
49505 if (!options.essential && performance.exported.prefersReducedMotion) {
49506 const coercedOptions = performance.pick(options, ['center', 'zoom', 'bearing', 'pitch', 'around']);
49507 return this.jumpTo(coercedOptions, eventData);
49508 }
49509 // This method implements an “optimal path” animation, as detailed in:
49510 //
49511 // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS
49512 // ’03. pp. 15–22. <https://www.win.tue.nl/~vanwijk/zoompan.pdf#page=5>.
49513 //
49514 // Where applicable, local variable documentation begins with the associated variable or
49515 // function in van Wijk (2003).
49516 this.stop();
49517 options = performance.extend({
49518 offset: [0, 0],
49519 speed: 1.2,
49520 curve: 1.42,
49521 easing: performance.ease
49522 }, options);
49523 const tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), startPadding = this.getPadding();
49524 const zoom = 'zoom' in options ? performance.clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom;
49525 const bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing;
49526 const pitch = 'pitch' in options ? +options.pitch : startPitch;
49527 const padding = 'padding' in options ? options.padding : tr.padding;
49528 const scale = tr.zoomScale(zoom - startZoom);
49529 const offsetAsPoint = performance.pointGeometry.convert(options.offset);
49530 let pointAtOffset = tr.centerPoint.add(offsetAsPoint);
49531 const locationAtOffset = tr.pointLocation(pointAtOffset);
49532 const center = performance.LngLat.convert(options.center || locationAtOffset);
49533 this._normalizeCenter(center);
49534 const from = tr.project(locationAtOffset);
49535 const delta = tr.project(center).sub(from);
49536 let rho = options.curve;
49537 // w₀: Initial visible span, measured in pixels at the initial scale.
49538 const w0 = Math.max(tr.width, tr.height),
49539 // w₁: Final visible span, measured in pixels with respect to the initial scale.
49540 w1 = w0 / scale,
49541 // Length of the flight path as projected onto the ground plane, measured in pixels from
49542 // the world image origin at the initial scale.
49543 u1 = delta.mag();
49544 if ('minZoom' in options) {
49545 const minZoom = performance.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom);
49546 // w<sub>m</sub>: Maximum visible span, measured in pixels with respect to the initial
49547 // scale.
49548 const wMax = w0 / tr.zoomScale(minZoom - startZoom);
49549 rho = Math.sqrt(wMax / u1 * 2);
49550 }
49551 // ρ²
49552 const rho2 = rho * rho;
49553 /**
49554 * rᵢ: Returns the zoom-out factor at one end of the animation.
49555 *
49556 * @param i 0 for the ascent or 1 for the descent.
49557 * @private
49558 */
49559 function r(i) {
49560 const b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);
49561 return Math.log(Math.sqrt(b * b + 1) - b);
49562 }
49563 function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }
49564 function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }
49565 function tanh(n) { return sinh(n) / cosh(n); }
49566 // r₀: Zoom-out factor during ascent.
49567 const r0 = r(0);
49568 // w(s): Returns the visible span on the ground, measured in pixels with respect to the
49569 // initial scale. Assumes an angular field of view of 2 arctan ½ ≈ 53°.
49570 let w = function (s) {
49571 return (cosh(r0) / cosh(r0 + rho * s));
49572 };
49573 // u(s): Returns the distance along the flight path as projected onto the ground plane,
49574 // measured in pixels from the world image origin at the initial scale.
49575 let u = function (s) {
49576 return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1;
49577 };
49578 // S: Total length of the flight path, measured in ρ-screenfuls.
49579 let S = (r(1) - r0) / rho;
49580 // When u₀ = u₁, the optimal path doesn’t require both ascent and descent.
49581 if (Math.abs(u1) < 0.000001 || !isFinite(S)) {
49582 // Perform a more or less instantaneous transition if the path is too short.
49583 if (Math.abs(w0 - w1) < 0.000001)
49584 return this.easeTo(options, eventData);
49585 const k = w1 < w0 ? -1 : 1;
49586 S = Math.abs(Math.log(w1 / w0)) / rho;
49587 u = function () { return 0; };
49588 w = function (s) { return Math.exp(k * rho * s); };
49589 }
49590 if ('duration' in options) {
49591 options.duration = +options.duration;
49592 }
49593 else {
49594 const V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed;
49595 options.duration = 1000 * S / V;
49596 }
49597 if (options.maxDuration && options.duration > options.maxDuration) {
49598 options.duration = 0;
49599 }
49600 this._zooming = true;
49601 this._rotating = (startBearing !== bearing);
49602 this._pitching = (pitch !== startPitch);
49603 this._padding = !tr.isPaddingEqual(padding);
49604 this._prepareEase(eventData, false);
49605 this._ease((k) => {
49606 // s: The distance traveled along the flight path, measured in ρ-screenfuls.
49607 const s = k * S;
49608 const scale = 1 / w(s);
49609 tr.zoom = k === 1 ? zoom : startZoom + tr.scaleZoom(scale);
49610 if (this._rotating) {
49611 tr.bearing = performance.number(startBearing, bearing, k);
49612 }
49613 if (this._pitching) {
49614 tr.pitch = performance.number(startPitch, pitch, k);
49615 }
49616 if (this._padding) {
49617 tr.interpolatePadding(startPadding, padding, k);
49618 // When padding is being applied, Transform#centerPoint is changing continously,
49619 // thus we need to recalculate offsetPoint every frame
49620 pointAtOffset = tr.centerPoint.add(offsetAsPoint);
49621 }
49622 const newCenter = k === 1 ? center : tr.unproject(from.add(delta.mult(u(s))).mult(scale));
49623 tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset);
49624 this._fireMoveEvents(eventData);
49625 }, () => this._afterEase(eventData), options);
49626 return this;
49627 }
49628 isEasing() {
49629 return !!this._easeFrameId;
49630 }
49631 /**
49632 * Stops any animated transition underway.
49633 *
49634 * @memberof Map#
49635 * @returns {Map} `this`
49636 */
49637 stop() {
49638 return this._stop();
49639 }
49640 _stop(allowGestures, easeId) {
49641 if (this._easeFrameId) {
49642 this._cancelRenderFrame(this._easeFrameId);
49643 delete this._easeFrameId;
49644 delete this._onEaseFrame;
49645 }
49646 if (this._onEaseEnd) {
49647 // The _onEaseEnd function might emit events which trigger new
49648 // animation, which sets a new _onEaseEnd. Ensure we don't delete
49649 // it unintentionally.
49650 const onEaseEnd = this._onEaseEnd;
49651 delete this._onEaseEnd;
49652 onEaseEnd.call(this, easeId);
49653 }
49654 if (!allowGestures) {
49655 const handlers = this.handlers;
49656 if (handlers)
49657 handlers.stop(false);
49658 }
49659 return this;
49660 }
49661 _ease(frame, finish, options) {
49662 if (options.animate === false || options.duration === 0) {
49663 frame(1);
49664 finish();
49665 }
49666 else {
49667 this._easeStart = performance.exported.now();
49668 this._easeOptions = options;
49669 this._onEaseFrame = frame;
49670 this._onEaseEnd = finish;
49671 this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback);
49672 }
49673 }
49674 // Callback for map._requestRenderFrame
49675 _renderFrameCallback() {
49676 const t = Math.min((performance.exported.now() - this._easeStart) / this._easeOptions.duration, 1);
49677 this._onEaseFrame(this._easeOptions.easing(t));
49678 if (t < 1) {
49679 this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback);
49680 }
49681 else {
49682 this.stop();
49683 }
49684 }
49685 // convert bearing so that it's numerically close to the current one so that it interpolates properly
49686 _normalizeBearing(bearing, currentBearing) {
49687 bearing = performance.wrap(bearing, -180, 180);
49688 const diff = Math.abs(bearing - currentBearing);
49689 if (Math.abs(bearing - 360 - currentBearing) < diff)
49690 bearing -= 360;
49691 if (Math.abs(bearing + 360 - currentBearing) < diff)
49692 bearing += 360;
49693 return bearing;
49694 }
49695 // If a path crossing the antimeridian would be shorter, extend the final coordinate so that
49696 // interpolating between the two endpoints will cross it.
49697 _normalizeCenter(center) {
49698 const tr = this.transform;
49699 if (!tr.renderWorldCopies || tr.lngRange)
49700 return;
49701 const delta = center.lng - tr.center.lng;
49702 center.lng +=
49703 delta > 180 ? -360 :
49704 delta < -180 ? 360 : 0;
49705 }
49706}
49707// In debug builds, check that camera change events are fired in the correct order.
49708// - ___start events needs to be fired before ___ and ___end events
49709// - another ___start event can't be fired before a ___end event has been fired for the previous one
49710function addAssertions(camera) {
49711 Debug.run(() => {
49712 const inProgress = {};
49713 ['drag', 'zoom', 'rotate', 'pitch', 'move'].forEach(name => {
49714 inProgress[name] = false;
49715 camera.on(`${name}start`, () => {
49716 performance.assert(!inProgress[name], `"${name}start" fired twice without a "${name}end"`);
49717 inProgress[name] = true;
49718 performance.assert(inProgress.move);
49719 });
49720 camera.on(name, () => {
49721 performance.assert(inProgress[name]);
49722 performance.assert(inProgress.move);
49723 });
49724 camera.on(`${name}end`, () => {
49725 performance.assert(inProgress.move);
49726 performance.assert(inProgress[name]);
49727 inProgress[name] = false;
49728 });
49729 });
49730 // Canary used to test whether this function is stripped in prod build
49731 canary = 'canary debug run'; // eslint-disable-line
49732 });
49733}
49734let canary; // eslint-disable-line
49735
49736/**
49737 * An `AttributionControl` control presents the map's attribution information.
49738 *
49739 * @implements {IControl}
49740 * @param {Object} [options]
49741 * @param {boolean} [options.compact] If `true`, force a compact attribution that shows the full attribution on mouse hover. If `false`, force the full attribution control. The default is a responsive attribution that collapses when the map is less than 640 pixels wide. **Attribution should not be collapsed if it can comfortably fit on the map. `compact` should only be used to modify default attribution when map size makes it impossible to fit default attribution and when the automatic compact resizing for default settings are not sufficient.**
49742 * @param {string | Array<string>} [options.customAttribution] String or strings to show in addition to any other attributions.
49743 * @example
49744 * var map = new maplibregl.Map({attributionControl: false})
49745 * .addControl(new maplibregl.AttributionControl({
49746 * compact: true
49747 * }));
49748 */
49749class AttributionControl {
49750 constructor(options = {}) {
49751 this.options = options;
49752 performance.bindAll([
49753 '_toggleAttribution',
49754 '_updateData',
49755 '_updateCompact',
49756 '_updateCompactMinimize'
49757 ], this);
49758 }
49759 getDefaultPosition() {
49760 return 'bottom-right';
49761 }
49762 onAdd(map) {
49763 this._map = map;
49764 this._compact = this.options && this.options.compact;
49765 this._container = DOM.create('details', 'maplibregl-ctrl maplibregl-ctrl-attrib mapboxgl-ctrl mapboxgl-ctrl-attrib');
49766 this._compactButton = DOM.create('summary', 'maplibregl-ctrl-attrib-button mapboxgl-ctrl-attrib-button', this._container);
49767 this._compactButton.addEventListener('click', this._toggleAttribution);
49768 this._setElementTitle(this._compactButton, 'ToggleAttribution');
49769 this._innerContainer = DOM.create('div', 'maplibregl-ctrl-attrib-inner mapboxgl-ctrl-attrib-inner', this._container);
49770 this._updateAttributions();
49771 this._updateCompact();
49772 this._map.on('styledata', this._updateData);
49773 this._map.on('sourcedata', this._updateData);
49774 this._map.on('resize', this._updateCompact);
49775 this._map.on('drag', this._updateCompactMinimize);
49776 return this._container;
49777 }
49778 onRemove() {
49779 DOM.remove(this._container);
49780 this._map.off('styledata', this._updateData);
49781 this._map.off('sourcedata', this._updateData);
49782 this._map.off('resize', this._updateCompact);
49783 this._map.off('drag', this._updateCompactMinimize);
49784 this._map = undefined;
49785 this._compact = undefined;
49786 this._attribHTML = undefined;
49787 }
49788 _setElementTitle(element, title) {
49789 const str = this._map._getUIString(`AttributionControl.${title}`);
49790 element.title = str;
49791 element.setAttribute('aria-label', str);
49792 }
49793 _toggleAttribution() {
49794 if (this._container.classList.contains('maplibregl-compact')) {
49795 if (this._container.classList.contains('maplibregl-compact-show')) {
49796 this._container.setAttribute('open', '');
49797 this._container.classList.remove('maplibregl-compact-show', 'mapboxgl-compact-show');
49798 }
49799 else {
49800 this._container.classList.add('maplibregl-compact-show', 'mapboxgl-compact-show');
49801 this._container.removeAttribute('open');
49802 }
49803 }
49804 }
49805 _updateData(e) {
49806 if (e && (e.sourceDataType === 'metadata' || e.sourceDataType === 'visibility' || e.dataType === 'style')) {
49807 this._updateAttributions();
49808 }
49809 }
49810 _updateAttributions() {
49811 if (!this._map.style)
49812 return;
49813 let attributions = [];
49814 if (this.options.customAttribution) {
49815 if (Array.isArray(this.options.customAttribution)) {
49816 attributions = attributions.concat(this.options.customAttribution.map(attribution => {
49817 if (typeof attribution !== 'string')
49818 return '';
49819 return attribution;
49820 }));
49821 }
49822 else if (typeof this.options.customAttribution === 'string') {
49823 attributions.push(this.options.customAttribution);
49824 }
49825 }
49826 if (this._map.style.stylesheet) {
49827 const stylesheet = this._map.style.stylesheet;
49828 this.styleOwner = stylesheet.owner;
49829 this.styleId = stylesheet.id;
49830 }
49831 const sourceCaches = this._map.style.sourceCaches;
49832 for (const id in sourceCaches) {
49833 const sourceCache = sourceCaches[id];
49834 if (sourceCache.used) {
49835 const source = sourceCache.getSource();
49836 if (source.attribution && attributions.indexOf(source.attribution) < 0) {
49837 attributions.push(source.attribution);
49838 }
49839 }
49840 }
49841 // remove any entries that are whitespace
49842 attributions = attributions.filter(e => String(e).trim());
49843 // remove any entries that are substrings of another entry.
49844 // first sort by length so that substrings come first
49845 attributions.sort((a, b) => a.length - b.length);
49846 attributions = attributions.filter((attrib, i) => {
49847 for (let j = i + 1; j < attributions.length; j++) {
49848 if (attributions[j].indexOf(attrib) >= 0) {
49849 return false;
49850 }
49851 }
49852 return true;
49853 });
49854 // check if attribution string is different to minimize DOM changes
49855 const attribHTML = attributions.join(' | ');
49856 if (attribHTML === this._attribHTML)
49857 return;
49858 this._attribHTML = attribHTML;
49859 if (attributions.length) {
49860 this._innerContainer.innerHTML = attribHTML;
49861 this._container.classList.remove('maplibregl-attrib-empty', 'mapboxgl-attrib-empty');
49862 }
49863 else {
49864 this._container.classList.add('maplibregl-attrib-empty', 'mapboxgl-attrib-empty');
49865 }
49866 this._updateCompact();
49867 // remove old DOM node from _editLink
49868 this._editLink = null;
49869 }
49870 _updateCompact() {
49871 if (this._map.getCanvasContainer().offsetWidth <= 640 || this._compact) {
49872 if (this._compact === false) {
49873 this._container.setAttribute('open', '');
49874 }
49875 else if (!this._container.classList.contains('maplibregl-compact') && !this._container.classList.contains('maplibregl-attrib-empty')) {
49876 this._container.setAttribute('open', '');
49877 this._container.classList.add('maplibregl-compact', 'mapboxgl-compact', 'maplibregl-compact-show', 'mapboxgl-compact-show');
49878 }
49879 }
49880 else {
49881 this._container.setAttribute('open', '');
49882 if (this._container.classList.contains('maplibregl-compact')) {
49883 this._container.classList.remove('maplibregl-compact', 'maplibregl-compact-show', 'mapboxgl-compact', 'mapboxgl-compact-show');
49884 }
49885 }
49886 }
49887 _updateCompactMinimize() {
49888 if (this._container.classList.contains('maplibregl-compact')) {
49889 if (this._container.classList.contains('maplibregl-compact-show')) {
49890 this._container.classList.remove('maplibregl-compact-show', 'mapboxgl-compact-show');
49891 }
49892 }
49893 }
49894}
49895
49896/**
49897 * A `LogoControl` is a control that adds the watermark.
49898 *
49899 * @implements {IControl}
49900 * @param {Object} [options]
49901 * @param {boolean} [options.compact] If `true`, force a compact logo. If `false`, force the full logo. The default is a responsive logo that collapses when the map is less than 640 pixels wide.
49902 **/
49903class LogoControl {
49904 constructor(options = {}) {
49905 this.options = options;
49906 performance.bindAll([
49907 '_updateCompact'
49908 ], this);
49909 }
49910 getDefaultPosition() {
49911 return 'bottom-left';
49912 }
49913 onAdd(map) {
49914 this._map = map;
49915 this._compact = this.options && this.options.compact;
49916 this._container = DOM.create('div', 'maplibregl-ctrl mapboxgl-ctrl');
49917 const anchor = DOM.create('a', 'maplibregl-ctrl-logo mapboxgl-ctrl-logo');
49918 anchor.target = '_blank';
49919 anchor.rel = 'noopener nofollow';
49920 anchor.href = 'https://maplibre.org/';
49921 anchor.setAttribute('aria-label', this._map._getUIString('LogoControl.Title'));
49922 anchor.setAttribute('rel', 'noopener nofollow');
49923 this._container.appendChild(anchor);
49924 this._container.style.display = 'block';
49925 this._map.on('resize', this._updateCompact);
49926 this._updateCompact();
49927 return this._container;
49928 }
49929 onRemove() {
49930 DOM.remove(this._container);
49931 this._map.off('resize', this._updateCompact);
49932 this._map = undefined;
49933 this._compact = undefined;
49934 }
49935 _updateCompact() {
49936 const containerChildren = this._container.children;
49937 if (containerChildren.length) {
49938 const anchor = containerChildren[0];
49939 if (this._map.getCanvasContainer().offsetWidth <= 640 || this._compact) {
49940 if (this._compact !== false) {
49941 anchor.classList.add('maplibregl-compact', 'mapboxgl-compact');
49942 }
49943 }
49944 else {
49945 anchor.classList.remove('maplibregl-compact', 'mapboxgl-compact');
49946 }
49947 }
49948 }
49949}
49950
49951class TaskQueue {
49952 constructor() {
49953 this._queue = [];
49954 this._id = 0;
49955 this._cleared = false;
49956 this._currentlyRunning = false;
49957 }
49958 add(callback) {
49959 const id = ++this._id;
49960 const queue = this._queue;
49961 queue.push({ callback, id, cancelled: false });
49962 return id;
49963 }
49964 remove(id) {
49965 const running = this._currentlyRunning;
49966 const queue = running ? this._queue.concat(running) : this._queue;
49967 for (const task of queue) {
49968 if (task.id === id) {
49969 task.cancelled = true;
49970 return;
49971 }
49972 }
49973 }
49974 run(timeStamp = 0) {
49975 performance.assert(!this._currentlyRunning);
49976 const queue = this._currentlyRunning = this._queue;
49977 // Tasks queued by callbacks in the current queue should be executed
49978 // on the next run, not the current run.
49979 this._queue = [];
49980 for (const task of queue) {
49981 if (task.cancelled)
49982 continue;
49983 task.callback(timeStamp);
49984 if (this._cleared)
49985 break;
49986 }
49987 this._cleared = false;
49988 this._currentlyRunning = false;
49989 }
49990 clear() {
49991 if (this._currentlyRunning) {
49992 this._cleared = true;
49993 }
49994 this._queue = [];
49995 }
49996}
49997
49998const defaultLocale = {
49999 'AttributionControl.ToggleAttribution': 'Toggle attribution',
50000 'AttributionControl.MapFeedback': 'Map feedback',
50001 'FullscreenControl.Enter': 'Enter fullscreen',
50002 'FullscreenControl.Exit': 'Exit fullscreen',
50003 'GeolocateControl.FindMyLocation': 'Find my location',
50004 'GeolocateControl.LocationNotAvailable': 'Location not available',
50005 'LogoControl.Title': 'Mapbox logo',
50006 'NavigationControl.ResetBearing': 'Reset bearing to north',
50007 'NavigationControl.ZoomIn': 'Zoom in',
50008 'NavigationControl.ZoomOut': 'Zoom out',
50009 'ScaleControl.Feet': 'ft',
50010 'ScaleControl.Meters': 'm',
50011 'ScaleControl.Kilometers': 'km',
50012 'ScaleControl.Miles': 'mi',
50013 'ScaleControl.NauticalMiles': 'nm'
50014};
50015
50016const defaultMinZoom = -2;
50017const defaultMaxZoom = 22;
50018// the default values, but also the valid range
50019const defaultMinPitch = 0;
50020const defaultMaxPitch = 60;
50021// use this variable to check maxPitch for validity
50022const maxPitchThreshold = 85;
50023const defaultOptions$4 = {
50024 center: [0, 0],
50025 zoom: 0,
50026 bearing: 0,
50027 pitch: 0,
50028 minZoom: defaultMinZoom,
50029 maxZoom: defaultMaxZoom,
50030 minPitch: defaultMinPitch,
50031 maxPitch: defaultMaxPitch,
50032 interactive: true,
50033 scrollZoom: true,
50034 boxZoom: true,
50035 dragRotate: true,
50036 dragPan: true,
50037 keyboard: true,
50038 doubleClickZoom: true,
50039 touchZoomRotate: true,
50040 touchPitch: true,
50041 bearingSnap: 7,
50042 clickTolerance: 3,
50043 pitchWithRotate: true,
50044 hash: false,
50045 attributionControl: true,
50046 maplibreLogo: false,
50047 failIfMajorPerformanceCaveat: false,
50048 preserveDrawingBuffer: false,
50049 trackResize: true,
50050 renderWorldCopies: true,
50051 refreshExpiredTiles: true,
50052 maxTileCacheSize: null,
50053 localIdeographFontFamily: 'sans-serif',
50054 transformRequest: null,
50055 fadeDuration: 300,
50056 crossSourceCollisions: true
50057};
50058/**
50059 * The `Map` object represents the map on your page. It exposes methods
50060 * and properties that enable you to programmatically change the map,
50061 * and fires events as users interact with it.
50062 *
50063 * You create a `Map` by specifying a `container` and other options.
50064 * Then MapLibre GL JS initializes the map on the page and returns your `Map`
50065 * object.
50066 *
50067 * @extends Evented
50068 * @param {Object} options
50069 * @param {HTMLElement|string} options.container The HTML element in which MapLibre GL JS will render the map, or the element's string `id`. The specified element must have no children.
50070 * @param {number} [options.minZoom=0] The minimum zoom level of the map (0-24).
50071 * @param {number} [options.maxZoom=22] The maximum zoom level of the map (0-24).
50072 * @param {number} [options.minPitch=0] The minimum pitch of the map (0-85). Values greater than 60 degrees are experimental and may result in rendering issues. If you encounter any, please raise an issue with details in the MapLibre project.
50073 * @param {number} [options.maxPitch=60] The maximum pitch of the map (0-85). Values greater than 60 degrees are experimental and may result in rendering issues. If you encounter any, please raise an issue with details in the MapLibre project.
50074 * @param {Object|string} [options.style] The map's MapLibre style. This must be an a JSON object conforming to
50075 * the schema described in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/), or a URL to
50076 * such JSON.
50077 *
50078 *
50079 * @param {(boolean|string)} [options.hash=false] If `true`, the map's position (zoom, center latitude, center longitude, bearing, and pitch) will be synced with the hash fragment of the page's URL.
50080 * For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1/60`.
50081 * An additional string may optionally be provided to indicate a parameter-styled hash,
50082 * e.g. http://path/to/my/page.html#map=2.59/39.26/53.07/-24.1/60&foo=bar, where foo
50083 * is a custom parameter and bar is an arbitrary hash distinct from the map hash.
50084 * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction.
50085 * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's
50086 * bearing will snap to north. For example, with a `bearingSnap` of 7, if the user rotates
50087 * the map within 7 degrees of north, the map will automatically snap to exact north.
50088 * @param {boolean} [options.pitchWithRotate=true] If `false`, the map's pitch (tilt) control with "drag to rotate" interaction will be disabled.
50089 * @param {number} [options.clickTolerance=3] The max number of pixels a user can shift the mouse pointer during a click for it to be considered a valid click (as opposed to a mouse drag).
50090 * @param {boolean} [options.attributionControl=true] If `true`, an {@link AttributionControl} will be added to the map.
50091 * @param {string | Array<string>} [options.customAttribution] String or strings to show in an {@link AttributionControl}. Only applicable if `options.attributionControl` is `true`.
50092 * @param {boolean} [options.maplibreLogo=false] If `true`, the MapLibre logo will be shown.
50093 * @param {string} [options.logoPosition='bottom-left'] A string representing the position of the MapLibre wordmark on the map. Valid options are `top-left`,`top-right`, `bottom-left`, `bottom-right`.
50094 * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of MapLibre
50095 * GL JS would be dramatically worse than expected (i.e. a software renderer would be used).
50096 * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization.
50097 * @param {boolean} [options.antialias] If `true`, the gl context will be created with MSAA antialiasing, which can be useful for antialiasing custom layers. this is `false` by default as a performance optimization.
50098 * @param {boolean} [options.refreshExpiredTiles=true] If `false`, the map won't attempt to re-request tiles once they expire per their HTTP `cacheControl`/`expires` headers.
50099 * @param {LngLatBoundsLike} [options.maxBounds] If set, the map will be constrained to the given bounds.
50100 * @param {boolean|Object} [options.scrollZoom=true] If `true`, the "scroll to zoom" interaction is enabled. An `Object` value is passed as options to {@link ScrollZoomHandler#enable}.
50101 * @param {boolean} [options.boxZoom=true] If `true`, the "box zoom" interaction is enabled (see {@link BoxZoomHandler}).
50102 * @param {boolean} [options.dragRotate=true] If `true`, the "drag to rotate" interaction is enabled (see {@link DragRotateHandler}).
50103 * @param {boolean|Object} [options.dragPan=true] If `true`, the "drag to pan" interaction is enabled. An `Object` value is passed as options to {@link DragPanHandler#enable}.
50104 * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see {@link KeyboardHandler}).
50105 * @param {boolean} [options.doubleClickZoom=true] If `true`, the "double click to zoom" interaction is enabled (see {@link DoubleClickZoomHandler}).
50106 * @param {boolean|Object} [options.touchZoomRotate=true] If `true`, the "pinch to rotate and zoom" interaction is enabled. An `Object` value is passed as options to {@link TouchZoomRotateHandler#enable}.
50107 * @param {boolean|Object} [options.touchPitch=true] If `true`, the "drag to pitch" interaction is enabled. An `Object` value is passed as options to {@link TouchPitchHandler#enable}.
50108 * @param {boolean} [options.trackResize=true] If `true`, the map will automatically resize when the browser window resizes.
50109 * @param {LngLatLike} [options.center=[0, 0]] The initial geographical centerpoint of the map. If `center` is not specified in the constructor options, MapLibre GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]` Note: MapLibre GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON.
50110 * @param {number} [options.zoom=0] The initial zoom level of the map. If `zoom` is not specified in the constructor options, MapLibre GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.
50111 * @param {number} [options.bearing=0] The initial bearing (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, MapLibre GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.
50112 * @param {number} [options.pitch=0] The initial pitch (tilt) of the map, measured in degrees away from the plane of the screen (0-85). If `pitch` is not specified in the constructor options, MapLibre GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. Values greater than 60 degrees are experimental and may result in rendering issues. If you encounter any, please raise an issue with details in the MapLibre project.
50113 * @param {LngLatBoundsLike} [options.bounds] The initial bounds of the map. If `bounds` is specified, it overrides `center` and `zoom` constructor options.
50114 * @param {Object} [options.fitBoundsOptions] A {@link Map#fitBounds} options object to use _only_ when fitting the initial `bounds` provided above.
50115 * @param {boolean} [options.renderWorldCopies=true] If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`:
50116 * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire
50117 * container, there will be blank space beyond 180 and -180 degrees longitude.
50118 * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the
50119 * map and the other on the left edge of the map) at every zoom level.
50120 * @param {number} [options.maxTileCacheSize=null] The maximum number of tiles stored in the tile cache for a given source. If omitted, the cache will be dynamically sized based on the current viewport.
50121 * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS
50122 * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana' and 'Hangul Syllables' ranges.
50123 * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold).
50124 * Set to `false`, to enable font settings from the map's style for these glyph ranges.
50125 * The purpose of this option is to avoid bandwidth-intensive glyph server requests. (See [Use locally generated ideographs](https://maplibre.org/maplibre-gl-js-docs/example/local-ideographs).)
50126 * @param {RequestTransformFunction} [options.transformRequest=null] A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests.
50127 * Expected to return an object with a `url` property and optionally `headers` and `credentials` properties.
50128 * @param {boolean} [options.collectResourceTiming=false] If `true`, Resource Timing API information will be collected for requests made by GeoJSON and Vector Tile web workers (this information is normally inaccessible from the main Javascript thread). Information will be returned in a `resourceTiming` property of relevant `data` events.
50129 * @param {number} [options.fadeDuration=300] Controls the duration of the fade-in/fade-out animation for label collisions, in milliseconds. This setting affects all symbol layers. This setting does not affect the duration of runtime styling transitions or raster tile cross-fading.
50130 * @param {boolean} [options.crossSourceCollisions=true] If `true`, symbols from multiple sources can collide with each other during collision detection. If `false`, collision detection is run separately for the symbols in each source.
50131 * @param {Object} [options.locale=null] A patch to apply to the default localization table for UI strings, e.g. control tooltips. The `locale` object maps namespaced UI string IDs to translated strings in the target language; see `src/ui/default_locale.js` for an example with all supported string IDs. The object may specify all UI strings (thereby adding support for a new translation) or only a subset of strings (thereby patching the default translation table).
50132 * @param {number} [options.pixelRatio] The pixel ratio. The canvas' `width` attribute will be `container.clientWidth * pixelRatio` and its `height` attribute will be `container.clientHeight * pixelRatio`. Defaults to `devicePixelRatio` if not specified.
50133 * @example
50134 * var map = new maplibregl.Map({
50135 * container: 'map',
50136 * center: [-122.420679, 37.772537],
50137 * zoom: 13,
50138 * style: style_object,
50139 * hash: true,
50140 * transformRequest: (url, resourceType)=> {
50141 * if(resourceType === 'Source' && url.startsWith('http://myHost')) {
50142 * return {
50143 * url: url.replace('http', 'https'),
50144 * headers: { 'my-custom-header': true},
50145 * credentials: 'include' // Include cookies for cross-origin requests
50146 * }
50147 * }
50148 * }
50149 * });
50150 * @see [Display a map](https://maplibre.org/maplibre-gl-js-docs/example/simple-map/)
50151 */
50152class Map extends Camera {
50153 constructor(options) {
50154 var _a;
50155 performance.PerformanceUtils.mark(performance.PerformanceMarkers.create);
50156 options = performance.extend({}, defaultOptions$4, options);
50157 if (options.minZoom != null && options.maxZoom != null && options.minZoom > options.maxZoom) {
50158 throw new Error('maxZoom must be greater than or equal to minZoom');
50159 }
50160 if (options.minPitch != null && options.maxPitch != null && options.minPitch > options.maxPitch) {
50161 throw new Error('maxPitch must be greater than or equal to minPitch');
50162 }
50163 if (options.minPitch != null && options.minPitch < defaultMinPitch) {
50164 throw new Error(`minPitch must be greater than or equal to ${defaultMinPitch}`);
50165 }
50166 if (options.maxPitch != null && options.maxPitch > maxPitchThreshold) {
50167 throw new Error(`maxPitch must be less than or equal to ${maxPitchThreshold}`);
50168 }
50169 const transform = new Transform(options.minZoom, options.maxZoom, options.minPitch, options.maxPitch, options.renderWorldCopies);
50170 super(transform, { bearingSnap: options.bearingSnap });
50171 this._interactive = options.interactive;
50172 this._maxTileCacheSize = options.maxTileCacheSize;
50173 this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat;
50174 this._preserveDrawingBuffer = options.preserveDrawingBuffer;
50175 this._antialias = options.antialias;
50176 this._trackResize = options.trackResize;
50177 this._bearingSnap = options.bearingSnap;
50178 this._refreshExpiredTiles = options.refreshExpiredTiles;
50179 this._fadeDuration = options.fadeDuration;
50180 this._crossSourceCollisions = options.crossSourceCollisions;
50181 this._crossFadingFactor = 1;
50182 this._collectResourceTiming = options.collectResourceTiming;
50183 this._renderTaskQueue = new TaskQueue();
50184 this._controls = [];
50185 this._mapId = performance.uniqueId();
50186 this._locale = performance.extend({}, defaultLocale, options.locale);
50187 this._clickTolerance = options.clickTolerance;
50188 this._pixelRatio = (_a = options.pixelRatio) !== null && _a !== void 0 ? _a : devicePixelRatio;
50189 this._requestManager = new RequestManager(options.transformRequest);
50190 if (typeof options.container === 'string') {
50191 this._container = document.getElementById(options.container);
50192 if (!this._container) {
50193 throw new Error(`Container '${options.container}' not found.`);
50194 }
50195 }
50196 else if (options.container instanceof HTMLElement) {
50197 this._container = options.container;
50198 }
50199 else {
50200 throw new Error('Invalid type: \'container\' must be a String or HTMLElement.');
50201 }
50202 if (options.maxBounds) {
50203 this.setMaxBounds(options.maxBounds);
50204 }
50205 performance.bindAll([
50206 '_onWindowOnline',
50207 '_onWindowResize',
50208 '_onMapScroll',
50209 '_contextLost',
50210 '_contextRestored'
50211 ], this);
50212 this._setupContainer();
50213 this._setupPainter();
50214 if (this.painter === undefined) {
50215 throw new Error('Failed to initialize WebGL.');
50216 }
50217 this.on('move', () => this._update(false));
50218 this.on('moveend', () => this._update(false));
50219 this.on('zoom', () => this._update(true));
50220 if (typeof window !== 'undefined') {
50221 addEventListener('online', this._onWindowOnline, false);
50222 addEventListener('resize', this._onWindowResize, false);
50223 addEventListener('orientationchange', this._onWindowResize, false);
50224 }
50225 this.handlers = new HandlerManager(this, options);
50226 const hashName = (typeof options.hash === 'string' && options.hash) || undefined;
50227 this._hash = options.hash && (new Hash(hashName)).addTo(this);
50228 // don't set position from options if set through hash
50229 if (!this._hash || !this._hash._onHashChange()) {
50230 this.jumpTo({
50231 center: options.center,
50232 zoom: options.zoom,
50233 bearing: options.bearing,
50234 pitch: options.pitch
50235 });
50236 if (options.bounds) {
50237 this.resize();
50238 this.fitBounds(options.bounds, performance.extend({}, options.fitBoundsOptions, { duration: 0 }));
50239 }
50240 }
50241 this.resize();
50242 this._localIdeographFontFamily = options.localIdeographFontFamily;
50243 if (options.style)
50244 this.setStyle(options.style, { localIdeographFontFamily: options.localIdeographFontFamily });
50245 if (options.attributionControl)
50246 this.addControl(new AttributionControl({ customAttribution: options.customAttribution }));
50247 if (options.maplibreLogo)
50248 this.addControl(new LogoControl(), options.logoPosition);
50249 this.on('style.load', () => {
50250 if (this.transform.unmodified) {
50251 this.jumpTo(this.style.stylesheet);
50252 }
50253 });
50254 this.on('data', (event) => {
50255 this._update(event.dataType === 'style');
50256 this.fire(new performance.Event(`${event.dataType}data`, event));
50257 });
50258 this.on('dataloading', (event) => {
50259 this.fire(new performance.Event(`${event.dataType}dataloading`, event));
50260 });
50261 this.on('dataabort', (event) => {
50262 this.fire(new performance.Event('sourcedataabort', event));
50263 });
50264 }
50265 /*
50266 * Returns a unique number for this map instance which is used for the MapLoadEvent
50267 * to make sure we only fire one event per instantiated map object.
50268 * @private
50269 * @returns {number}
50270 */
50271 _getMapId() {
50272 return this._mapId;
50273 }
50274 /**
50275 * Adds an {@link IControl} to the map, calling `control.onAdd(this)`.
50276 *
50277 * @param {IControl} control The {@link IControl} to add.
50278 * @param {string} [position] position on the map to which the control will be added.
50279 * Valid values are `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. Defaults to `'top-right'`.
50280 * @returns {Map} `this`
50281 * @example
50282 * // Add zoom and rotation controls to the map.
50283 * map.addControl(new maplibregl.NavigationControl());
50284 * @see [Display map navigation controls](https://maplibre.org/maplibre-gl-js-docs/example/navigation/)
50285 */
50286 addControl(control, position) {
50287 if (position === undefined) {
50288 if (control.getDefaultPosition) {
50289 position = control.getDefaultPosition();
50290 }
50291 else {
50292 position = 'top-right';
50293 }
50294 }
50295 if (!control || !control.onAdd) {
50296 return this.fire(new performance.ErrorEvent(new Error('Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.')));
50297 }
50298 const controlElement = control.onAdd(this);
50299 this._controls.push(control);
50300 const positionContainer = this._controlPositions[position];
50301 if (position.indexOf('bottom') !== -1) {
50302 positionContainer.insertBefore(controlElement, positionContainer.firstChild);
50303 }
50304 else {
50305 positionContainer.appendChild(controlElement);
50306 }
50307 return this;
50308 }
50309 /**
50310 * Removes the control from the map.
50311 *
50312 * @param {IControl} control The {@link IControl} to remove.
50313 * @returns {Map} `this`
50314 * @example
50315 * // Define a new navigation control.
50316 * var navigation = new maplibregl.NavigationControl();
50317 * // Add zoom and rotation controls to the map.
50318 * map.addControl(navigation);
50319 * // Remove zoom and rotation controls from the map.
50320 * map.removeControl(navigation);
50321 */
50322 removeControl(control) {
50323 if (!control || !control.onRemove) {
50324 return this.fire(new performance.ErrorEvent(new Error('Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.')));
50325 }
50326 const ci = this._controls.indexOf(control);
50327 if (ci > -1)
50328 this._controls.splice(ci, 1);
50329 control.onRemove(this);
50330 return this;
50331 }
50332 /**
50333 * Checks if a control exists on the map.
50334 *
50335 * @param {IControl} control The {@link IControl} to check.
50336 * @returns {boolean} True if map contains control.
50337 * @example
50338 * // Define a new navigation control.
50339 * var navigation = new maplibregl.NavigationControl();
50340 * // Add zoom and rotation controls to the map.
50341 * map.addControl(navigation);
50342 * // Check that the navigation control exists on the map.
50343 * map.hasControl(navigation);
50344 */
50345 hasControl(control) {
50346 return this._controls.indexOf(control) > -1;
50347 }
50348 /**
50349 * Resizes the map according to the dimensions of its
50350 * `container` element.
50351 *
50352 * Checks if the map container size changed and updates the map if it has changed.
50353 * This method must be called after the map's `container` is resized programmatically
50354 * or when the map is shown after being initially hidden with CSS.
50355 *
50356 * @param eventData Additional properties to be passed to `movestart`, `move`, `resize`, and `moveend`
50357 * events that get triggered as a result of resize. This can be useful for differentiating the
50358 * source of an event (for example, user-initiated or programmatically-triggered events).
50359 * @returns {Map} `this`
50360 * @example
50361 * // Resize the map when the map container is shown
50362 * // after being initially hidden with CSS.
50363 * var mapDiv = document.getElementById('map');
50364 * if (mapDiv.style.visibility === true) map.resize();
50365 */
50366 resize(eventData) {
50367 const dimensions = this._containerDimensions();
50368 const width = dimensions[0];
50369 const height = dimensions[1];
50370 this._resizeCanvas(width, height, this.getPixelRatio());
50371 this.transform.resize(width, height);
50372 this.painter.resize(width, height, this.getPixelRatio());
50373 const fireMoving = !this._moving;
50374 if (fireMoving) {
50375 this.stop();
50376 this.fire(new performance.Event('movestart', eventData))
50377 .fire(new performance.Event('move', eventData));
50378 }
50379 this.fire(new performance.Event('resize', eventData));
50380 if (fireMoving)
50381 this.fire(new performance.Event('moveend', eventData));
50382 return this;
50383 }
50384 /**
50385 * Returns the map's pixel ratio.
50386 * @returns {number} The pixel ratio.
50387 */
50388 getPixelRatio() {
50389 return this._pixelRatio;
50390 }
50391 /**
50392 * Sets the map's pixel ratio. This allows to override `devicePixelRatio`.
50393 * After this call, the canvas' `width` attribute will be `container.clientWidth * pixelRatio`
50394 * and its height attribute will be `container.clientHeight * pixelRatio`.
50395 * @param {number} pixelRatio The pixel ratio.
50396 */
50397 setPixelRatio(pixelRatio) {
50398 const [width, height] = this._containerDimensions();
50399 this._pixelRatio = pixelRatio;
50400 this._resizeCanvas(width, height, pixelRatio);
50401 this.painter.resize(width, height, pixelRatio);
50402 }
50403 /**
50404 * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not
50405 * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region.
50406 * @returns {LngLatBounds} The geographical bounds of the map as {@link LngLatBounds}.
50407 * @example
50408 * var bounds = map.getBounds();
50409 */
50410 getBounds() {
50411 return this.transform.getBounds();
50412 }
50413 /**
50414 * Returns the maximum geographical bounds the map is constrained to, or `null` if none set.
50415 * @returns The map object.
50416 * @example
50417 * var maxBounds = map.getMaxBounds();
50418 */
50419 getMaxBounds() {
50420 return this.transform.getMaxBounds();
50421 }
50422 /**
50423 * Sets or clears the map's geographical bounds.
50424 *
50425 * Pan and zoom operations are constrained within these bounds.
50426 * If a pan or zoom is performed that would
50427 * display regions outside these bounds, the map will
50428 * instead display a position and zoom level
50429 * as close as possible to the operation's request while still
50430 * remaining within the bounds.
50431 *
50432 * @param {LngLatBoundsLike | null | undefined} bounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds.
50433 * @returns {Map} `this`
50434 * @example
50435 * // Define bounds that conform to the `LngLatBoundsLike` object.
50436 * var bounds = [
50437 * [-74.04728, 40.68392], // [west, south]
50438 * [-73.91058, 40.87764] // [east, north]
50439 * ];
50440 * // Set the map's max bounds.
50441 * map.setMaxBounds(bounds);
50442 */
50443 setMaxBounds(bounds) {
50444 this.transform.setMaxBounds(performance.LngLatBounds.convert(bounds));
50445 return this._update();
50446 }
50447 /**
50448 * Sets or clears the map's minimum zoom level.
50449 * If the map's current zoom level is lower than the new minimum,
50450 * the map will zoom to the new minimum.
50451 *
50452 * It is not always possible to zoom out and reach the set `minZoom`.
50453 * Other factors such as map height may restrict zooming. For example,
50454 * if the map is 512px tall it will not be possible to zoom below zoom 0
50455 * no matter what the `minZoom` is set to.
50456 *
50457 * @param {number | null | undefined} minZoom The minimum zoom level to set (-2 - 24).
50458 * If `null` or `undefined` is provided, the function removes the current minimum zoom (i.e. sets it to -2).
50459 * @returns {Map} `this`
50460 * @example
50461 * map.setMinZoom(12.25);
50462 */
50463 setMinZoom(minZoom) {
50464 minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom;
50465 if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) {
50466 this.transform.minZoom = minZoom;
50467 this._update();
50468 if (this.getZoom() < minZoom)
50469 this.setZoom(minZoom);
50470 return this;
50471 }
50472 else
50473 throw new Error(`minZoom must be between ${defaultMinZoom} and the current maxZoom, inclusive`);
50474 }
50475 /**
50476 * Returns the map's minimum allowable zoom level.
50477 *
50478 * @returns {number} minZoom
50479 * @example
50480 * var minZoom = map.getMinZoom();
50481 */
50482 getMinZoom() { return this.transform.minZoom; }
50483 /**
50484 * Sets or clears the map's maximum zoom level.
50485 * If the map's current zoom level is higher than the new maximum,
50486 * the map will zoom to the new maximum.
50487 *
50488 * @param {number | null | undefined} maxZoom The maximum zoom level to set.
50489 * If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 22).
50490 * @returns {Map} `this`
50491 * @example
50492 * map.setMaxZoom(18.75);
50493 */
50494 setMaxZoom(maxZoom) {
50495 maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom;
50496 if (maxZoom >= this.transform.minZoom) {
50497 this.transform.maxZoom = maxZoom;
50498 this._update();
50499 if (this.getZoom() > maxZoom)
50500 this.setZoom(maxZoom);
50501 return this;
50502 }
50503 else
50504 throw new Error('maxZoom must be greater than the current minZoom');
50505 }
50506 /**
50507 * Returns the map's maximum allowable zoom level.
50508 *
50509 * @returns {number} maxZoom
50510 * @example
50511 * var maxZoom = map.getMaxZoom();
50512 */
50513 getMaxZoom() { return this.transform.maxZoom; }
50514 /**
50515 * Sets or clears the map's minimum pitch.
50516 * If the map's current pitch is lower than the new minimum,
50517 * the map will pitch to the new minimum.
50518 *
50519 * @param {number | null | undefined} minPitch The minimum pitch to set (0-85). Values greater than 60 degrees are experimental and may result in rendering issues. If you encounter any, please raise an issue with details in the MapLibre project.
50520 * If `null` or `undefined` is provided, the function removes the current minimum pitch (i.e. sets it to 0).
50521 * @returns {Map} `this`
50522 */
50523 setMinPitch(minPitch) {
50524 minPitch = minPitch === null || minPitch === undefined ? defaultMinPitch : minPitch;
50525 if (minPitch < defaultMinPitch) {
50526 throw new Error(`minPitch must be greater than or equal to ${defaultMinPitch}`);
50527 }
50528 if (minPitch >= defaultMinPitch && minPitch <= this.transform.maxPitch) {
50529 this.transform.minPitch = minPitch;
50530 this._update();
50531 if (this.getPitch() < minPitch)
50532 this.setPitch(minPitch);
50533 return this;
50534 }
50535 else
50536 throw new Error(`minPitch must be between ${defaultMinPitch} and the current maxPitch, inclusive`);
50537 }
50538 /**
50539 * Returns the map's minimum allowable pitch.
50540 *
50541 * @returns {number} minPitch
50542 */
50543 getMinPitch() { return this.transform.minPitch; }
50544 /**
50545 * Sets or clears the map's maximum pitch.
50546 * If the map's current pitch is higher than the new maximum,
50547 * the map will pitch to the new maximum.
50548 *
50549 * @param {number | null | undefined} maxPitch The maximum pitch to set (0-85). Values greater than 60 degrees are experimental and may result in rendering issues. If you encounter any, please raise an issue with details in the MapLibre project.
50550 * If `null` or `undefined` is provided, the function removes the current maximum pitch (sets it to 60).
50551 * @returns {Map} `this`
50552 */
50553 setMaxPitch(maxPitch) {
50554 maxPitch = maxPitch === null || maxPitch === undefined ? defaultMaxPitch : maxPitch;
50555 if (maxPitch > maxPitchThreshold) {
50556 throw new Error(`maxPitch must be less than or equal to ${maxPitchThreshold}`);
50557 }
50558 if (maxPitch >= this.transform.minPitch) {
50559 this.transform.maxPitch = maxPitch;
50560 this._update();
50561 if (this.getPitch() > maxPitch)
50562 this.setPitch(maxPitch);
50563 return this;
50564 }
50565 else
50566 throw new Error('maxPitch must be greater than the current minPitch');
50567 }
50568 /**
50569 * Returns the map's maximum allowable pitch.
50570 *
50571 * @returns {number} maxPitch
50572 */
50573 getMaxPitch() { return this.transform.maxPitch; }
50574 /**
50575 * Returns the state of `renderWorldCopies`. If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`:
50576 * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire
50577 * container, there will be blank space beyond 180 and -180 degrees longitude.
50578 * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the
50579 * map and the other on the left edge of the map) at every zoom level.
50580 * @returns {boolean} renderWorldCopies
50581 * @example
50582 * var worldCopiesRendered = map.getRenderWorldCopies();
50583 * @see [Render world copies](https://maplibre.org/maplibre-gl-js-docs/example/render-world-copies/)
50584 */
50585 getRenderWorldCopies() { return this.transform.renderWorldCopies; }
50586 /**
50587 * Sets the state of `renderWorldCopies`.
50588 *
50589 * @param {boolean} renderWorldCopies If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`:
50590 * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire
50591 * container, there will be blank space beyond 180 and -180 degrees longitude.
50592 * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the
50593 * map and the other on the left edge of the map) at every zoom level.
50594 *
50595 * `undefined` is treated as `true`, `null` is treated as `false`.
50596 * @returns {Map} `this`
50597 * @example
50598 * map.setRenderWorldCopies(true);
50599 * @see [Render world copies](https://maplibre.org/maplibre-gl-js-docs/example/render-world-copies/)
50600 */
50601 setRenderWorldCopies(renderWorldCopies) {
50602 this.transform.renderWorldCopies = renderWorldCopies;
50603 return this._update();
50604 }
50605 /**
50606 * Returns a [Point](https://github.com/mapbox/point-geometry) representing pixel coordinates, relative to the map's `container`,
50607 * that correspond to the specified geographical location.
50608 *
50609 * @param {LngLatLike} lnglat The geographical location to project.
50610 * @returns {Point} The [Point](https://github.com/mapbox/point-geometry) corresponding to `lnglat`, relative to the map's `container`.
50611 * @example
50612 * var coordinate = [-122.420679, 37.772537];
50613 * var point = map.project(coordinate);
50614 */
50615 project(lnglat) {
50616 return this.transform.locationPoint(performance.LngLat.convert(lnglat));
50617 }
50618 /**
50619 * Returns a {@link LngLat} representing geographical coordinates that correspond
50620 * to the specified pixel coordinates.
50621 *
50622 * @param {PointLike} point The pixel coordinates to unproject.
50623 * @returns {LngLat} The {@link LngLat} corresponding to `point`.
50624 * @example
50625 * map.on('click', function(e) {
50626 * // When the map is clicked, get the geographic coordinate.
50627 * var coordinate = map.unproject(e.point);
50628 * });
50629 */
50630 unproject(point) {
50631 return this.transform.pointLocation(performance.pointGeometry.convert(point));
50632 }
50633 /**
50634 * Returns true if the map is panning, zooming, rotating, or pitching due to a camera animation or user gesture.
50635 * @returns {boolean} True if the map is moving.
50636 * @example
50637 * var isMoving = map.isMoving();
50638 */
50639 isMoving() {
50640 return this._moving || this.handlers.isMoving();
50641 }
50642 /**
50643 * Returns true if the map is zooming due to a camera animation or user gesture.
50644 * @returns {boolean} True if the map is zooming.
50645 * @example
50646 * var isZooming = map.isZooming();
50647 */
50648 isZooming() {
50649 return this._zooming || this.handlers.isZooming();
50650 }
50651 /**
50652 * Returns true if the map is rotating due to a camera animation or user gesture.
50653 * @returns {boolean} True if the map is rotating.
50654 * @example
50655 * map.isRotating();
50656 */
50657 isRotating() {
50658 return this._rotating || this.handlers.isRotating();
50659 }
50660 _createDelegatedListener(type, layerId, listener) {
50661 if (type === 'mouseenter' || type === 'mouseover') {
50662 let mousein = false;
50663 const mousemove = (e) => {
50664 const features = this.getLayer(layerId) ? this.queryRenderedFeatures(e.point, { layers: [layerId] }) : [];
50665 if (!features.length) {
50666 mousein = false;
50667 }
50668 else if (!mousein) {
50669 mousein = true;
50670 listener.call(this, new MapMouseEvent(type, this, e.originalEvent, { features }));
50671 }
50672 };
50673 const mouseout = () => {
50674 mousein = false;
50675 };
50676 return { layer: layerId, listener, delegates: { mousemove, mouseout } };
50677 }
50678 else if (type === 'mouseleave' || type === 'mouseout') {
50679 let mousein = false;
50680 const mousemove = (e) => {
50681 const features = this.getLayer(layerId) ? this.queryRenderedFeatures(e.point, { layers: [layerId] }) : [];
50682 if (features.length) {
50683 mousein = true;
50684 }
50685 else if (mousein) {
50686 mousein = false;
50687 listener.call(this, new MapMouseEvent(type, this, e.originalEvent));
50688 }
50689 };
50690 const mouseout = (e) => {
50691 if (mousein) {
50692 mousein = false;
50693 listener.call(this, new MapMouseEvent(type, this, e.originalEvent));
50694 }
50695 };
50696 return { layer: layerId, listener, delegates: { mousemove, mouseout } };
50697 }
50698 else {
50699 const delegate = (e) => {
50700 const features = this.getLayer(layerId) ? this.queryRenderedFeatures(e.point, { layers: [layerId] }) : [];
50701 if (features.length) {
50702 // Here we need to mutate the original event, so that preventDefault works as expected.
50703 e.features = features;
50704 listener.call(this, e);
50705 delete e.features;
50706 }
50707 };
50708 return { layer: layerId, listener, delegates: { [type]: delegate } };
50709 }
50710 }
50711 on(type, layerIdOrListener, listener) {
50712 if (listener === undefined) {
50713 return super.on(type, layerIdOrListener);
50714 }
50715 const delegatedListener = this._createDelegatedListener(type, layerIdOrListener, listener);
50716 this._delegatedListeners = this._delegatedListeners || {};
50717 this._delegatedListeners[type] = this._delegatedListeners[type] || [];
50718 this._delegatedListeners[type].push(delegatedListener);
50719 for (const event in delegatedListener.delegates) {
50720 this.on(event, delegatedListener.delegates[event]);
50721 }
50722 return this;
50723 }
50724 once(type, layerIdOrListener, listener) {
50725 if (listener === undefined) {
50726 return super.once(type, layerIdOrListener);
50727 }
50728 const delegatedListener = this._createDelegatedListener(type, layerIdOrListener, listener);
50729 for (const event in delegatedListener.delegates) {
50730 this.once(event, delegatedListener.delegates[event]);
50731 }
50732 return this;
50733 }
50734 off(type, layerIdOrListener, listener) {
50735 if (listener === undefined) {
50736 return super.off(type, layerIdOrListener);
50737 }
50738 const removeDelegatedListener = (delegatedListeners) => {
50739 const listeners = delegatedListeners[type];
50740 for (let i = 0; i < listeners.length; i++) {
50741 const delegatedListener = listeners[i];
50742 if (delegatedListener.layer === layerIdOrListener && delegatedListener.listener === listener) {
50743 for (const event in delegatedListener.delegates) {
50744 this.off(event, delegatedListener.delegates[event]);
50745 }
50746 listeners.splice(i, 1);
50747 return this;
50748 }
50749 }
50750 };
50751 if (this._delegatedListeners && this._delegatedListeners[type]) {
50752 removeDelegatedListener(this._delegatedListeners);
50753 }
50754 return this;
50755 }
50756 /**
50757 * Returns an array of MapGeoJSONFeature objects
50758 * representing visible features that satisfy the query parameters.
50759 *
50760 * @param {PointLike|Array<PointLike>} [geometry] - The geometry of the query region:
50761 * either a single point or southwest and northeast points describing a bounding box.
50762 * Omitting this parameter (i.e. calling {@link Map#queryRenderedFeatures} with zero arguments,
50763 * or with only a `options` argument) is equivalent to passing a bounding box encompassing the entire
50764 * map viewport.
50765 * @param {Object} [options] Options object.
50766 * @param {Array<string>} [options.layers] An array of [style layer IDs](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layer-id) for the query to inspect.
50767 * Only features within these layers will be returned. If this parameter is undefined, all layers will be checked.
50768 * @param {Array} [options.filter] A [filter](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#filter)
50769 * to limit query results.
50770 * @param {boolean} [options.validate=true] Whether to check if the [options.filter] conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
50771 *
50772 * @returns {Array<MapGeoJSONFeature>} An array of MapGeoJSONFeature objects.
50773 *
50774 * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only
50775 * string and numeric property values are supported (i.e. `null`, `Array`, and `Object` values are not supported).
50776 *
50777 * Each feature includes top-level `layer`, `source`, and `sourceLayer` properties. The `layer` property is an object
50778 * representing the style layer to which the feature belongs. Layout and paint properties in this object contain values
50779 * which are fully evaluated for the given zoom level and feature.
50780 *
50781 * Only features that are currently rendered are included. Some features will **not** be included, like:
50782 *
50783 * - Features from layers whose `visibility` property is `"none"`.
50784 * - Features from layers whose zoom range excludes the current zoom level.
50785 * - Symbol features that have been hidden due to text or icon collision.
50786 *
50787 * Features from all other layers are included, including features that may have no visible
50788 * contribution to the rendered result; for example, because the layer's opacity or color alpha component is set to
50789 * 0.
50790 *
50791 * The topmost rendered feature appears first in the returned array, and subsequent features are sorted by
50792 * descending z-order. Features that are rendered multiple times (due to wrapping across the antimeridian at low
50793 * zoom levels) are returned only once (though subject to the following caveat).
50794 *
50795 * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature
50796 * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple
50797 * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query.
50798 * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding
50799 * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile
50800 * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple
50801 * tiles due to tile buffering.
50802 *
50803 * @example
50804 * // Find all features at a point
50805 * var features = map.queryRenderedFeatures(
50806 * [20, 35],
50807 * { layers: ['my-layer-name'] }
50808 * );
50809 *
50810 * @example
50811 * // Find all features within a static bounding box
50812 * var features = map.queryRenderedFeatures(
50813 * [[10, 20], [30, 50]],
50814 * { layers: ['my-layer-name'] }
50815 * );
50816 *
50817 * @example
50818 * // Find all features within a bounding box around a point
50819 * var width = 10;
50820 * var height = 20;
50821 * var features = map.queryRenderedFeatures([
50822 * [point.x - width / 2, point.y - height / 2],
50823 * [point.x + width / 2, point.y + height / 2]
50824 * ], { layers: ['my-layer-name'] });
50825 *
50826 * @example
50827 * // Query all rendered features from a single layer
50828 * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] });
50829 * @see [Get features under the mouse pointer](https://maplibre.org/maplibre-gl-js-docs/example/queryrenderedfeatures/)
50830 */
50831 queryRenderedFeatures(geometry, options) {
50832 // The first parameter can be omitted entirely, making this effectively an overloaded method
50833 // with two signatures:
50834 //
50835 // queryRenderedFeatures(geometry: PointLike | [PointLike, PointLike], options?: Object)
50836 // queryRenderedFeatures(options?: Object)
50837 //
50838 // There no way to express that in a way that's compatible with both flow and documentation.js.
50839 // Related: https://github.com/facebook/flow/issues/1556
50840 if (!this.style) {
50841 return [];
50842 }
50843 if (options === undefined && geometry !== undefined && !(geometry instanceof performance.pointGeometry) && !Array.isArray(geometry)) {
50844 options = geometry;
50845 geometry = undefined;
50846 }
50847 options = options || {};
50848 geometry = geometry || [[0, 0], [this.transform.width, this.transform.height]];
50849 let queryGeometry;
50850 if (geometry instanceof performance.pointGeometry || typeof geometry[0] === 'number') {
50851 queryGeometry = [performance.pointGeometry.convert(geometry)];
50852 }
50853 else {
50854 const tl = performance.pointGeometry.convert(geometry[0]);
50855 const br = performance.pointGeometry.convert(geometry[1]);
50856 queryGeometry = [tl, new performance.pointGeometry(br.x, tl.y), br, new performance.pointGeometry(tl.x, br.y), tl];
50857 }
50858 return this.style.queryRenderedFeatures(queryGeometry, options, this.transform);
50859 }
50860 /**
50861 * Returns an array of MapGeoJSONFeature objects
50862 * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters.
50863 *
50864 * @param {string} sourceId The ID of the vector tile or GeoJSON source to query.
50865 * @param {Object} [parameters] Options object.
50866 * @param {string} [parameters.sourceLayer] The name of the source layer
50867 * to query. *For vector tile sources, this parameter is required.* For GeoJSON sources, it is ignored.
50868 * @param {Array} [parameters.filter] A [filter](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#filter)
50869 * to limit query results.
50870 * @param {boolean} [parameters.validate=true] Whether to check if the [parameters.filter] conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
50871 *
50872 * @returns {Array<MapGeoJSONFeature>} An array of MapGeoJSONFeature objects.
50873 *
50874 * In contrast to {@link Map#queryRenderedFeatures}, this function returns all features matching the query parameters,
50875 * whether or not they are rendered by the current style (i.e. visible). The domain of the query includes all currently-loaded
50876 * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently
50877 * visible viewport.
50878 *
50879 * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature
50880 * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple
50881 * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query.
50882 * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding
50883 * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile
50884 * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple
50885 * tiles due to tile buffering.
50886 *
50887 * @example
50888 * // Find all features in one source layer in a vector source
50889 * var features = map.querySourceFeatures('your-source-id', {
50890 * sourceLayer: 'your-source-layer'
50891 * });
50892 *
50893 */
50894 querySourceFeatures(sourceId, parameters) {
50895 return this.style.querySourceFeatures(sourceId, parameters);
50896 }
50897 /**
50898 * Updates the map's MapLibre style object with a new value.
50899 *
50900 * If a style is already set when this is used and options.diff is set to true, the map renderer will attempt to compare the given style
50901 * against the map's current state and perform only the changes necessary to make the map style match the desired state. Changes in sprites
50902 * (images used for icons and patterns) and glyphs (fonts for label text) **cannot** be diffed. If the sprites or fonts used in the current
50903 * style and the given style are different in any way, the map renderer will force a full update, removing the current style and building
50904 * the given one from scratch.
50905 *
50906 *
50907 * @param style A JSON object conforming to the schema described in the
50908 * [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/), or a URL to such JSON.
50909 * @param {Object} [options] Options object.
50910 * @param {boolean} [options.diff=true] If false, force a 'full' update, removing the current style
50911 * and building the given one instead of attempting a diff-based update.
50912 * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS
50913 * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana' and 'Hangul Syllables' ranges.
50914 * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold).
50915 * Set to `false`, to enable font settings from the map's style for these glyph ranges.
50916 * Forces a full update.
50917 * @returns {Map} `this`
50918 *
50919 * @example
50920 * map.setStyle("https://demotiles.maplibre.org/style.json");
50921 *
50922 */
50923 setStyle(style, options) {
50924 options = performance.extend({}, { localIdeographFontFamily: this._localIdeographFontFamily }, options);
50925 if ((options.diff !== false && options.localIdeographFontFamily === this._localIdeographFontFamily) && this.style && style) {
50926 this._diffStyle(style, options);
50927 return this;
50928 }
50929 else {
50930 this._localIdeographFontFamily = options.localIdeographFontFamily;
50931 return this._updateStyle(style, options);
50932 }
50933 }
50934 /**
50935 * Updates the requestManager's transform request with a new function
50936 *
50937 * @param transformRequest A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests.
50938 * Expected to return an object with a `url` property and optionally `headers` and `credentials` properties
50939 *
50940 * @returns {Map} `this`
50941 *
50942 * @example
50943 * map.setTransformRequest((url: string, resourceType: string) => {});
50944 */
50945 setTransformRequest(transformRequest) {
50946 this._requestManager.setTransformRequest(transformRequest);
50947 return this;
50948 }
50949 _getUIString(key) {
50950 const str = this._locale[key];
50951 if (str == null) {
50952 throw new Error(`Missing UI string '${key}'`);
50953 }
50954 return str;
50955 }
50956 _updateStyle(style, options) {
50957 if (this.style) {
50958 this.style.setEventedParent(null);
50959 this.style._remove();
50960 }
50961 if (!style) {
50962 delete this.style;
50963 return this;
50964 }
50965 else {
50966 this.style = new Style(this, options || {});
50967 }
50968 this.style.setEventedParent(this, { style: this.style });
50969 if (typeof style === 'string') {
50970 this.style.loadURL(style);
50971 }
50972 else {
50973 this.style.loadJSON(style);
50974 }
50975 return this;
50976 }
50977 _lazyInitEmptyStyle() {
50978 if (!this.style) {
50979 this.style = new Style(this, {});
50980 this.style.setEventedParent(this, { style: this.style });
50981 this.style.loadEmpty();
50982 }
50983 }
50984 _diffStyle(style, options) {
50985 if (typeof style === 'string') {
50986 const url = style;
50987 const request = this._requestManager.transformRequest(url, performance.ResourceType.Style);
50988 performance.getJSON(request, (error, json) => {
50989 if (error) {
50990 this.fire(new performance.ErrorEvent(error));
50991 }
50992 else if (json) {
50993 this._updateDiff(json, options);
50994 }
50995 });
50996 }
50997 else if (typeof style === 'object') {
50998 this._updateDiff(style, options);
50999 }
51000 }
51001 _updateDiff(style, options) {
51002 try {
51003 if (this.style.setState(style)) {
51004 this._update(true);
51005 }
51006 }
51007 catch (e) {
51008 performance.warnOnce(`Unable to perform style diff: ${e.message || e.error || e}. Rebuilding the style from scratch.`);
51009 this._updateStyle(style, options);
51010 }
51011 }
51012 /**
51013 * Returns the map's MapLibre style object, a JSON object which can be used to recreate the map's style.
51014 *
51015 * @returns {Object} The map's style JSON object.
51016 *
51017 * @example
51018 * var styleJson = map.getStyle();
51019 *
51020 */
51021 getStyle() {
51022 if (this.style) {
51023 return this.style.serialize();
51024 }
51025 }
51026 /**
51027 * Returns a Boolean indicating whether the map's style is fully loaded.
51028 *
51029 * @returns {boolean} A Boolean indicating whether the style is fully loaded.
51030 *
51031 * @example
51032 * var styleLoadStatus = map.isStyleLoaded();
51033 */
51034 isStyleLoaded() {
51035 if (!this.style)
51036 return performance.warnOnce('There is no style added to the map.');
51037 return this.style.loaded();
51038 }
51039 /**
51040 * Adds a source to the map's style.
51041 *
51042 * @param {string} id The ID of the source to add. Must not conflict with existing sources.
51043 * @param {Object} source The source object, conforming to the
51044 * MapLibre Style Specification's [source definition](https://maplibre.org/maplibre-gl-js-docs/style-spec/#sources) or
51045 * {@link CanvasSourceOptions}.
51046 * @fires source.add
51047 * @returns {Map} `this`
51048 * @example
51049 * map.addSource('my-data', {
51050 * type: 'vector',
51051 * url: 'https://demotiles.maplibre.org/tiles/tiles.json'
51052 * });
51053 * @example
51054 * map.addSource('my-data', {
51055 * "type": "geojson",
51056 * "data": {
51057 * "type": "Feature",
51058 * "geometry": {
51059 * "type": "Point",
51060 * "coordinates": [-77.0323, 38.9131]
51061 * },
51062 * "properties": {
51063 * "title": "Mapbox DC",
51064 * "marker-symbol": "monument"
51065 * }
51066 * }
51067 * });
51068 * @see GeoJSON source: [Add live realtime data](https://maplibre.org/maplibre-gl-js-docs/example/live-geojson/)
51069 */
51070 addSource(id, source) {
51071 this._lazyInitEmptyStyle();
51072 this.style.addSource(id, source);
51073 return this._update(true);
51074 }
51075 /**
51076 * Returns a Boolean indicating whether the source is loaded. Returns `true` if the source with
51077 * the given ID in the map's style has no outstanding network requests, otherwise `false`.
51078 *
51079 * @param {string} id The ID of the source to be checked.
51080 * @returns {boolean} A Boolean indicating whether the source is loaded.
51081 * @example
51082 * var sourceLoaded = map.isSourceLoaded('bathymetry-data');
51083 */
51084 isSourceLoaded(id) {
51085 const source = this.style && this.style.sourceCaches[id];
51086 if (source === undefined) {
51087 this.fire(new performance.ErrorEvent(new Error(`There is no source with ID '${id}'`)));
51088 return;
51089 }
51090 return source.loaded();
51091 }
51092 /**
51093 * Returns a Boolean indicating whether all tiles in the viewport from all sources on
51094 * the style are loaded.
51095 *
51096 * @returns {boolean} A Boolean indicating whether all tiles are loaded.
51097 * @example
51098 * var tilesLoaded = map.areTilesLoaded();
51099 */
51100 areTilesLoaded() {
51101 const sources = this.style && this.style.sourceCaches;
51102 for (const id in sources) {
51103 const source = sources[id];
51104 const tiles = source._tiles;
51105 for (const t in tiles) {
51106 const tile = tiles[t];
51107 if (!(tile.state === 'loaded' || tile.state === 'errored'))
51108 return false;
51109 }
51110 }
51111 return true;
51112 }
51113 /**
51114 * Adds a [custom source type](#Custom Sources), making it available for use with
51115 * {@link Map#addSource}.
51116 * @private
51117 * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field.
51118 * @param {Function} SourceType A {@link Source} constructor.
51119 * @param {Callback<void>} callback Called when the source type is ready or with an error argument if there is an error.
51120 */
51121 addSourceType(name, SourceType, callback) {
51122 this._lazyInitEmptyStyle();
51123 return this.style.addSourceType(name, SourceType, callback);
51124 }
51125 /**
51126 * Removes a source from the map's style.
51127 *
51128 * @param {string} id The ID of the source to remove.
51129 * @returns {Map} `this`
51130 * @example
51131 * map.removeSource('bathymetry-data');
51132 */
51133 removeSource(id) {
51134 this.style.removeSource(id);
51135 return this._update(true);
51136 }
51137 /**
51138 * Returns the source with the specified ID in the map's style.
51139 *
51140 * This method is often used to update a source using the instance members for the relevant
51141 * source type as defined in [Sources](#sources).
51142 * For example, setting the `data` for a GeoJSON source or updating the `url` and `coordinates`
51143 * of an image source.
51144 *
51145 * @param {string} id The ID of the source to get.
51146 * @returns {Source | undefined} The style source with the specified ID or `undefined` if the ID
51147 * corresponds to no existing sources.
51148 * The shape of the object varies by source type.
51149 * A list of options for each source type is available on the MapLibre Style Specification's
51150 * [Sources](https://maplibre.org/maplibre-gl-js-docs/style-spec/sources/) page.
51151 * @example
51152 * var sourceObject = map.getSource('points');
51153 * @see [Create a draggable point](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-point/)
51154 * @see [Animate a point](https://maplibre.org/maplibre-gl-js-docs/example/animate-point-along-line/)
51155 * @see [Add live realtime data](https://maplibre.org/maplibre-gl-js-docs/example/live-geojson/)
51156 */
51157 getSource(id) {
51158 return this.style.getSource(id);
51159 }
51160 // eslint-disable-next-line jsdoc/require-returns
51161 /**
51162 * Add an image to the style. This image can be displayed on the map like any other icon in the style's
51163 * sprite using the image's ID with
51164 * [`icon-image`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layout-symbol-icon-image),
51165 * [`background-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-background-background-pattern),
51166 * [`fill-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-fill-fill-pattern),
51167 * or [`line-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-line-line-pattern).
51168 * A {@link Map.event:error} event will be fired if there is not enough space in the sprite to add this image.
51169 *
51170 * @param id The ID of the image.
51171 * @param image The image as an `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data`
51172 * properties with the same format as `ImageData`.
51173 * @param options Options object.
51174 * @param options.pixelRatio The ratio of pixels in the image to physical pixels on the screen
51175 * @param options.sdf Whether the image should be interpreted as an SDF image
51176 * @param options.content `[x1, y1, x2, y2]` If `icon-text-fit` is used in a layer with this image, this option defines the part of the image that can be covered by the content in `text-field`.
51177 * @param options.stretchX `[[x1, x2], ...]` If `icon-text-fit` is used in a layer with this image, this option defines the part(s) of the image that can be stretched horizontally.
51178 * @param options.stretchY `[[y1, y2], ...]` If `icon-text-fit` is used in a layer with this image, this option defines the part(s) of the image that can be stretched vertically.
51179 *
51180 * @example
51181 * // If the style's sprite does not already contain an image with ID 'cat',
51182 * // add the image 'cat-icon.png' to the style's sprite with the ID 'cat'.
51183 * map.loadImage('https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Cat_silhouette.svg/400px-Cat_silhouette.svg.png', function(error, image) {
51184 * if (error) throw error;
51185 * if (!map.hasImage('cat')) map.addImage('cat', image);
51186 * });
51187 *
51188 *
51189 * // Add a stretchable image that can be used with `icon-text-fit`
51190 * // In this example, the image is 600px wide by 400px high.
51191 * map.loadImage('https://upload.wikimedia.org/wikipedia/commons/8/89/Black_and_White_Boxed_%28bordered%29.png', function(error, image) {
51192 * if (error) throw error;
51193 * if (!map.hasImage('border-image')) {
51194 * map.addImage('border-image', image, {
51195 * content: [16, 16, 300, 384], // place text over left half of image, avoiding the 16px border
51196 * stretchX: [[16, 584]], // stretch everything horizontally except the 16px border
51197 * stretchY: [[16, 384]], // stretch everything vertically except the 16px border
51198 * });
51199 * }
51200 * });
51201 *
51202 *
51203 * @see Use `HTMLImageElement`: [Add an icon to the map](https://maplibre.org/maplibre-gl-js-docs/example/add-image/)
51204 * @see Use `ImageData`: [Add a generated icon to the map](https://maplibre.org/maplibre-gl-js-docs/example/add-image-generated/)
51205 */
51206 addImage(id, image, { pixelRatio = 1, sdf = false, stretchX, stretchY, content } = {}) {
51207 this._lazyInitEmptyStyle();
51208 const version = 0;
51209 if (image instanceof HTMLImageElement || performance.isImageBitmap(image)) {
51210 const { width, height, data } = performance.exported.getImageData(image);
51211 this.style.addImage(id, { data: new performance.RGBAImage({ width, height }, data), pixelRatio, stretchX, stretchY, content, sdf, version });
51212 }
51213 else if (image.width === undefined || image.height === undefined) {
51214 return this.fire(new performance.ErrorEvent(new Error('Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, ' +
51215 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`')));
51216 }
51217 else {
51218 const { width, height, data } = image;
51219 const userImage = image;
51220 this.style.addImage(id, {
51221 data: new performance.RGBAImage({ width, height }, new Uint8Array(data)),
51222 pixelRatio,
51223 stretchX,
51224 stretchY,
51225 content,
51226 sdf,
51227 version,
51228 userImage
51229 });
51230 if (userImage.onAdd) {
51231 userImage.onAdd(this, id);
51232 }
51233 }
51234 }
51235 // eslint-disable-next-line jsdoc/require-returns
51236 /**
51237 * Update an existing image in a style. This image can be displayed on the map like any other icon in the style's
51238 * sprite using the image's ID with
51239 * [`icon-image`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layout-symbol-icon-image),
51240 * [`background-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-background-background-pattern),
51241 * [`fill-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-fill-fill-pattern),
51242 * or [`line-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-line-line-pattern).
51243 *
51244 * @param id The ID of the image.
51245 * @param image The image as an `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data`
51246 * properties with the same format as `ImageData`.
51247 *
51248 * @example
51249 * // If an image with the ID 'cat' already exists in the style's sprite,
51250 * // replace that image with a new image, 'other-cat-icon.png'.
51251 * if (map.hasImage('cat')) map.updateImage('cat', './other-cat-icon.png');
51252 */
51253 updateImage(id, image) {
51254 const existingImage = this.style.getImage(id);
51255 if (!existingImage) {
51256 return this.fire(new performance.ErrorEvent(new Error('The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.')));
51257 }
51258 const imageData = (image instanceof HTMLImageElement || performance.isImageBitmap(image)) ?
51259 performance.exported.getImageData(image) :
51260 image;
51261 const { width, height, data } = imageData;
51262 if (width === undefined || height === undefined) {
51263 return this.fire(new performance.ErrorEvent(new Error('Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, ' +
51264 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`')));
51265 }
51266 if (width !== existingImage.data.width || height !== existingImage.data.height) {
51267 return this.fire(new performance.ErrorEvent(new Error('The width and height of the updated image must be that same as the previous version of the image')));
51268 }
51269 const copy = !(image instanceof HTMLImageElement || performance.isImageBitmap(image));
51270 existingImage.data.replace(data, copy);
51271 this.style.updateImage(id, existingImage);
51272 }
51273 /**
51274 * Check whether or not an image with a specific ID exists in the style. This checks both images
51275 * in the style's original sprite and any images
51276 * that have been added at runtime using {@link Map#addImage}.
51277 *
51278 * @param id The ID of the image.
51279 *
51280 * @returns {boolean} A Boolean indicating whether the image exists.
51281 * @example
51282 * // Check if an image with the ID 'cat' exists in
51283 * // the style's sprite.
51284 * var catIconExists = map.hasImage('cat');
51285 */
51286 hasImage(id) {
51287 if (!id) {
51288 this.fire(new performance.ErrorEvent(new Error('Missing required image id')));
51289 return false;
51290 }
51291 return !!this.style.getImage(id);
51292 }
51293 /**
51294 * Remove an image from a style. This can be an image from the style's original
51295 * sprite or any images
51296 * that have been added at runtime using {@link Map#addImage}.
51297 *
51298 * @param id The ID of the image.
51299 *
51300 * @example
51301 * // If an image with the ID 'cat' exists in
51302 * // the style's sprite, remove it.
51303 * if (map.hasImage('cat')) map.removeImage('cat');
51304 */
51305 removeImage(id) {
51306 this.style.removeImage(id);
51307 }
51308 /**
51309 * Load an image from an external URL to be used with {@link Map#addImage}. External
51310 * domains must support [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS).
51311 *
51312 * @param {string} url The URL of the image file. Image file must be in png, webp, or jpg format.
51313 * @param {Callback<HTMLImageElement | ImageBitmap>} callback Expecting `callback(error, data)`. Called when the image has loaded or with an error argument if there is an error.
51314 *
51315 * @example
51316 * // Load an image from an external URL.
51317 * map.loadImage('http://placekitten.com/50/50', function(error, image) {
51318 * if (error) throw error;
51319 * // Add the loaded image to the style's sprite with the ID 'kitten'.
51320 * map.addImage('kitten', image);
51321 * });
51322 *
51323 * @see [Add an icon to the map](https://maplibre.org/maplibre-gl-js-docs/example/add-image/)
51324 */
51325 loadImage(url, callback) {
51326 performance.getImage(this._requestManager.transformRequest(url, performance.ResourceType.Image), callback);
51327 }
51328 /**
51329 * Returns an Array of strings containing the IDs of all images currently available in the map.
51330 * This includes both images from the style's original sprite
51331 * and any images that have been added at runtime using {@link Map#addImage}.
51332 *
51333 * @returns {Array<string>} An Array of strings containing the names of all sprites/images currently available in the map.
51334 *
51335 * @example
51336 * var allImages = map.listImages();
51337 *
51338 */
51339 listImages() {
51340 return this.style.listImages();
51341 }
51342 /**
51343 * Adds a [MapLibre style layer](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layers)
51344 * to the map's style.
51345 *
51346 * A layer defines how data from a specified source will be styled. Read more about layer types
51347 * and available paint and layout properties in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layers).
51348 *
51349 * @param {Object | CustomLayerInterface} layer The layer to add, conforming to either the MapLibre Style Specification's [layer definition](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layers) or, less commonly, the {@link CustomLayerInterface} specification.
51350 * The MapLibre Style Specification's layer definition is appropriate for most layers.
51351 *
51352 * @param {string} layer.id A unique identifer that you define.
51353 * @param {string} layer.type The type of layer (for example `fill` or `symbol`).
51354 * A list of layer types is available in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#type).
51355 *
51356 * (This can also be `custom`. For more information, see {@link CustomLayerInterface}.)
51357 * @param {string | Object} [layer.source] The data source for the layer.
51358 * Reference a source that has _already been defined_ using the source's unique id.
51359 * Reference a _new source_ using a source object (as defined in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/sources/)) directly.
51360 * This is **required** for all `layer.type` options _except_ for `custom`.
51361 * @param {string} [layer.sourceLayer] (optional) The name of the source layer within the specified `layer.source` to use for this style layer.
51362 * This is only applicable for vector tile sources and is **required** when `layer.source` is of the type `vector`.
51363 * @param {array} [layer.filter] (optional) An expression specifying conditions on source features.
51364 * Only features that match the filter are displayed.
51365 * The MapLibre Style Specification includes more information on the limitations of the [`filter`](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#filter) parameter
51366 * and a complete list of available [expressions](https://maplibre.org/maplibre-gl-js-docs/style-spec/expressions/).
51367 * If no filter is provided, all features in the source (or source layer for vector tilesets) will be displayed.
51368 * @param {Object} [layer.paint] (optional) Paint properties for the layer.
51369 * Available paint properties vary by `layer.type`.
51370 * A full list of paint properties for each layer type is available in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/).
51371 * If no paint properties are specified, default values will be used.
51372 * @param {Object} [layer.layout] (optional) Layout properties for the layer.
51373 * Available layout properties vary by `layer.type`.
51374 * A full list of layout properties for each layer type is available in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/).
51375 * If no layout properties are specified, default values will be used.
51376 * @param {number} [layer.maxzoom] (optional) The maximum zoom level for the layer.
51377 * At zoom levels equal to or greater than the maxzoom, the layer will be hidden.
51378 * The value can be any number between `0` and `24` (inclusive).
51379 * If no maxzoom is provided, the layer will be visible at all zoom levels for which there are tiles available.
51380 * @param {number} [layer.minzoom] (optional) The minimum zoom level for the layer.
51381 * At zoom levels less than the minzoom, the layer will be hidden.
51382 * The value can be any number between `0` and `24` (inclusive).
51383 * If no minzoom is provided, the layer will be visible at all zoom levels for which there are tiles available.
51384 * @param {Object} [layer.metadata] (optional) Arbitrary properties useful to track with the layer, but do not influence rendering.
51385 * @param {string} [layer.renderingMode] This is only applicable for layers with the type `custom`.
51386 * See {@link CustomLayerInterface} for more information.
51387 * @param {string} [beforeId] The ID of an existing layer to insert the new layer before,
51388 * resulting in the new layer appearing visually beneath the existing layer.
51389 * If this argument is not specified, the layer will be appended to the end of the layers array
51390 * and appear visually above all other layers.
51391 *
51392 * @returns {Map} `this`
51393 *
51394 * @example
51395 * // Add a circle layer with a vector source
51396 * map.addLayer({
51397 * id: 'points-of-interest',
51398 * source: {
51399 * type: 'vector',
51400 * url: 'https://demotiles.maplibre.org/tiles/tiles.json'
51401 * },
51402 * 'source-layer': 'poi_label',
51403 * type: 'circle',
51404 * paint: {
51405 * // MapLibre Style Specification paint properties
51406 * },
51407 * layout: {
51408 * // MapLibre Style Specification layout properties
51409 * }
51410 * });
51411 *
51412 * @example
51413 * // Define a source before using it to create a new layer
51414 * map.addSource('state-data', {
51415 * type: 'geojson',
51416 * data: 'path/to/data.geojson'
51417 * });
51418 *
51419 * map.addLayer({
51420 * id: 'states',
51421 * // References the GeoJSON source defined above
51422 * // and does not require a `source-layer`
51423 * source: 'state-data',
51424 * type: 'symbol',
51425 * layout: {
51426 * // Set the label content to the
51427 * // feature's `name` property
51428 * text-field: ['get', 'name']
51429 * }
51430 * });
51431 *
51432 * @example
51433 * // Add a new symbol layer before an existing layer
51434 * map.addLayer({
51435 * id: 'states',
51436 * // References a source that's already been defined
51437 * source: 'state-data',
51438 * type: 'symbol',
51439 * layout: {
51440 * // Set the label content to the
51441 * // feature's `name` property
51442 * text-field: ['get', 'name']
51443 * }
51444 * // Add the layer before the existing `cities` layer
51445 * }, 'cities');
51446 *
51447 * @see [Create and style clusters](https://maplibre.org/maplibre-gl-js-docs/example/cluster/)
51448 * @see [Add a vector tile source](https://maplibre.org/maplibre-gl-js-docs/example/vector-source/)
51449 * @see [Add a WMS source](https://maplibre.org/maplibre-gl-js-docs/example/wms/)
51450 */
51451 addLayer(layer, beforeId) {
51452 this._lazyInitEmptyStyle();
51453 this.style.addLayer(layer, beforeId);
51454 return this._update(true);
51455 }
51456 /**
51457 * Moves a layer to a different z-position.
51458 *
51459 * @param {string} id The ID of the layer to move.
51460 * @param {string} [beforeId] The ID of an existing layer to insert the new layer before. When viewing the map, the `id` layer will appear beneath the `beforeId` layer. If `beforeId` is omitted, the layer will be appended to the end of the layers array and appear above all other layers on the map.
51461 * @returns {Map} `this`
51462 *
51463 * @example
51464 * // Move a layer with ID 'polygon' before the layer with ID 'country-label'. The `polygon` layer will appear beneath the `country-label` layer on the map.
51465 * map.moveLayer('polygon', 'country-label');
51466 */
51467 moveLayer(id, beforeId) {
51468 this.style.moveLayer(id, beforeId);
51469 return this._update(true);
51470 }
51471 // eslint-disable-next-line jsdoc/require-returns
51472 /**
51473 * Removes the layer with the given ID from the map's style.
51474 *
51475 * If no such layer exists, an `error` event is fired.
51476 *
51477 * @param {string} id id of the layer to remove
51478 * @fires error
51479 *
51480 * @example
51481 * // If a layer with ID 'state-data' exists, remove it.
51482 * if (map.getLayer('state-data')) map.removeLayer('state-data');
51483 */
51484 removeLayer(id) {
51485 this.style.removeLayer(id);
51486 return this._update(true);
51487 }
51488 /**
51489 * Returns the layer with the specified ID in the map's style.
51490 *
51491 * @param {string} id The ID of the layer to get.
51492 * @returns {StyleLayer} The layer with the specified ID, or `undefined`
51493 * if the ID corresponds to no existing layers.
51494 *
51495 * @example
51496 * var stateDataLayer = map.getLayer('state-data');
51497 *
51498 * @see [Filter symbols by toggling a list](https://maplibre.org/maplibre-gl-js-docs/example/filter-markers/)
51499 * @see [Filter symbols by text input](https://maplibre.org/maplibre-gl-js-docs/example/filter-markers-by-input/)
51500 */
51501 getLayer(id) {
51502 return this.style.getLayer(id);
51503 }
51504 /**
51505 * Sets the zoom extent for the specified style layer. The zoom extent includes the
51506 * [minimum zoom level](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layer-minzoom)
51507 * and [maximum zoom level](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layer-maxzoom))
51508 * at which the layer will be rendered.
51509 *
51510 * Note: For style layers using vector sources, style layers cannot be rendered at zoom levels lower than the
51511 * minimum zoom level of the _source layer_ because the data does not exist at those zoom levels. If the minimum
51512 * zoom level of the source layer is higher than the minimum zoom level defined in the style layer, the style
51513 * layer will not be rendered at all zoom levels in the zoom range.
51514 *
51515 * @param {string} layerId The ID of the layer to which the zoom extent will be applied.
51516 * @param {number} minzoom The minimum zoom to set (0-24).
51517 * @param {number} maxzoom The maximum zoom to set (0-24).
51518 * @returns {Map} `this`
51519 *
51520 * @example
51521 * map.setLayerZoomRange('my-layer', 2, 5);
51522 *
51523 */
51524 setLayerZoomRange(layerId, minzoom, maxzoom) {
51525 this.style.setLayerZoomRange(layerId, minzoom, maxzoom);
51526 return this._update(true);
51527 }
51528 /**
51529 * Sets the filter for the specified style layer.
51530 *
51531 * Filters control which features a style layer renders from its source.
51532 * Any feature for which the filter expression evaluates to `true` will be
51533 * rendered on the map. Those that are false will be hidden.
51534 *
51535 * Use `setFilter` to show a subset of your source data.
51536 *
51537 * To clear the filter, pass `null` or `undefined` as the second parameter.
51538 *
51539 * @param {string} layerId The ID of the layer to which the filter will be applied.
51540 * @param {Array | null | undefined} filter The filter, conforming to the MapLibre Style Specification's
51541 * [filter definition](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#filter). If `null` or `undefined` is provided, the function removes any existing filter from the layer.
51542 * @param {Object} [options] Options object.
51543 * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
51544 * @returns {Map} `this`
51545 *
51546 * @example
51547 * // display only features with the 'name' property 'USA'
51548 * map.setFilter('my-layer', ['==', ['get', 'name'], 'USA']);
51549 * @example
51550 * // display only features with five or more 'available-spots'
51551 * map.setFilter('bike-docks', ['>=', ['get', 'available-spots'], 5]);
51552 * @example
51553 * // remove the filter for the 'bike-docks' style layer
51554 * map.setFilter('bike-docks', null);
51555 *
51556 * @see [Create a timeline animation](https://maplibre.org/maplibre-gl-js-docs/example/timeline-animation/)
51557 */
51558 setFilter(layerId, filter, options = {}) {
51559 this.style.setFilter(layerId, filter, options);
51560 return this._update(true);
51561 }
51562 /**
51563 * Returns the filter applied to the specified style layer.
51564 *
51565 * @param {string} layerId The ID of the style layer whose filter to get.
51566 * @returns {Array} The layer's filter.
51567 */
51568 getFilter(layerId) {
51569 return this.style.getFilter(layerId);
51570 }
51571 /**
51572 * Sets the value of a paint property in the specified style layer.
51573 *
51574 * @param {string} layerId The ID of the layer to set the paint property in.
51575 * @param {string} name The name of the paint property to set.
51576 * @param {*} value The value of the paint property to set.
51577 * Must be of a type appropriate for the property, as defined in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/).
51578 * @param {Object} [options] Options object.
51579 * @param {boolean} [options.validate=true] Whether to check if `value` conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
51580 * @returns {Map} `this`
51581 * @example
51582 * map.setPaintProperty('my-layer', 'fill-color', '#faafee');
51583 * @see [Change a layer's color with buttons](https://maplibre.org/maplibre-gl-js-docs/example/color-switcher/)
51584 * @see [Create a draggable point](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-point/)
51585 */
51586 setPaintProperty(layerId, name, value, options = {}) {
51587 this.style.setPaintProperty(layerId, name, value, options);
51588 return this._update(true);
51589 }
51590 /**
51591 * Returns the value of a paint property in the specified style layer.
51592 *
51593 * @param {string} layerId The ID of the layer to get the paint property from.
51594 * @param {string} name The name of a paint property to get.
51595 * @returns {*} The value of the specified paint property.
51596 */
51597 getPaintProperty(layerId, name) {
51598 return this.style.getPaintProperty(layerId, name);
51599 }
51600 /**
51601 * Sets the value of a layout property in the specified style layer.
51602 *
51603 * @param {string} layerId The ID of the layer to set the layout property in.
51604 * @param {string} name The name of the layout property to set.
51605 * @param {*} value The value of the layout property. Must be of a type appropriate for the property, as defined in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/).
51606 * @param {Object} [options] Options object.
51607 * @param {boolean} [options.validate=true] Whether to check if `value` conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
51608 * @returns {Map} `this`
51609 * @example
51610 * map.setLayoutProperty('my-layer', 'visibility', 'none');
51611 */
51612 setLayoutProperty(layerId, name, value, options = {}) {
51613 this.style.setLayoutProperty(layerId, name, value, options);
51614 return this._update(true);
51615 }
51616 /**
51617 * Returns the value of a layout property in the specified style layer.
51618 *
51619 * @param {string} layerId The ID of the layer to get the layout property from.
51620 * @param {string} name The name of the layout property to get.
51621 * @returns {*} The value of the specified layout property.
51622 */
51623 getLayoutProperty(layerId, name) {
51624 return this.style.getLayoutProperty(layerId, name);
51625 }
51626 /**
51627 * Sets the any combination of light values.
51628 *
51629 * @param light Light properties to set. Must conform to the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/#light).
51630 * @param {Object} [options] Options object.
51631 * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
51632 * @returns {Map} `this`
51633 * @example
51634 * var layerVisibility = map.getLayoutProperty('my-layer', 'visibility');
51635 */
51636 setLight(light, options = {}) {
51637 this._lazyInitEmptyStyle();
51638 this.style.setLight(light, options);
51639 return this._update(true);
51640 }
51641 /**
51642 * Returns the value of the light object.
51643 *
51644 * @returns {Object} light Light properties of the style.
51645 */
51646 getLight() {
51647 return this.style.getLight();
51648 }
51649 // eslint-disable-next-line jsdoc/require-returns
51650 /**
51651 * Sets the `state` of a feature.
51652 * A feature's `state` is a set of user-defined key-value pairs that are assigned to a feature at runtime.
51653 * When using this method, the `state` object is merged with any existing key-value pairs in the feature's state.
51654 * Features are identified by their `feature.id` attribute, which can be any number or string.
51655 *
51656 * This method can only be used with sources that have a `feature.id` attribute. The `feature.id` attribute can be defined in three ways:
51657 * - For vector or GeoJSON sources, including an `id` attribute in the original data file.
51658 * - For vector or GeoJSON sources, using the [`promoteId`](https://maplibre.org/maplibre-gl-js-docs/style-spec/sources/#vector-promoteId) option at the time the source is defined.
51659 * - For GeoJSON sources, using the [`generateId`](https://maplibre.org/maplibre-gl-js-docs/style-spec/sources/#geojson-generateId) option to auto-assign an `id` based on the feature's index in the source data. If you change feature data using `map.getSource('some id').setData(..)`, you may need to re-apply state taking into account updated `id` values.
51660 *
51661 * _Note: You can use the [`feature-state` expression](https://maplibre.org/maplibre-gl-js-docs/style-spec/expressions/#feature-state) to access the values in a feature's state object for the purposes of styling._
51662 *
51663 * @param {Object} feature Feature identifier. Feature objects returned from
51664 * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers.
51665 * @param {string | number} feature.id Unique id of the feature.
51666 * @param {string} feature.source The id of the vector or GeoJSON source for the feature.
51667 * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required.*
51668 * @param {Object} state A set of key-value pairs. The values should be valid JSON types.
51669 *
51670 * @example
51671 * // When the mouse moves over the `my-layer` layer, update
51672 * // the feature state for the feature under the mouse
51673 * map.on('mousemove', 'my-layer', function(e) {
51674 * if (e.features.length > 0) {
51675 * map.setFeatureState({
51676 * source: 'my-source',
51677 * sourceLayer: 'my-source-layer',
51678 * id: e.features[0].id,
51679 * }, {
51680 * hover: true
51681 * });
51682 * }
51683 * });
51684 *
51685 * @see [Create a hover effect](https://maplibre.org/maplibre-gl-js-docs/example/hover-styles/)
51686 */
51687 setFeatureState(feature, state) {
51688 this.style.setFeatureState(feature, state);
51689 return this._update();
51690 }
51691 // eslint-disable-next-line jsdoc/require-returns
51692 /**
51693 * Removes the `state` of a feature, setting it back to the default behavior.
51694 * If only a `target.source` is specified, it will remove the state for all features from that source.
51695 * If `target.id` is also specified, it will remove all keys for that feature's state.
51696 * If `key` is also specified, it removes only that key from that feature's state.
51697 * Features are identified by their `feature.id` attribute, which can be any number or string.
51698 *
51699 * @param {Object} target Identifier of where to remove state. It can be a source, a feature, or a specific key of feature.
51700 * Feature objects returned from {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers.
51701 * @param {string | number} target.id (optional) Unique id of the feature. Optional if key is not specified.
51702 * @param {string} target.source The id of the vector or GeoJSON source for the feature.
51703 * @param {string} [target.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required.*
51704 * @param {string} key (optional) The key in the feature state to reset.
51705 *
51706 * @example
51707 * // Reset the entire state object for all features
51708 * // in the `my-source` source
51709 * map.removeFeatureState({
51710 * source: 'my-source'
51711 * });
51712 *
51713 * @example
51714 * // When the mouse leaves the `my-layer` layer,
51715 * // reset the entire state object for the
51716 * // feature under the mouse
51717 * map.on('mouseleave', 'my-layer', function(e) {
51718 * map.removeFeatureState({
51719 * source: 'my-source',
51720 * sourceLayer: 'my-source-layer',
51721 * id: e.features[0].id
51722 * });
51723 * });
51724 *
51725 * @example
51726 * // When the mouse leaves the `my-layer` layer,
51727 * // reset only the `hover` key-value pair in the
51728 * // state for the feature under the mouse
51729 * map.on('mouseleave', 'my-layer', function(e) {
51730 * map.removeFeatureState({
51731 * source: 'my-source',
51732 * sourceLayer: 'my-source-layer',
51733 * id: e.features[0].id
51734 * }, 'hover');
51735 * });
51736 *
51737 */
51738 removeFeatureState(target, key) {
51739 this.style.removeFeatureState(target, key);
51740 return this._update();
51741 }
51742 /**
51743 * Gets the `state` of a feature.
51744 * A feature's `state` is a set of user-defined key-value pairs that are assigned to a feature at runtime.
51745 * Features are identified by their `feature.id` attribute, which can be any number or string.
51746 *
51747 * _Note: To access the values in a feature's state object for the purposes of styling the feature, use the [`feature-state` expression](https://maplibre.org/maplibre-gl-js-docs/style-spec/expressions/#feature-state)._
51748 *
51749 * @param {Object} feature Feature identifier. Feature objects returned from
51750 * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers.
51751 * @param {string | number} feature.id Unique id of the feature.
51752 * @param {string} feature.source The id of the vector or GeoJSON source for the feature.
51753 * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required.*
51754 *
51755 * @returns {Object} The state of the feature: a set of key-value pairs that was assigned to the feature at runtime.
51756 *
51757 * @example
51758 * // When the mouse moves over the `my-layer` layer,
51759 * // get the feature state for the feature under the mouse
51760 * map.on('mousemove', 'my-layer', function(e) {
51761 * if (e.features.length > 0) {
51762 * map.getFeatureState({
51763 * source: 'my-source',
51764 * sourceLayer: 'my-source-layer',
51765 * id: e.features[0].id
51766 * });
51767 * }
51768 * });
51769 *
51770 */
51771 getFeatureState(feature) {
51772 return this.style.getFeatureState(feature);
51773 }
51774 /**
51775 * Returns the map's containing HTML element.
51776 *
51777 * @returns {HTMLElement} The map's container.
51778 */
51779 getContainer() {
51780 return this._container;
51781 }
51782 /**
51783 * Returns the HTML element containing the map's `<canvas>` element.
51784 *
51785 * If you want to add non-GL overlays to the map, you should append them to this element.
51786 *
51787 * This is the element to which event bindings for map interactivity (such as panning and zooming) are
51788 * attached. It will receive bubbled events from child elements such as the `<canvas>`, but not from
51789 * map controls.
51790 *
51791 * @returns {HTMLElement} The container of the map's `<canvas>`.
51792 * @see [Create a draggable point](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-point/)
51793 */
51794 getCanvasContainer() {
51795 return this._canvasContainer;
51796 }
51797 /**
51798 * Returns the map's `<canvas>` element.
51799 *
51800 * @returns {HTMLCanvasElement} The map's `<canvas>` element.
51801 * @see [Measure distances](https://maplibre.org/maplibre-gl-js-docs/example/measure/)
51802 * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-hover/)
51803 * @see [Center the map on a clicked symbol](https://maplibre.org/maplibre-gl-js-docs/example/center-on-symbol/)
51804 */
51805 getCanvas() {
51806 return this._canvas;
51807 }
51808 _containerDimensions() {
51809 let width = 0;
51810 let height = 0;
51811 if (this._container) {
51812 width = this._container.clientWidth || 400;
51813 height = this._container.clientHeight || 300;
51814 }
51815 return [width, height];
51816 }
51817 _setupContainer() {
51818 const container = this._container;
51819 container.classList.add('maplibregl-map', 'mapboxgl-map');
51820 const canvasContainer = this._canvasContainer = DOM.create('div', 'maplibregl-canvas-container mapboxgl-canvas-container', container);
51821 if (this._interactive) {
51822 canvasContainer.classList.add('maplibregl-interactive', 'mapboxgl-interactive');
51823 }
51824 this._canvas = DOM.create('canvas', 'maplibregl-canvas mapboxgl-canvas', canvasContainer);
51825 this._canvas.addEventListener('webglcontextlost', this._contextLost, false);
51826 this._canvas.addEventListener('webglcontextrestored', this._contextRestored, false);
51827 this._canvas.setAttribute('tabindex', '0');
51828 this._canvas.setAttribute('aria-label', 'Map');
51829 this._canvas.setAttribute('role', 'region');
51830 const dimensions = this._containerDimensions();
51831 this._resizeCanvas(dimensions[0], dimensions[1], this.getPixelRatio());
51832 const controlContainer = this._controlContainer = DOM.create('div', 'maplibregl-control-container mapboxgl-control-container', container);
51833 const positions = this._controlPositions = {};
51834 ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach((positionName) => {
51835 positions[positionName] = DOM.create('div', `maplibregl-ctrl-${positionName} mapboxgl-ctrl-${positionName}`, controlContainer);
51836 });
51837 this._container.addEventListener('scroll', this._onMapScroll, false);
51838 }
51839 _resizeCanvas(width, height, pixelRatio) {
51840 // Request the required canvas size taking the pixelratio into account.
51841 this._canvas.width = pixelRatio * width;
51842 this._canvas.height = pixelRatio * height;
51843 // Maintain the same canvas size, potentially downscaling it for HiDPI displays
51844 this._canvas.style.width = `${width}px`;
51845 this._canvas.style.height = `${height}px`;
51846 }
51847 _setupPainter() {
51848 const attributes = performance.extend({}, supported.webGLContextAttributes, {
51849 failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat,
51850 preserveDrawingBuffer: this._preserveDrawingBuffer,
51851 antialias: this._antialias || false
51852 });
51853 const gl = this._canvas.getContext('webgl', attributes) ||
51854 this._canvas.getContext('experimental-webgl', attributes);
51855 if (!gl) {
51856 this.fire(new performance.ErrorEvent(new Error('Failed to initialize WebGL')));
51857 return;
51858 }
51859 this.painter = new Painter(gl, this.transform);
51860 performance.exported$1.testSupport(gl);
51861 }
51862 _contextLost(event) {
51863 event.preventDefault();
51864 if (this._frame) {
51865 this._frame.cancel();
51866 this._frame = null;
51867 }
51868 this.fire(new performance.Event('webglcontextlost', { originalEvent: event }));
51869 }
51870 _contextRestored(event) {
51871 this._setupPainter();
51872 this.resize();
51873 this._update();
51874 this.fire(new performance.Event('webglcontextrestored', { originalEvent: event }));
51875 }
51876 _onMapScroll(event) {
51877 if (event.target !== this._container)
51878 return;
51879 // Revert any scroll which would move the canvas outside of the view
51880 this._container.scrollTop = 0;
51881 this._container.scrollLeft = 0;
51882 return false;
51883 }
51884 /**
51885 * Returns a Boolean indicating whether the map is fully loaded.
51886 *
51887 * Returns `false` if the style is not yet fully loaded,
51888 * or if there has been a change to the sources or style that
51889 * has not yet fully loaded.
51890 *
51891 * @returns {boolean} A Boolean indicating whether the map is fully loaded.
51892 */
51893 loaded() {
51894 return !this._styleDirty && !this._sourcesDirty && !!this.style && this.style.loaded();
51895 }
51896 /**
51897 * Update this map's style and sources, and re-render the map.
51898 *
51899 * @param {boolean} updateStyle mark the map's style for reprocessing as
51900 * well as its sources
51901 * @returns {Map} this
51902 * @private
51903 */
51904 _update(updateStyle) {
51905 if (!this.style)
51906 return this;
51907 this._styleDirty = this._styleDirty || updateStyle;
51908 this._sourcesDirty = true;
51909 this.triggerRepaint();
51910 return this;
51911 }
51912 /**
51913 * Request that the given callback be executed during the next render
51914 * frame. Schedule a render frame if one is not already scheduled.
51915 * @returns An id that can be used to cancel the callback
51916 * @private
51917 */
51918 _requestRenderFrame(callback) {
51919 this._update();
51920 return this._renderTaskQueue.add(callback);
51921 }
51922 _cancelRenderFrame(id) {
51923 this._renderTaskQueue.remove(id);
51924 }
51925 /**
51926 * Call when a (re-)render of the map is required:
51927 * - The style has changed (`setPaintProperty()`, etc.)
51928 * - Source data has changed (e.g. tiles have finished loading)
51929 * - The map has is moving (or just finished moving)
51930 * - A transition is in progress
51931 *
51932 * @param {number} paintStartTimeStamp The time when the animation frame began executing.
51933 *
51934 * @returns {Map} this
51935 * @private
51936 */
51937 _render(paintStartTimeStamp) {
51938 let gpuTimer, frameStartTime = 0;
51939 const extTimerQuery = this.painter.context.extTimerQuery;
51940 if (this.listens('gpu-timing-frame')) {
51941 gpuTimer = extTimerQuery.createQueryEXT();
51942 extTimerQuery.beginQueryEXT(extTimerQuery.TIME_ELAPSED_EXT, gpuTimer);
51943 frameStartTime = performance.exported.now();
51944 }
51945 // A custom layer may have used the context asynchronously. Mark the state as dirty.
51946 this.painter.context.setDirty();
51947 this.painter.setBaseState();
51948 this._renderTaskQueue.run(paintStartTimeStamp);
51949 // A task queue callback may have fired a user event which may have removed the map
51950 if (this._removed)
51951 return;
51952 let crossFading = false;
51953 // If the style has changed, the map is being zoomed, or a transition or fade is in progress:
51954 // - Apply style changes (in a batch)
51955 // - Recalculate paint properties.
51956 if (this.style && this._styleDirty) {
51957 this._styleDirty = false;
51958 const zoom = this.transform.zoom;
51959 const now = performance.exported.now();
51960 this.style.zoomHistory.update(zoom, now);
51961 const parameters = new performance.EvaluationParameters(zoom, {
51962 now,
51963 fadeDuration: this._fadeDuration,
51964 zoomHistory: this.style.zoomHistory,
51965 transition: this.style.getTransition()
51966 });
51967 const factor = parameters.crossFadingFactor();
51968 if (factor !== 1 || factor !== this._crossFadingFactor) {
51969 crossFading = true;
51970 this._crossFadingFactor = factor;
51971 }
51972 this.style.update(parameters);
51973 }
51974 // If we are in _render for any reason other than an in-progress paint
51975 // transition, update source caches to check for and load any tiles we
51976 // need for the current transform
51977 if (this.style && this._sourcesDirty) {
51978 this._sourcesDirty = false;
51979 this.style._updateSources(this.transform);
51980 }
51981 this._placementDirty = this.style && this.style._updatePlacement(this.painter.transform, this.showCollisionBoxes, this._fadeDuration, this._crossSourceCollisions);
51982 // Actually draw
51983 this.painter.render(this.style, {
51984 showTileBoundaries: this.showTileBoundaries,
51985 showOverdrawInspector: this._showOverdrawInspector,
51986 rotating: this.isRotating(),
51987 zooming: this.isZooming(),
51988 moving: this.isMoving(),
51989 fadeDuration: this._fadeDuration,
51990 showPadding: this.showPadding,
51991 gpuTiming: !!this.listens('gpu-timing-layer'),
51992 });
51993 this.fire(new performance.Event('render'));
51994 if (this.loaded() && !this._loaded) {
51995 this._loaded = true;
51996 performance.PerformanceUtils.mark(performance.PerformanceMarkers.load);
51997 this.fire(new performance.Event('load'));
51998 }
51999 if (this.style && (this.style.hasTransitions() || crossFading)) {
52000 this._styleDirty = true;
52001 }
52002 if (this.style && !this._placementDirty) {
52003 // Since no fade operations are in progress, we can release
52004 // all tiles held for fading. If we didn't do this, the tiles
52005 // would just sit in the SourceCaches until the next render
52006 this.style._releaseSymbolFadeTiles();
52007 }
52008 if (this.listens('gpu-timing-frame')) {
52009 const renderCPUTime = performance.exported.now() - frameStartTime;
52010 extTimerQuery.endQueryEXT(extTimerQuery.TIME_ELAPSED_EXT, gpuTimer);
52011 setTimeout(() => {
52012 const renderGPUTime = extTimerQuery.getQueryObjectEXT(gpuTimer, extTimerQuery.QUERY_RESULT_EXT) / (1000 * 1000);
52013 extTimerQuery.deleteQueryEXT(gpuTimer);
52014 this.fire(new performance.Event('gpu-timing-frame', {
52015 cpuTime: renderCPUTime,
52016 gpuTime: renderGPUTime
52017 }));
52018 }, 50); // Wait 50ms to give time for all GPU calls to finish before querying
52019 }
52020 if (this.listens('gpu-timing-layer')) {
52021 // Resetting the Painter's per-layer timing queries here allows us to isolate
52022 // the queries to individual frames.
52023 const frameLayerQueries = this.painter.collectGpuTimers();
52024 setTimeout(() => {
52025 const renderedLayerTimes = this.painter.queryGpuTimers(frameLayerQueries);
52026 this.fire(new performance.Event('gpu-timing-layer', {
52027 layerTimes: renderedLayerTimes
52028 }));
52029 }, 50); // Wait 50ms to give time for all GPU calls to finish before querying
52030 }
52031 // Schedule another render frame if it's needed.
52032 //
52033 // Even though `_styleDirty` and `_sourcesDirty` are reset in this
52034 // method, synchronous events fired during Style#update or
52035 // Style#_updateSources could have caused them to be set again.
52036 const somethingDirty = this._sourcesDirty || this._styleDirty || this._placementDirty;
52037 if (somethingDirty || this._repaint) {
52038 this.triggerRepaint();
52039 }
52040 else if (!this.isMoving() && this.loaded()) {
52041 this.fire(new performance.Event('idle'));
52042 }
52043 if (this._loaded && !this._fullyLoaded && !somethingDirty) {
52044 this._fullyLoaded = true;
52045 performance.PerformanceUtils.mark(performance.PerformanceMarkers.fullLoad);
52046 }
52047 return this;
52048 }
52049 /**
52050 * Force a synchronous redraw of the map.
52051 * @example
52052 * map.redraw();
52053 * @returns {Map} `this`
52054 */
52055 redraw() {
52056 if (this.style) {
52057 // cancel the scheduled update
52058 if (this._frame) {
52059 this._frame.cancel();
52060 this._frame = null;
52061 }
52062 this._render(0);
52063 }
52064 return this;
52065 }
52066 /**
52067 * Clean up and release all internal resources associated with this map.
52068 *
52069 * This includes DOM elements, event bindings, web workers, and WebGL resources.
52070 *
52071 * Use this method when you are done using the map and wish to ensure that it no
52072 * longer consumes browser resources. Afterwards, you must not call any other
52073 * methods on the map.
52074 */
52075 remove() {
52076 if (this._hash)
52077 this._hash.remove();
52078 for (const control of this._controls)
52079 control.onRemove(this);
52080 this._controls = [];
52081 if (this._frame) {
52082 this._frame.cancel();
52083 this._frame = null;
52084 }
52085 this._renderTaskQueue.clear();
52086 this.painter.destroy();
52087 this.handlers.destroy();
52088 delete this.handlers;
52089 this.setStyle(null);
52090 if (typeof window !== 'undefined') {
52091 removeEventListener('resize', this._onWindowResize, false);
52092 removeEventListener('orientationchange', this._onWindowResize, false);
52093 removeEventListener('online', this._onWindowOnline, false);
52094 }
52095 const extension = this.painter.context.gl.getExtension('WEBGL_lose_context');
52096 if (extension)
52097 extension.loseContext();
52098 this._canvas.removeEventListener('webglcontextrestored', this._contextRestored, false);
52099 this._canvas.removeEventListener('webglcontextlost', this._contextLost, false);
52100 DOM.remove(this._canvasContainer);
52101 DOM.remove(this._controlContainer);
52102 this._container.classList.remove('maplibregl-map', 'mapboxgl-map');
52103 performance.PerformanceUtils.clearMetrics();
52104 this._removed = true;
52105 this.fire(new performance.Event('remove'));
52106 }
52107 /**
52108 * Trigger the rendering of a single frame. Use this method with custom layers to
52109 * repaint the map when the layer changes. Calling this multiple times before the
52110 * next frame is rendered will still result in only a single frame being rendered.
52111 * @example
52112 * map.triggerRepaint();
52113 * @see [Add a 3D model](https://maplibre.org/maplibre-gl-js-docs/example/add-3d-model/)
52114 * @see [Add an animated icon to the map](https://maplibre.org/maplibre-gl-js-docs/example/add-image-animated/)
52115 */
52116 triggerRepaint() {
52117 if (this.style && !this._frame) {
52118 this._frame = performance.exported.frame((paintStartTimeStamp) => {
52119 performance.PerformanceUtils.frame(paintStartTimeStamp);
52120 this._frame = null;
52121 this._render(paintStartTimeStamp);
52122 });
52123 }
52124 }
52125 _onWindowOnline() {
52126 this._update();
52127 }
52128 _onWindowResize(event) {
52129 if (this._trackResize) {
52130 this.resize({ originalEvent: event })._update();
52131 }
52132 }
52133 /**
52134 * Gets and sets a Boolean indicating whether the map will render an outline
52135 * around each tile and the tile ID. These tile boundaries are useful for
52136 * debugging.
52137 *
52138 * The uncompressed file size of the first vector source is drawn in the top left
52139 * corner of each tile, next to the tile ID.
52140 *
52141 * @name showTileBoundaries
52142 * @type {boolean}
52143 * @instance
52144 * @memberof Map
52145 * @example
52146 * map.showTileBoundaries = true;
52147 */
52148 get showTileBoundaries() { return !!this._showTileBoundaries; }
52149 set showTileBoundaries(value) {
52150 if (this._showTileBoundaries === value)
52151 return;
52152 this._showTileBoundaries = value;
52153 this._update();
52154 }
52155 /**
52156 * Gets and sets a Boolean indicating whether the map will visualize
52157 * the padding offsets.
52158 *
52159 * @name showPadding
52160 * @type {boolean}
52161 * @instance
52162 * @memberof Map
52163 */
52164 get showPadding() { return !!this._showPadding; }
52165 set showPadding(value) {
52166 if (this._showPadding === value)
52167 return;
52168 this._showPadding = value;
52169 this._update();
52170 }
52171 /**
52172 * Gets and sets a Boolean indicating whether the map will render boxes
52173 * around all symbols in the data source, revealing which symbols
52174 * were rendered or which were hidden due to collisions.
52175 * This information is useful for debugging.
52176 *
52177 * @name showCollisionBoxes
52178 * @type {boolean}
52179 * @instance
52180 * @memberof Map
52181 */
52182 get showCollisionBoxes() { return !!this._showCollisionBoxes; }
52183 set showCollisionBoxes(value) {
52184 if (this._showCollisionBoxes === value)
52185 return;
52186 this._showCollisionBoxes = value;
52187 if (value) {
52188 // When we turn collision boxes on we have to generate them for existing tiles
52189 // When we turn them off, there's no cost to leaving existing boxes in place
52190 this.style._generateCollisionBoxes();
52191 }
52192 else {
52193 // Otherwise, call an update to remove collision boxes
52194 this._update();
52195 }
52196 }
52197 /*
52198 * Gets and sets a Boolean indicating whether the map should color-code
52199 * each fragment to show how many times it has been shaded.
52200 * White fragments have been shaded 8 or more times.
52201 * Black fragments have been shaded 0 times.
52202 * This information is useful for debugging.
52203 *
52204 * @name showOverdraw
52205 * @type {boolean}
52206 * @instance
52207 * @memberof Map
52208 */
52209 get showOverdrawInspector() { return !!this._showOverdrawInspector; }
52210 set showOverdrawInspector(value) {
52211 if (this._showOverdrawInspector === value)
52212 return;
52213 this._showOverdrawInspector = value;
52214 this._update();
52215 }
52216 /**
52217 * Gets and sets a Boolean indicating whether the map will
52218 * continuously repaint. This information is useful for analyzing performance.
52219 *
52220 * @name repaint
52221 * @type {boolean}
52222 * @instance
52223 * @memberof Map
52224 */
52225 get repaint() { return !!this._repaint; }
52226 set repaint(value) {
52227 if (this._repaint !== value) {
52228 this._repaint = value;
52229 this.triggerRepaint();
52230 }
52231 }
52232 // show vertices
52233 get vertices() { return !!this._vertices; }
52234 set vertices(value) { this._vertices = value; this._update(); }
52235 // for cache browser tests
52236 _setCacheLimits(limit, checkThreshold) {
52237 performance.setCacheLimits(limit, checkThreshold);
52238 }
52239}
52240
52241const defaultOptions$3 = {
52242 showCompass: true,
52243 showZoom: true,
52244 visualizePitch: false
52245};
52246/**
52247 * A `NavigationControl` control contains zoom buttons and a compass.
52248 *
52249 * @implements {IControl}
52250 * @param {Object} [options]
52251 * @param {Boolean} [options.showCompass=true] If `true` the compass button is included.
52252 * @param {Boolean} [options.showZoom=true] If `true` the zoom-in and zoom-out buttons are included.
52253 * @param {Boolean} [options.visualizePitch=false] If `true` the pitch is visualized by rotating X-axis of compass.
52254 * @example
52255 * var nav = new maplibregl.NavigationControl();
52256 * map.addControl(nav, 'top-left');
52257 * @see [Display map navigation controls](https://maplibre.org/maplibre-gl-js-docs/example/navigation/)
52258 * @see [Add a third party vector tile source](https://maplibre.org/maplibre-gl-js-docs/example/third-party/)
52259 */
52260class NavigationControl {
52261 constructor(options) {
52262 this.options = performance.extend({}, defaultOptions$3, options);
52263 this._container = DOM.create('div', 'maplibregl-ctrl maplibregl-ctrl-group mapboxgl-ctrl mapboxgl-ctrl-group');
52264 this._container.addEventListener('contextmenu', (e) => e.preventDefault());
52265 if (this.options.showZoom) {
52266 performance.bindAll([
52267 '_setButtonTitle',
52268 '_updateZoomButtons'
52269 ], this);
52270 this._zoomInButton = this._createButton('maplibregl-ctrl-zoom-in mapboxgl-ctrl-zoom-in', (e) => this._map.zoomIn({}, { originalEvent: e }));
52271 DOM.create('span', 'maplibregl-ctrl-icon mapboxgl-ctrl-icon', this._zoomInButton).setAttribute('aria-hidden', 'true');
52272 this._zoomOutButton = this._createButton('maplibregl-ctrl-zoom-out mapboxgl-ctrl-zoom-out', (e) => this._map.zoomOut({}, { originalEvent: e }));
52273 DOM.create('span', 'maplibregl-ctrl-icon mapboxgl-ctrl-icon', this._zoomOutButton).setAttribute('aria-hidden', 'true');
52274 }
52275 if (this.options.showCompass) {
52276 performance.bindAll([
52277 '_rotateCompassArrow'
52278 ], this);
52279 this._compass = this._createButton('maplibregl-ctrl-compass mapboxgl-ctrl-compass', (e) => {
52280 if (this.options.visualizePitch) {
52281 this._map.resetNorthPitch({}, { originalEvent: e });
52282 }
52283 else {
52284 this._map.resetNorth({}, { originalEvent: e });
52285 }
52286 });
52287 this._compassIcon = DOM.create('span', 'maplibregl-ctrl-icon mapboxgl-ctrl-icon', this._compass);
52288 this._compassIcon.setAttribute('aria-hidden', 'true');
52289 }
52290 }
52291 _updateZoomButtons() {
52292 const zoom = this._map.getZoom();
52293 const isMax = zoom === this._map.getMaxZoom();
52294 const isMin = zoom === this._map.getMinZoom();
52295 this._zoomInButton.disabled = isMax;
52296 this._zoomOutButton.disabled = isMin;
52297 this._zoomInButton.setAttribute('aria-disabled', isMax.toString());
52298 this._zoomOutButton.setAttribute('aria-disabled', isMin.toString());
52299 }
52300 _rotateCompassArrow() {
52301 const rotate = this.options.visualizePitch ?
52302 `scale(${1 / Math.pow(Math.cos(this._map.transform.pitch * (Math.PI / 180)), 0.5)}) rotateX(${this._map.transform.pitch}deg) rotateZ(${this._map.transform.angle * (180 / Math.PI)}deg)` :
52303 `rotate(${this._map.transform.angle * (180 / Math.PI)}deg)`;
52304 this._compassIcon.style.transform = rotate;
52305 }
52306 onAdd(map) {
52307 this._map = map;
52308 if (this.options.showZoom) {
52309 this._setButtonTitle(this._zoomInButton, 'ZoomIn');
52310 this._setButtonTitle(this._zoomOutButton, 'ZoomOut');
52311 this._map.on('zoom', this._updateZoomButtons);
52312 this._updateZoomButtons();
52313 }
52314 if (this.options.showCompass) {
52315 this._setButtonTitle(this._compass, 'ResetBearing');
52316 if (this.options.visualizePitch) {
52317 this._map.on('pitch', this._rotateCompassArrow);
52318 }
52319 this._map.on('rotate', this._rotateCompassArrow);
52320 this._rotateCompassArrow();
52321 this._handler = new MouseRotateWrapper(this._map, this._compass, this.options.visualizePitch);
52322 }
52323 return this._container;
52324 }
52325 onRemove() {
52326 DOM.remove(this._container);
52327 if (this.options.showZoom) {
52328 this._map.off('zoom', this._updateZoomButtons);
52329 }
52330 if (this.options.showCompass) {
52331 if (this.options.visualizePitch) {
52332 this._map.off('pitch', this._rotateCompassArrow);
52333 }
52334 this._map.off('rotate', this._rotateCompassArrow);
52335 this._handler.off();
52336 delete this._handler;
52337 }
52338 delete this._map;
52339 }
52340 _createButton(className, fn) {
52341 const a = DOM.create('button', className, this._container);
52342 a.type = 'button';
52343 a.addEventListener('click', fn);
52344 return a;
52345 }
52346 _setButtonTitle(button, title) {
52347 const str = this._map._getUIString(`NavigationControl.${title}`);
52348 button.title = str;
52349 button.setAttribute('aria-label', str);
52350 }
52351}
52352class MouseRotateWrapper {
52353 constructor(map, element, pitch = false) {
52354 this._clickTolerance = 10;
52355 this.element = element;
52356 this.mouseRotate = new MouseRotateHandler({ clickTolerance: map.dragRotate._mouseRotate._clickTolerance });
52357 this.map = map;
52358 if (pitch)
52359 this.mousePitch = new MousePitchHandler({ clickTolerance: map.dragRotate._mousePitch._clickTolerance });
52360 performance.bindAll(['mousedown', 'mousemove', 'mouseup', 'touchstart', 'touchmove', 'touchend', 'reset'], this);
52361 DOM.addEventListener(element, 'mousedown', this.mousedown);
52362 DOM.addEventListener(element, 'touchstart', this.touchstart, { passive: false });
52363 DOM.addEventListener(element, 'touchmove', this.touchmove);
52364 DOM.addEventListener(element, 'touchend', this.touchend);
52365 DOM.addEventListener(element, 'touchcancel', this.reset);
52366 }
52367 down(e, point) {
52368 this.mouseRotate.mousedown(e, point);
52369 if (this.mousePitch)
52370 this.mousePitch.mousedown(e, point);
52371 DOM.disableDrag();
52372 }
52373 move(e, point) {
52374 const map = this.map;
52375 const r = this.mouseRotate.mousemoveWindow(e, point);
52376 if (r && r.bearingDelta)
52377 map.setBearing(map.getBearing() + r.bearingDelta);
52378 if (this.mousePitch) {
52379 const p = this.mousePitch.mousemoveWindow(e, point);
52380 if (p && p.pitchDelta)
52381 map.setPitch(map.getPitch() + p.pitchDelta);
52382 }
52383 }
52384 off() {
52385 const element = this.element;
52386 DOM.removeEventListener(element, 'mousedown', this.mousedown);
52387 DOM.removeEventListener(element, 'touchstart', this.touchstart, { passive: false });
52388 DOM.removeEventListener(element, 'touchmove', this.touchmove);
52389 DOM.removeEventListener(element, 'touchend', this.touchend);
52390 DOM.removeEventListener(element, 'touchcancel', this.reset);
52391 this.offTemp();
52392 }
52393 offTemp() {
52394 DOM.enableDrag();
52395 DOM.removeEventListener(window, 'mousemove', this.mousemove);
52396 DOM.removeEventListener(window, 'mouseup', this.mouseup);
52397 }
52398 mousedown(e) {
52399 this.down(performance.extend({}, e, { ctrlKey: true, preventDefault: () => e.preventDefault() }), DOM.mousePos(this.element, e));
52400 DOM.addEventListener(window, 'mousemove', this.mousemove);
52401 DOM.addEventListener(window, 'mouseup', this.mouseup);
52402 }
52403 mousemove(e) {
52404 this.move(e, DOM.mousePos(this.element, e));
52405 }
52406 mouseup(e) {
52407 this.mouseRotate.mouseupWindow(e);
52408 if (this.mousePitch)
52409 this.mousePitch.mouseupWindow(e);
52410 this.offTemp();
52411 }
52412 touchstart(e) {
52413 if (e.targetTouches.length !== 1) {
52414 this.reset();
52415 }
52416 else {
52417 this._startPos = this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0];
52418 this.down({ type: 'mousedown', button: 0, ctrlKey: true, preventDefault: () => e.preventDefault() }, this._startPos);
52419 }
52420 }
52421 touchmove(e) {
52422 if (e.targetTouches.length !== 1) {
52423 this.reset();
52424 }
52425 else {
52426 this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0];
52427 this.move({ preventDefault: () => e.preventDefault() }, this._lastPos);
52428 }
52429 }
52430 touchend(e) {
52431 if (e.targetTouches.length === 0 &&
52432 this._startPos &&
52433 this._lastPos &&
52434 this._startPos.dist(this._lastPos) < this._clickTolerance) {
52435 this.element.click();
52436 }
52437 this.reset();
52438 }
52439 reset() {
52440 this.mouseRotate.reset();
52441 if (this.mousePitch)
52442 this.mousePitch.reset();
52443 delete this._startPos;
52444 delete this._lastPos;
52445 this.offTemp();
52446 }
52447}
52448
52449/**
52450 * Given a LngLat, prior projected position, and a transform, return a new LngLat shifted
52451 * n × 360° east or west for some n ≥ 0 such that:
52452 *
52453 * * the projected location of the result is on screen, if possible, and secondarily:
52454 * * the difference between the projected location of the result and the prior position
52455 * is minimized.
52456 *
52457 * The object is to preserve perceived object constancy for Popups and Markers as much as
52458 * possible; they should avoid shifting large distances across the screen, even when the
52459 * map center changes by ±360° due to automatic wrapping, and when about to go off screen,
52460 * should wrap just enough to avoid doing so.
52461 *
52462 * @private
52463 */
52464function smartWrap (lngLat, priorPos, transform) {
52465 lngLat = new performance.LngLat(lngLat.lng, lngLat.lat);
52466 // First, try shifting one world in either direction, and see if either is closer to the
52467 // prior position. This preserves object constancy when the map center is auto-wrapped
52468 // during animations.
52469 if (priorPos) {
52470 const left = new performance.LngLat(lngLat.lng - 360, lngLat.lat);
52471 const right = new performance.LngLat(lngLat.lng + 360, lngLat.lat);
52472 const delta = transform.locationPoint(lngLat).distSqr(priorPos);
52473 if (transform.locationPoint(left).distSqr(priorPos) < delta) {
52474 lngLat = left;
52475 }
52476 else if (transform.locationPoint(right).distSqr(priorPos) < delta) {
52477 lngLat = right;
52478 }
52479 }
52480 // Second, wrap toward the center until the new position is on screen, or we can't get
52481 // any closer.
52482 while (Math.abs(lngLat.lng - transform.center.lng) > 180) {
52483 const pos = transform.locationPoint(lngLat);
52484 if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform.width && pos.y <= transform.height) {
52485 break;
52486 }
52487 if (lngLat.lng > transform.center.lng) {
52488 lngLat.lng -= 360;
52489 }
52490 else {
52491 lngLat.lng += 360;
52492 }
52493 }
52494 return lngLat;
52495}
52496
52497const anchorTranslate = {
52498 'center': 'translate(-50%,-50%)',
52499 'top': 'translate(-50%,0)',
52500 'top-left': 'translate(0,0)',
52501 'top-right': 'translate(-100%,0)',
52502 'bottom': 'translate(-50%,-100%)',
52503 'bottom-left': 'translate(0,-100%)',
52504 'bottom-right': 'translate(-100%,-100%)',
52505 'left': 'translate(0,-50%)',
52506 'right': 'translate(-100%,-50%)'
52507};
52508function applyAnchorClass(element, anchor, prefix) {
52509 const classList = element.classList;
52510 for (const key in anchorTranslate) {
52511 classList.remove(`maplibregl-${prefix}-anchor-${key}`, `mapboxgl-${prefix}-anchor-${key}`);
52512 }
52513 classList.add(`maplibregl-${prefix}-anchor-${anchor}`, `mapboxgl-${prefix}-anchor-${anchor}`);
52514}
52515
52516/**
52517 * Creates a marker component
52518 * @param {Object} [options]
52519 * @param {HTMLElement} [options.element] DOM element to use as a marker. The default is a light blue, droplet-shaped SVG marker.
52520 * @param {string} [options.anchor='center'] A string indicating the part of the Marker that should be positioned closest to the coordinate set via {@link Marker#setLngLat}.
52521 * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`.
52522 * @param {PointLike} [options.offset] The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up.
52523 * @param {string} [options.color='#3FB1CE'] The color to use for the default marker if options.element is not provided. The default is light blue.
52524 * @param {number} [options.scale=1] The scale to use for the default marker if options.element is not provided. The default scale corresponds to a height of `41px` and a width of `27px`.
52525 * @param {boolean} [options.draggable=false] A boolean indicating whether or not a marker is able to be dragged to a new position on the map.
52526 * @param {number} [options.clickTolerance=0] The max number of pixels a user can shift the mouse pointer during a click on the marker for it to be considered a valid click (as opposed to a marker drag). The default is to inherit map's clickTolerance.
52527 * @param {number} [options.rotation=0] The rotation angle of the marker in degrees, relative to its respective `rotationAlignment` setting. A positive value will rotate the marker clockwise.
52528 * @param {string} [options.pitchAlignment='auto'] `map` aligns the `Marker` to the plane of the map. `viewport` aligns the `Marker` to the plane of the viewport. `auto` automatically matches the value of `rotationAlignment`.
52529 * @param {string} [options.rotationAlignment='auto'] `map` aligns the `Marker`'s rotation relative to the map, maintaining a bearing as the map rotates. `viewport` aligns the `Marker`'s rotation relative to the viewport, agnostic to map rotations. `auto` is equivalent to `viewport`.
52530 * @example
52531 * var marker = new maplibregl.Marker()
52532 * .setLngLat([30.5, 50.5])
52533 * .addTo(map);
52534 * @example
52535 * // Set options
52536 * var marker = new maplibregl.Marker({
52537 * color: "#FFFFFF",
52538 * draggable: true
52539 * }).setLngLat([30.5, 50.5])
52540 * .addTo(map);
52541 * @see [Add custom icons with Markers](https://maplibre.org/maplibre-gl-js-docs/example/custom-marker-icons/)
52542 * @see [Create a draggable Marker](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-marker/)
52543 */
52544class Marker extends performance.Evented {
52545 constructor(options, legacyOptions) {
52546 super();
52547 // For backward compatibility -- the constructor used to accept the element as a
52548 // required first argument, before it was made optional.
52549 if (options instanceof HTMLElement || legacyOptions) {
52550 options = performance.extend({ element: options }, legacyOptions);
52551 }
52552 performance.bindAll([
52553 '_update',
52554 '_onMove',
52555 '_onUp',
52556 '_addDragHandler',
52557 '_onMapClick',
52558 '_onKeyPress'
52559 ], this);
52560 this._anchor = options && options.anchor || 'center';
52561 this._color = options && options.color || '#3FB1CE';
52562 this._scale = options && options.scale || 1;
52563 this._draggable = options && options.draggable || false;
52564 this._clickTolerance = options && options.clickTolerance || 0;
52565 this._isDragging = false;
52566 this._state = 'inactive';
52567 this._rotation = options && options.rotation || 0;
52568 this._rotationAlignment = options && options.rotationAlignment || 'auto';
52569 this._pitchAlignment = options && options.pitchAlignment && options.pitchAlignment !== 'auto' ? options.pitchAlignment : this._rotationAlignment;
52570 if (!options || !options.element) {
52571 this._defaultMarker = true;
52572 this._element = DOM.create('div');
52573 this._element.setAttribute('aria-label', 'Map marker');
52574 // create default map marker SVG
52575 const svg = DOM.createNS('http://www.w3.org/2000/svg', 'svg');
52576 const defaultHeight = 41;
52577 const defaultWidth = 27;
52578 svg.setAttributeNS(null, 'display', 'block');
52579 svg.setAttributeNS(null, 'height', `${defaultHeight}px`);
52580 svg.setAttributeNS(null, 'width', `${defaultWidth}px`);
52581 svg.setAttributeNS(null, 'viewBox', `0 0 ${defaultWidth} ${defaultHeight}`);
52582 const markerLarge = DOM.createNS('http://www.w3.org/2000/svg', 'g');
52583 markerLarge.setAttributeNS(null, 'stroke', 'none');
52584 markerLarge.setAttributeNS(null, 'stroke-width', '1');
52585 markerLarge.setAttributeNS(null, 'fill', 'none');
52586 markerLarge.setAttributeNS(null, 'fill-rule', 'evenodd');
52587 const page1 = DOM.createNS('http://www.w3.org/2000/svg', 'g');
52588 page1.setAttributeNS(null, 'fill-rule', 'nonzero');
52589 const shadow = DOM.createNS('http://www.w3.org/2000/svg', 'g');
52590 shadow.setAttributeNS(null, 'transform', 'translate(3.0, 29.0)');
52591 shadow.setAttributeNS(null, 'fill', '#000000');
52592 const ellipses = [
52593 { 'rx': '10.5', 'ry': '5.25002273' },
52594 { 'rx': '10.5', 'ry': '5.25002273' },
52595 { 'rx': '9.5', 'ry': '4.77275007' },
52596 { 'rx': '8.5', 'ry': '4.29549936' },
52597 { 'rx': '7.5', 'ry': '3.81822308' },
52598 { 'rx': '6.5', 'ry': '3.34094679' },
52599 { 'rx': '5.5', 'ry': '2.86367051' },
52600 { 'rx': '4.5', 'ry': '2.38636864' }
52601 ];
52602 for (const data of ellipses) {
52603 const ellipse = DOM.createNS('http://www.w3.org/2000/svg', 'ellipse');
52604 ellipse.setAttributeNS(null, 'opacity', '0.04');
52605 ellipse.setAttributeNS(null, 'cx', '10.5');
52606 ellipse.setAttributeNS(null, 'cy', '5.80029008');
52607 ellipse.setAttributeNS(null, 'rx', data['rx']);
52608 ellipse.setAttributeNS(null, 'ry', data['ry']);
52609 shadow.appendChild(ellipse);
52610 }
52611 const background = DOM.createNS('http://www.w3.org/2000/svg', 'g');
52612 background.setAttributeNS(null, 'fill', this._color);
52613 const bgPath = DOM.createNS('http://www.w3.org/2000/svg', 'path');
52614 bgPath.setAttributeNS(null, 'd', 'M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z');
52615 background.appendChild(bgPath);
52616 const border = DOM.createNS('http://www.w3.org/2000/svg', 'g');
52617 border.setAttributeNS(null, 'opacity', '0.25');
52618 border.setAttributeNS(null, 'fill', '#000000');
52619 const borderPath = DOM.createNS('http://www.w3.org/2000/svg', 'path');
52620 borderPath.setAttributeNS(null, 'd', 'M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z');
52621 border.appendChild(borderPath);
52622 const maki = DOM.createNS('http://www.w3.org/2000/svg', 'g');
52623 maki.setAttributeNS(null, 'transform', 'translate(6.0, 7.0)');
52624 maki.setAttributeNS(null, 'fill', '#FFFFFF');
52625 const circleContainer = DOM.createNS('http://www.w3.org/2000/svg', 'g');
52626 circleContainer.setAttributeNS(null, 'transform', 'translate(8.0, 8.0)');
52627 const circle1 = DOM.createNS('http://www.w3.org/2000/svg', 'circle');
52628 circle1.setAttributeNS(null, 'fill', '#000000');
52629 circle1.setAttributeNS(null, 'opacity', '0.25');
52630 circle1.setAttributeNS(null, 'cx', '5.5');
52631 circle1.setAttributeNS(null, 'cy', '5.5');
52632 circle1.setAttributeNS(null, 'r', '5.4999962');
52633 const circle2 = DOM.createNS('http://www.w3.org/2000/svg', 'circle');
52634 circle2.setAttributeNS(null, 'fill', '#FFFFFF');
52635 circle2.setAttributeNS(null, 'cx', '5.5');
52636 circle2.setAttributeNS(null, 'cy', '5.5');
52637 circle2.setAttributeNS(null, 'r', '5.4999962');
52638 circleContainer.appendChild(circle1);
52639 circleContainer.appendChild(circle2);
52640 page1.appendChild(shadow);
52641 page1.appendChild(background);
52642 page1.appendChild(border);
52643 page1.appendChild(maki);
52644 page1.appendChild(circleContainer);
52645 svg.appendChild(page1);
52646 svg.setAttributeNS(null, 'height', `${defaultHeight * this._scale}px`);
52647 svg.setAttributeNS(null, 'width', `${defaultWidth * this._scale}px`);
52648 this._element.appendChild(svg);
52649 // if no element and no offset option given apply an offset for the default marker
52650 // the -14 as the y value of the default marker offset was determined as follows
52651 //
52652 // the marker tip is at the center of the shadow ellipse from the default svg
52653 // the y value of the center of the shadow ellipse relative to the svg top left is "shadow transform translate-y (29.0) + ellipse cy (5.80029008)"
52654 // offset to the svg center "height (41 / 2)" gives (29.0 + 5.80029008) - (41 / 2) and rounded for an integer pixel offset gives 14
52655 // negative is used to move the marker up from the center so the tip is at the Marker lngLat
52656 this._offset = performance.pointGeometry.convert(options && options.offset || [0, -14]);
52657 }
52658 else {
52659 this._element = options.element;
52660 this._offset = performance.pointGeometry.convert(options && options.offset || [0, 0]);
52661 }
52662 this._element.classList.add('maplibregl-marker', 'mapboxgl-marker');
52663 this._element.addEventListener('dragstart', (e) => {
52664 e.preventDefault();
52665 });
52666 this._element.addEventListener('mousedown', (e) => {
52667 // prevent focusing on click
52668 e.preventDefault();
52669 });
52670 applyAnchorClass(this._element, this._anchor, 'marker');
52671 this._popup = null;
52672 }
52673 /**
52674 * Attaches the `Marker` to a `Map` object.
52675 * @param {Map} map The MapLibre GL JS map to add the marker to.
52676 * @returns {Marker} `this`
52677 * @example
52678 * var marker = new maplibregl.Marker()
52679 * .setLngLat([30.5, 50.5])
52680 * .addTo(map); // add the marker to the map
52681 */
52682 addTo(map) {
52683 this.remove();
52684 this._map = map;
52685 map.getCanvasContainer().appendChild(this._element);
52686 map.on('move', this._update);
52687 map.on('moveend', this._update);
52688 this.setDraggable(this._draggable);
52689 this._update();
52690 // If we attached the `click` listener to the marker element, the popup
52691 // would close once the event propogated to `map` due to the
52692 // `Popup#_onClickClose` listener.
52693 this._map.on('click', this._onMapClick);
52694 return this;
52695 }
52696 /**
52697 * Removes the marker from a map
52698 * @example
52699 * var marker = new maplibregl.Marker().addTo(map);
52700 * marker.remove();
52701 * @returns {Marker} `this`
52702 */
52703 remove() {
52704 if (this._map) {
52705 this._map.off('click', this._onMapClick);
52706 this._map.off('move', this._update);
52707 this._map.off('moveend', this._update);
52708 this._map.off('mousedown', this._addDragHandler);
52709 this._map.off('touchstart', this._addDragHandler);
52710 this._map.off('mouseup', this._onUp);
52711 this._map.off('touchend', this._onUp);
52712 this._map.off('mousemove', this._onMove);
52713 this._map.off('touchmove', this._onMove);
52714 delete this._map;
52715 }
52716 DOM.remove(this._element);
52717 if (this._popup)
52718 this._popup.remove();
52719 return this;
52720 }
52721 /**
52722 * Get the marker's geographical location.
52723 *
52724 * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously
52725 * set by `setLngLat` because `Marker` wraps the anchor longitude across copies of the world to keep
52726 * the marker on screen.
52727 *
52728 * @returns {LngLat} A {@link LngLat} describing the marker's location.
52729 * @example
52730 * // Store the marker's longitude and latitude coordinates in a variable
52731 * var lngLat = marker.getLngLat();
52732 * // Print the marker's longitude and latitude values in the console
52733 * console.log('Longitude: ' + lngLat.lng + ', Latitude: ' + lngLat.lat )
52734 * @see [Create a draggable Marker](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-marker/)
52735 */
52736 getLngLat() {
52737 return this._lngLat;
52738 }
52739 /**
52740 * Set the marker's geographical position and move it.
52741 * @param {LngLat} lnglat A {@link LngLat} describing where the marker should be located.
52742 * @returns {Marker} `this`
52743 * @example
52744 * // Create a new marker, set the longitude and latitude, and add it to the map
52745 * new maplibregl.Marker()
52746 * .setLngLat([-65.017, -16.457])
52747 * .addTo(map);
52748 * @see [Add custom icons with Markers](https://maplibre.org/maplibre-gl-js-docs/example/custom-marker-icons/)
52749 * @see [Create a draggable Marker](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-marker/)
52750 */
52751 setLngLat(lnglat) {
52752 this._lngLat = performance.LngLat.convert(lnglat);
52753 this._pos = null;
52754 if (this._popup)
52755 this._popup.setLngLat(this._lngLat);
52756 this._update();
52757 return this;
52758 }
52759 /**
52760 * Returns the `Marker`'s HTML element.
52761 * @returns {HTMLElement} element
52762 */
52763 getElement() {
52764 return this._element;
52765 }
52766 /**
52767 * Binds a {@link Popup} to the {@link Marker}.
52768 * @param popup An instance of the {@link Popup} class. If undefined or null, any popup
52769 * set on this {@link Marker} instance is unset.
52770 * @returns {Marker} `this`
52771 * @example
52772 * var marker = new maplibregl.Marker()
52773 * .setLngLat([0, 0])
52774 * .setPopup(new maplibregl.Popup().setHTML("<h1>Hello World!</h1>")) // add popup
52775 * .addTo(map);
52776 * @see [Attach a popup to a marker instance](https://maplibre.org/maplibre-gl-js-docs/example/set-popup/)
52777 */
52778 setPopup(popup) {
52779 if (this._popup) {
52780 this._popup.remove();
52781 this._popup = null;
52782 this._element.removeEventListener('keypress', this._onKeyPress);
52783 if (!this._originalTabIndex) {
52784 this._element.removeAttribute('tabindex');
52785 }
52786 }
52787 if (popup) {
52788 if (!('offset' in popup.options)) {
52789 const markerHeight = 41 - (5.8 / 2);
52790 const markerRadius = 13.5;
52791 const linearOffset = Math.sqrt(Math.pow(markerRadius, 2) / 2);
52792 popup.options.offset = this._defaultMarker ? {
52793 'top': [0, 0],
52794 'top-left': [0, 0],
52795 'top-right': [0, 0],
52796 'bottom': [0, -markerHeight],
52797 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1],
52798 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1],
52799 'left': [markerRadius, (markerHeight - markerRadius) * -1],
52800 'right': [-markerRadius, (markerHeight - markerRadius) * -1]
52801 } : this._offset;
52802 }
52803 this._popup = popup;
52804 if (this._lngLat)
52805 this._popup.setLngLat(this._lngLat);
52806 this._originalTabIndex = this._element.getAttribute('tabindex');
52807 if (!this._originalTabIndex) {
52808 this._element.setAttribute('tabindex', '0');
52809 }
52810 this._element.addEventListener('keypress', this._onKeyPress);
52811 }
52812 return this;
52813 }
52814 _onKeyPress(e) {
52815 const code = e.code;
52816 const legacyCode = e.charCode || e.keyCode;
52817 if ((code === 'Space') || (code === 'Enter') ||
52818 (legacyCode === 32) || (legacyCode === 13) // space or enter
52819 ) {
52820 this.togglePopup();
52821 }
52822 }
52823 _onMapClick(e) {
52824 const targetElement = e.originalEvent.target;
52825 const element = this._element;
52826 if (this._popup && (targetElement === element || element.contains(targetElement))) {
52827 this.togglePopup();
52828 }
52829 }
52830 /**
52831 * Returns the {@link Popup} instance that is bound to the {@link Marker}.
52832 * @returns {Popup} popup
52833 * @example
52834 * var marker = new maplibregl.Marker()
52835 * .setLngLat([0, 0])
52836 * .setPopup(new maplibregl.Popup().setHTML("<h1>Hello World!</h1>"))
52837 * .addTo(map);
52838 *
52839 * console.log(marker.getPopup()); // return the popup instance
52840 */
52841 getPopup() {
52842 return this._popup;
52843 }
52844 /**
52845 * Opens or closes the {@link Popup} instance that is bound to the {@link Marker}, depending on the current state of the {@link Popup}.
52846 * @returns {Marker} `this`
52847 * @example
52848 * var marker = new maplibregl.Marker()
52849 * .setLngLat([0, 0])
52850 * .setPopup(new maplibregl.Popup().setHTML("<h1>Hello World!</h1>"))
52851 * .addTo(map);
52852 *
52853 * marker.togglePopup(); // toggle popup open or closed
52854 */
52855 togglePopup() {
52856 const popup = this._popup;
52857 if (!popup)
52858 return this;
52859 else if (popup.isOpen())
52860 popup.remove();
52861 else
52862 popup.addTo(this._map);
52863 return this;
52864 }
52865 _update(e) {
52866 if (!this._map)
52867 return;
52868 if (this._map.transform.renderWorldCopies) {
52869 this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform);
52870 }
52871 this._pos = this._map.project(this._lngLat)._add(this._offset);
52872 let rotation = '';
52873 if (this._rotationAlignment === 'viewport' || this._rotationAlignment === 'auto') {
52874 rotation = `rotateZ(${this._rotation}deg)`;
52875 }
52876 else if (this._rotationAlignment === 'map') {
52877 rotation = `rotateZ(${this._rotation - this._map.getBearing()}deg)`;
52878 }
52879 let pitch = '';
52880 if (this._pitchAlignment === 'viewport' || this._pitchAlignment === 'auto') {
52881 pitch = 'rotateX(0deg)';
52882 }
52883 else if (this._pitchAlignment === 'map') {
52884 pitch = `rotateX(${this._map.getPitch()}deg)`;
52885 }
52886 // because rounding the coordinates at every `move` event causes stuttered zooming
52887 // we only round them when _update is called with `moveend` or when its called with
52888 // no arguments (when the Marker is initialized or Marker#setLngLat is invoked).
52889 if (!e || e.type === 'moveend') {
52890 this._pos = this._pos.round();
52891 }
52892 DOM.setTransform(this._element, `${anchorTranslate[this._anchor]} translate(${this._pos.x}px, ${this._pos.y}px) ${pitch} ${rotation}`);
52893 }
52894 /**
52895 * Get the marker's offset.
52896 * @returns {Point} The marker's screen coordinates in pixels.
52897 */
52898 getOffset() {
52899 return this._offset;
52900 }
52901 /**
52902 * Sets the offset of the marker
52903 * @param {PointLike} offset The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up.
52904 * @returns {Marker} `this`
52905 */
52906 setOffset(offset) {
52907 this._offset = performance.pointGeometry.convert(offset);
52908 this._update();
52909 return this;
52910 }
52911 _onMove(e) {
52912 if (!this._isDragging) {
52913 const clickTolerance = this._clickTolerance || this._map._clickTolerance;
52914 this._isDragging = e.point.dist(this._pointerdownPos) >= clickTolerance;
52915 }
52916 if (!this._isDragging)
52917 return;
52918 this._pos = e.point.sub(this._positionDelta);
52919 this._lngLat = this._map.unproject(this._pos);
52920 this.setLngLat(this._lngLat);
52921 // suppress click event so that popups don't toggle on drag
52922 this._element.style.pointerEvents = 'none';
52923 // make sure dragstart only fires on the first move event after mousedown.
52924 // this can't be on mousedown because that event doesn't necessarily
52925 // imply that a drag is about to happen.
52926 if (this._state === 'pending') {
52927 this._state = 'active';
52928 /**
52929 * Fired when dragging starts
52930 *
52931 * @event dragstart
52932 * @memberof Marker
52933 * @instance
52934 * @type {Object}
52935 * @property {Marker} marker object that is being dragged
52936 */
52937 this.fire(new performance.Event('dragstart'));
52938 }
52939 /**
52940 * Fired while dragging
52941 *
52942 * @event drag
52943 * @memberof Marker
52944 * @instance
52945 * @type {Object}
52946 * @property {Marker} marker object that is being dragged
52947 */
52948 this.fire(new performance.Event('drag'));
52949 }
52950 _onUp() {
52951 // revert to normal pointer event handling
52952 this._element.style.pointerEvents = 'auto';
52953 this._positionDelta = null;
52954 this._pointerdownPos = null;
52955 this._isDragging = false;
52956 this._map.off('mousemove', this._onMove);
52957 this._map.off('touchmove', this._onMove);
52958 // only fire dragend if it was preceded by at least one drag event
52959 if (this._state === 'active') {
52960 /**
52961 * Fired when the marker is finished being dragged
52962 *
52963 * @event dragend
52964 * @memberof Marker
52965 * @instance
52966 * @type {Object}
52967 * @property {Marker} marker object that was dragged
52968 */
52969 this.fire(new performance.Event('dragend'));
52970 }
52971 this._state = 'inactive';
52972 }
52973 _addDragHandler(e) {
52974 if (this._element.contains(e.originalEvent.target)) {
52975 e.preventDefault();
52976 // We need to calculate the pixel distance between the click point
52977 // and the marker position, with the offset accounted for. Then we
52978 // can subtract this distance from the mousemove event's position
52979 // to calculate the new marker position.
52980 // If we don't do this, the marker 'jumps' to the click position
52981 // creating a jarring UX effect.
52982 this._positionDelta = e.point.sub(this._pos).add(this._offset);
52983 this._pointerdownPos = e.point;
52984 this._state = 'pending';
52985 this._map.on('mousemove', this._onMove);
52986 this._map.on('touchmove', this._onMove);
52987 this._map.once('mouseup', this._onUp);
52988 this._map.once('touchend', this._onUp);
52989 }
52990 }
52991 /**
52992 * Sets the `draggable` property and functionality of the marker
52993 * @param {boolean} [shouldBeDraggable=false] Turns drag functionality on/off
52994 * @returns {Marker} `this`
52995 */
52996 setDraggable(shouldBeDraggable) {
52997 this._draggable = !!shouldBeDraggable; // convert possible undefined value to false
52998 // handle case where map may not exist yet
52999 // e.g. when setDraggable is called before addTo
53000 if (this._map) {
53001 if (shouldBeDraggable) {
53002 this._map.on('mousedown', this._addDragHandler);
53003 this._map.on('touchstart', this._addDragHandler);
53004 }
53005 else {
53006 this._map.off('mousedown', this._addDragHandler);
53007 this._map.off('touchstart', this._addDragHandler);
53008 }
53009 }
53010 return this;
53011 }
53012 /**
53013 * Returns true if the marker can be dragged
53014 * @returns {boolean} True if the marker is draggable.
53015 */
53016 isDraggable() {
53017 return this._draggable;
53018 }
53019 /**
53020 * Sets the `rotation` property of the marker.
53021 * @param {number} [rotation=0] The rotation angle of the marker (clockwise, in degrees), relative to its respective {@link Marker#setRotationAlignment} setting.
53022 * @returns {Marker} `this`
53023 */
53024 setRotation(rotation) {
53025 this._rotation = rotation || 0;
53026 this._update();
53027 return this;
53028 }
53029 /**
53030 * Returns the current rotation angle of the marker (in degrees).
53031 * @returns {number} The current rotation angle of the marker.
53032 */
53033 getRotation() {
53034 return this._rotation;
53035 }
53036 /**
53037 * Sets the `rotationAlignment` property of the marker.
53038 * @param {string} [alignment='auto'] Sets the `rotationAlignment` property of the marker.
53039 * @returns {Marker} `this`
53040 */
53041 setRotationAlignment(alignment) {
53042 this._rotationAlignment = alignment || 'auto';
53043 this._update();
53044 return this;
53045 }
53046 /**
53047 * Returns the current `rotationAlignment` property of the marker.
53048 * @returns {string} The current rotational alignment of the marker.
53049 */
53050 getRotationAlignment() {
53051 return this._rotationAlignment;
53052 }
53053 /**
53054 * Sets the `pitchAlignment` property of the marker.
53055 * @param {string} [alignment] Sets the `pitchAlignment` property of the marker. If alignment is 'auto', it will automatically match `rotationAlignment`.
53056 * @returns {Marker} `this`
53057 */
53058 setPitchAlignment(alignment) {
53059 this._pitchAlignment = alignment && alignment !== 'auto' ? alignment : this._rotationAlignment;
53060 this._update();
53061 return this;
53062 }
53063 /**
53064 * Returns the current `pitchAlignment` property of the marker.
53065 * @returns {string} The current pitch alignment of the marker in degrees.
53066 */
53067 getPitchAlignment() {
53068 return this._pitchAlignment;
53069 }
53070}
53071
53072const defaultOptions$2 = {
53073 positionOptions: {
53074 enableHighAccuracy: false,
53075 maximumAge: 0,
53076 timeout: 6000 /* 6 sec */
53077 },
53078 fitBoundsOptions: {
53079 maxZoom: 15
53080 },
53081 trackUserLocation: false,
53082 showAccuracyCircle: true,
53083 showUserLocation: true
53084};
53085let supportsGeolocation;
53086function checkGeolocationSupport(callback) {
53087 if (supportsGeolocation !== undefined) {
53088 callback(supportsGeolocation);
53089 }
53090 else if (window.navigator.permissions !== undefined) {
53091 // navigator.permissions has incomplete browser support
53092 // http://caniuse.com/#feat=permissions-api
53093 // Test for the case where a browser disables Geolocation because of an
53094 // insecure origin
53095 window.navigator.permissions.query({ name: 'geolocation' }).then((p) => {
53096 supportsGeolocation = p.state !== 'denied';
53097 callback(supportsGeolocation);
53098 });
53099 }
53100 else {
53101 supportsGeolocation = !!window.navigator.geolocation;
53102 callback(supportsGeolocation);
53103 }
53104}
53105let numberOfWatches = 0;
53106let noTimeout = false;
53107/**
53108 * A `GeolocateControl` control provides a button that uses the browser's geolocation
53109 * API to locate the user on the map.
53110 *
53111 * Not all browsers support geolocation,
53112 * and some users may disable the feature. Geolocation support for modern
53113 * browsers including Chrome requires sites to be served over HTTPS. If
53114 * geolocation support is not available, the GeolocateControl will show
53115 * as disabled.
53116 *
53117 * The zoom level applied will depend on the accuracy of the geolocation provided by the device.
53118 *
53119 * The GeolocateControl has two modes. If `trackUserLocation` is `false` (default) the control acts as a button, which when pressed will set the map's camera to target the user location. If the user moves, the map won't update. This is most suited for the desktop. If `trackUserLocation` is `true` the control acts as a toggle button that when active the user's location is actively monitored for changes. In this mode the GeolocateControl has three interaction states:
53120 * * active - the map's camera automatically updates as the user's location changes, keeping the location dot in the center. Initial state and upon clicking the `GeolocateControl` button.
53121 * * passive - the user's location dot automatically updates, but the map's camera does not. Occurs upon the user initiating a map movement.
53122 * * disabled - occurs if Geolocation is not available, disabled or denied.
53123 *
53124 * These interaction states can't be controlled programmatically, rather they are set based on user interactions.
53125 *
53126 * @implements {IControl}
53127 * @param {Object} [options]
53128 * @param {Object} [options.positionOptions={enableHighAccuracy: false, timeout: 6000}] A Geolocation API [PositionOptions](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions) object.
53129 * @param {Object} [options.fitBoundsOptions={maxZoom: 15}] A {@link Map#fitBounds} options object to use when the map is panned and zoomed to the user's location. The default is to use a `maxZoom` of 15 to limit how far the map will zoom in for very accurate locations.
53130 * @param {Object} [options.trackUserLocation=false] If `true` the Geolocate Control becomes a toggle button and when active the map will receive updates to the user's location as it changes.
53131 * @param {Object} [options.showAccuracyCircle=true] By default, if showUserLocation is `true`, a transparent circle will be drawn around the user location indicating the accuracy (95% confidence level) of the user's location. Set to `false` to disable. Always disabled when showUserLocation is `false`.
53132 * @param {Object} [options.showUserLocation=true] By default a dot will be shown on the map at the user's location. Set to `false` to disable.
53133 *
53134 * @example
53135 * map.addControl(new maplibregl.GeolocateControl({
53136 * positionOptions: {
53137 * enableHighAccuracy: true
53138 * },
53139 * trackUserLocation: true
53140 * }));
53141 * @see [Locate the user](https://maplibre.org/maplibre-gl-js-docs/example/locate-user/)
53142 */
53143class GeolocateControl extends performance.Evented {
53144 constructor(options) {
53145 super();
53146 this.options = performance.extend({}, defaultOptions$2, options);
53147 performance.bindAll([
53148 '_onSuccess',
53149 '_onError',
53150 '_onZoom',
53151 '_finish',
53152 '_setupUI',
53153 '_updateCamera',
53154 '_updateMarker'
53155 ], this);
53156 }
53157 onAdd(map) {
53158 this._map = map;
53159 this._container = DOM.create('div', 'maplibregl-ctrl maplibregl-ctrl-group mapboxgl-ctrl mapboxgl-ctrl-group');
53160 checkGeolocationSupport(this._setupUI);
53161 return this._container;
53162 }
53163 onRemove() {
53164 // clear the geolocation watch if exists
53165 if (this._geolocationWatchID !== undefined) {
53166 window.navigator.geolocation.clearWatch(this._geolocationWatchID);
53167 this._geolocationWatchID = undefined;
53168 }
53169 // clear the markers from the map
53170 if (this.options.showUserLocation && this._userLocationDotMarker) {
53171 this._userLocationDotMarker.remove();
53172 }
53173 if (this.options.showAccuracyCircle && this._accuracyCircleMarker) {
53174 this._accuracyCircleMarker.remove();
53175 }
53176 DOM.remove(this._container);
53177 this._map.off('zoom', this._onZoom);
53178 this._map = undefined;
53179 numberOfWatches = 0;
53180 noTimeout = false;
53181 }
53182 /**
53183 * Check if the Geolocation API Position is outside the map's maxbounds.
53184 *
53185 * @param {Position} position the Geolocation API Position
53186 * @returns {boolean} Returns `true` if position is outside the map's maxbounds, otherwise returns `false`.
53187 * @private
53188 */
53189 _isOutOfMapMaxBounds(position) {
53190 const bounds = this._map.getMaxBounds();
53191 const coordinates = position.coords;
53192 return bounds && (coordinates.longitude < bounds.getWest() ||
53193 coordinates.longitude > bounds.getEast() ||
53194 coordinates.latitude < bounds.getSouth() ||
53195 coordinates.latitude > bounds.getNorth());
53196 }
53197 _setErrorState() {
53198 switch (this._watchState) {
53199 case 'WAITING_ACTIVE':
53200 this._watchState = 'ACTIVE_ERROR';
53201 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
53202 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-active-error', 'mapboxgl-ctrl-geolocate-active-error');
53203 break;
53204 case 'ACTIVE_LOCK':
53205 this._watchState = 'ACTIVE_ERROR';
53206 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
53207 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-active-error', 'mapboxgl-ctrl-geolocate-active-error');
53208 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
53209 // turn marker grey
53210 break;
53211 case 'BACKGROUND':
53212 this._watchState = 'BACKGROUND_ERROR';
53213 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
53214 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-background-error', 'mapboxgl-ctrl-geolocate-background-error');
53215 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
53216 // turn marker grey
53217 break;
53218 case 'ACTIVE_ERROR':
53219 break;
53220 default:
53221 performance.assert(false, `Unexpected watchState ${this._watchState}`);
53222 }
53223 }
53224 /**
53225 * When the Geolocation API returns a new location, update the GeolocateControl.
53226 *
53227 * @param {Position} position the Geolocation API Position
53228 * @private
53229 */
53230 _onSuccess(position) {
53231 if (!this._map) {
53232 // control has since been removed
53233 return;
53234 }
53235 if (this._isOutOfMapMaxBounds(position)) {
53236 this._setErrorState();
53237 this.fire(new performance.Event('outofmaxbounds', position));
53238 this._updateMarker();
53239 this._finish();
53240 return;
53241 }
53242 if (this.options.trackUserLocation) {
53243 // keep a record of the position so that if the state is BACKGROUND and the user
53244 // clicks the button, we can move to ACTIVE_LOCK immediately without waiting for
53245 // watchPosition to trigger _onSuccess
53246 this._lastKnownPosition = position;
53247 switch (this._watchState) {
53248 case 'WAITING_ACTIVE':
53249 case 'ACTIVE_LOCK':
53250 case 'ACTIVE_ERROR':
53251 this._watchState = 'ACTIVE_LOCK';
53252 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
53253 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active-error', 'mapboxgl-ctrl-geolocate-active-error');
53254 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
53255 break;
53256 case 'BACKGROUND':
53257 case 'BACKGROUND_ERROR':
53258 this._watchState = 'BACKGROUND';
53259 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
53260 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background-error', 'mapboxgl-ctrl-geolocate-background-error');
53261 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
53262 break;
53263 default:
53264 performance.assert(false, `Unexpected watchState ${this._watchState}`);
53265 }
53266 }
53267 // if showUserLocation and the watch state isn't off then update the marker location
53268 if (this.options.showUserLocation && this._watchState !== 'OFF') {
53269 this._updateMarker(position);
53270 }
53271 // if in normal mode (not watch mode), or if in watch mode and the state is active watch
53272 // then update the camera
53273 if (!this.options.trackUserLocation || this._watchState === 'ACTIVE_LOCK') {
53274 this._updateCamera(position);
53275 }
53276 if (this.options.showUserLocation) {
53277 this._dotElement.classList.remove('maplibregl-user-location-dot-stale', 'mapboxgl-user-location-dot-stale');
53278 }
53279 this.fire(new performance.Event('geolocate', position));
53280 this._finish();
53281 }
53282 /**
53283 * Update the camera location to center on the current position
53284 *
53285 * @param {Position} position the Geolocation API Position
53286 * @private
53287 */
53288 _updateCamera(position) {
53289 const center = new performance.LngLat(position.coords.longitude, position.coords.latitude);
53290 const radius = position.coords.accuracy;
53291 const bearing = this._map.getBearing();
53292 const options = performance.extend({ bearing }, this.options.fitBoundsOptions);
53293 this._map.fitBounds(center.toBounds(radius), options, {
53294 geolocateSource: true // tag this camera change so it won't cause the control to change to background state
53295 });
53296 }
53297 /**
53298 * Update the user location dot Marker to the current position
53299 *
53300 * @param {Position} [position] the Geolocation API Position
53301 * @private
53302 */
53303 _updateMarker(position) {
53304 if (position) {
53305 const center = new performance.LngLat(position.coords.longitude, position.coords.latitude);
53306 this._accuracyCircleMarker.setLngLat(center).addTo(this._map);
53307 this._userLocationDotMarker.setLngLat(center).addTo(this._map);
53308 this._accuracy = position.coords.accuracy;
53309 if (this.options.showUserLocation && this.options.showAccuracyCircle) {
53310 this._updateCircleRadius();
53311 }
53312 }
53313 else {
53314 this._userLocationDotMarker.remove();
53315 this._accuracyCircleMarker.remove();
53316 }
53317 }
53318 _updateCircleRadius() {
53319 performance.assert(this._circleElement);
53320 const y = this._map._container.clientHeight / 2;
53321 const a = this._map.unproject([0, y]);
53322 const b = this._map.unproject([1, y]);
53323 const metersPerPixel = a.distanceTo(b);
53324 const circleDiameter = Math.ceil(2.0 * this._accuracy / metersPerPixel);
53325 this._circleElement.style.width = `${circleDiameter}px`;
53326 this._circleElement.style.height = `${circleDiameter}px`;
53327 }
53328 _onZoom() {
53329 if (this.options.showUserLocation && this.options.showAccuracyCircle) {
53330 this._updateCircleRadius();
53331 }
53332 }
53333 _onError(error) {
53334 if (!this._map) {
53335 // control has since been removed
53336 return;
53337 }
53338 if (this.options.trackUserLocation) {
53339 if (error.code === 1) {
53340 // PERMISSION_DENIED
53341 this._watchState = 'OFF';
53342 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
53343 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
53344 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active-error', 'mapboxgl-ctrl-geolocate-active-error');
53345 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
53346 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background-error', 'mapboxgl-ctrl-geolocate-background-error');
53347 this._geolocateButton.disabled = true;
53348 const title = this._map._getUIString('GeolocateControl.LocationNotAvailable');
53349 this._geolocateButton.title = title;
53350 this._geolocateButton.setAttribute('aria-label', title);
53351 if (this._geolocationWatchID !== undefined) {
53352 this._clearWatch();
53353 }
53354 }
53355 else if (error.code === 3 && noTimeout) {
53356 // this represents a forced error state
53357 // this was triggered to force immediate geolocation when a watch is already present
53358 // see https://github.com/mapbox/mapbox-gl-js/issues/8214
53359 // and https://w3c.github.io/geolocation-api/#example-5-forcing-the-user-agent-to-return-a-fresh-cached-position
53360 return;
53361 }
53362 else {
53363 this._setErrorState();
53364 }
53365 }
53366 if (this._watchState !== 'OFF' && this.options.showUserLocation) {
53367 this._dotElement.classList.add('maplibregl-user-location-dot-stale', 'mapboxgl-user-location-dot-stale');
53368 }
53369 this.fire(new performance.Event('error', error));
53370 this._finish();
53371 }
53372 _finish() {
53373 if (this._timeoutId) {
53374 clearTimeout(this._timeoutId);
53375 }
53376 this._timeoutId = undefined;
53377 }
53378 _setupUI(supported) {
53379 this._container.addEventListener('contextmenu', (e) => e.preventDefault());
53380 this._geolocateButton = DOM.create('button', 'maplibregl-ctrl-geolocate mapboxgl-ctrl-geolocate', this._container);
53381 DOM.create('span', 'maplibregl-ctrl-icon mapboxgl-ctrl-icon', this._geolocateButton).setAttribute('aria-hidden', 'true');
53382 this._geolocateButton.type = 'button';
53383 if (supported === false) {
53384 performance.warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.');
53385 const title = this._map._getUIString('GeolocateControl.LocationNotAvailable');
53386 this._geolocateButton.disabled = true;
53387 this._geolocateButton.title = title;
53388 this._geolocateButton.setAttribute('aria-label', title);
53389 }
53390 else {
53391 const title = this._map._getUIString('GeolocateControl.FindMyLocation');
53392 this._geolocateButton.title = title;
53393 this._geolocateButton.setAttribute('aria-label', title);
53394 }
53395 if (this.options.trackUserLocation) {
53396 this._geolocateButton.setAttribute('aria-pressed', 'false');
53397 this._watchState = 'OFF';
53398 }
53399 // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map
53400 if (this.options.showUserLocation) {
53401 this._dotElement = DOM.create('div', 'maplibregl-user-location-dot mapboxgl-user-location-dot');
53402 this._userLocationDotMarker = new Marker(this._dotElement);
53403 this._circleElement = DOM.create('div', 'maplibregl-user-location-accuracy-circle mapboxgl-user-location-accuracy-circle');
53404 this._accuracyCircleMarker = new Marker({ element: this._circleElement, pitchAlignment: 'map' });
53405 if (this.options.trackUserLocation)
53406 this._watchState = 'OFF';
53407 this._map.on('zoom', this._onZoom);
53408 }
53409 this._geolocateButton.addEventListener('click', this.trigger.bind(this));
53410 this._setup = true;
53411 // when the camera is changed (and it's not as a result of the Geolocation Control) change
53412 // the watch mode to background watch, so that the marker is updated but not the camera.
53413 if (this.options.trackUserLocation) {
53414 this._map.on('movestart', (event) => {
53415 const fromResize = event.originalEvent && event.originalEvent.type === 'resize';
53416 if (!event.geolocateSource && this._watchState === 'ACTIVE_LOCK' && !fromResize) {
53417 this._watchState = 'BACKGROUND';
53418 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
53419 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
53420 this.fire(new performance.Event('trackuserlocationend'));
53421 }
53422 });
53423 }
53424 }
53425 /**
53426 * Programmatically request and move the map to the user's location.
53427 *
53428 * @returns {boolean} Returns `false` if called before control was added to a map, otherwise returns `true`.
53429 * @example
53430 * // Initialize the geolocate control.
53431 * var geolocate = new maplibregl.GeolocateControl({
53432 * positionOptions: {
53433 * enableHighAccuracy: true
53434 * },
53435 * trackUserLocation: true
53436 * });
53437 * // Add the control to the map.
53438 * map.addControl(geolocate);
53439 * map.on('load', function() {
53440 * geolocate.trigger();
53441 * });
53442 */
53443 trigger() {
53444 if (!this._setup) {
53445 performance.warnOnce('Geolocate control triggered before added to a map');
53446 return false;
53447 }
53448 if (this.options.trackUserLocation) {
53449 // update watchState and do any outgoing state cleanup
53450 switch (this._watchState) {
53451 case 'OFF':
53452 // turn on the Geolocate Control
53453 this._watchState = 'WAITING_ACTIVE';
53454 this.fire(new performance.Event('trackuserlocationstart'));
53455 break;
53456 case 'WAITING_ACTIVE':
53457 case 'ACTIVE_LOCK':
53458 case 'ACTIVE_ERROR':
53459 case 'BACKGROUND_ERROR':
53460 // turn off the Geolocate Control
53461 numberOfWatches--;
53462 noTimeout = false;
53463 this._watchState = 'OFF';
53464 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
53465 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
53466 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active-error', 'mapboxgl-ctrl-geolocate-active-error');
53467 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
53468 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background-error', 'mapboxgl-ctrl-geolocate-background-error');
53469 this.fire(new performance.Event('trackuserlocationend'));
53470 break;
53471 case 'BACKGROUND':
53472 this._watchState = 'ACTIVE_LOCK';
53473 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
53474 // set camera to last known location
53475 if (this._lastKnownPosition)
53476 this._updateCamera(this._lastKnownPosition);
53477 this.fire(new performance.Event('trackuserlocationstart'));
53478 break;
53479 default:
53480 performance.assert(false, `Unexpected watchState ${this._watchState}`);
53481 }
53482 // incoming state setup
53483 switch (this._watchState) {
53484 case 'WAITING_ACTIVE':
53485 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
53486 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
53487 break;
53488 case 'ACTIVE_LOCK':
53489 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
53490 break;
53491 case 'OFF':
53492 break;
53493 default:
53494 performance.assert(false, `Unexpected watchState ${this._watchState}`);
53495 }
53496 // manage geolocation.watchPosition / geolocation.clearWatch
53497 if (this._watchState === 'OFF' && this._geolocationWatchID !== undefined) {
53498 // clear watchPosition as we've changed to an OFF state
53499 this._clearWatch();
53500 }
53501 else if (this._geolocationWatchID === undefined) {
53502 // enable watchPosition since watchState is not OFF and there is no watchPosition already running
53503 this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
53504 this._geolocateButton.setAttribute('aria-pressed', 'true');
53505 numberOfWatches++;
53506 let positionOptions;
53507 if (numberOfWatches > 1) {
53508 positionOptions = { maximumAge: 600000, timeout: 0 };
53509 noTimeout = true;
53510 }
53511 else {
53512 positionOptions = this.options.positionOptions;
53513 noTimeout = false;
53514 }
53515 this._geolocationWatchID = window.navigator.geolocation.watchPosition(this._onSuccess, this._onError, positionOptions);
53516 }
53517 }
53518 else {
53519 window.navigator.geolocation.getCurrentPosition(this._onSuccess, this._onError, this.options.positionOptions);
53520 // This timeout ensures that we still call finish() even if
53521 // the user declines to share their location in Firefox
53522 this._timeoutId = setTimeout(this._finish, 10000 /* 10sec */);
53523 }
53524 return true;
53525 }
53526 _clearWatch() {
53527 window.navigator.geolocation.clearWatch(this._geolocationWatchID);
53528 this._geolocationWatchID = undefined;
53529 this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
53530 this._geolocateButton.setAttribute('aria-pressed', 'false');
53531 if (this.options.showUserLocation) {
53532 this._updateMarker(null);
53533 }
53534 }
53535}
53536/* Geolocate Control Watch States
53537 * This is the private state of the control.
53538 *
53539 * OFF
53540 * off/inactive
53541 * WAITING_ACTIVE
53542 * Geolocate Control was clicked but still waiting for Geolocation API response with user location
53543 * ACTIVE_LOCK
53544 * Showing the user location as a dot AND tracking the camera to be fixed to their location. If their location changes the map moves to follow.
53545 * ACTIVE_ERROR
53546 * There was en error from the Geolocation API while trying to show and track the user location.
53547 * BACKGROUND
53548 * Showing the user location as a dot but the camera doesn't follow their location as it changes.
53549 * BACKGROUND_ERROR
53550 * There was an error from the Geolocation API while trying to show (but not track) the user location.
53551 */
53552/**
53553 * Fired on each Geolocation API position update which returned as success.
53554 *
53555 * @event geolocate
53556 * @memberof GeolocateControl
53557 * @instance
53558 * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition).
53559 * @example
53560 * // Initialize the geolocate control.
53561 * var geolocate = new maplibregl.GeolocateControl({
53562 * positionOptions: {
53563 * enableHighAccuracy: true
53564 * },
53565 * trackUserLocation: true
53566 * });
53567 * // Add the control to the map.
53568 * map.addControl(geolocate);
53569 * // Set an event listener that fires
53570 * // when a geolocate event occurs.
53571 * geolocate.on('geolocate', function() {
53572 * console.log('A geolocate event has occurred.')
53573 * });
53574 *
53575 */
53576/**
53577 * Fired on each Geolocation API position update which returned as an error.
53578 *
53579 * @event error
53580 * @memberof GeolocateControl
53581 * @instance
53582 * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition).
53583 * @example
53584 * // Initialize the geolocate control.
53585 * var geolocate = new maplibregl.GeolocateControl({
53586 * positionOptions: {
53587 * enableHighAccuracy: true
53588 * },
53589 * trackUserLocation: true
53590 * });
53591 * // Add the control to the map.
53592 * map.addControl(geolocate);
53593 * // Set an event listener that fires
53594 * // when an error event occurs.
53595 * geolocate.on('error', function() {
53596 * console.log('An error event has occurred.')
53597 * });
53598 *
53599 */
53600/**
53601 * Fired on each Geolocation API position update which returned as success but user position is out of map maxBounds.
53602 *
53603 * @event outofmaxbounds
53604 * @memberof GeolocateControl
53605 * @instance
53606 * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition).
53607 * @example
53608 * // Initialize the geolocate control.
53609 * var geolocate = new maplibregl.GeolocateControl({
53610 * positionOptions: {
53611 * enableHighAccuracy: true
53612 * },
53613 * trackUserLocation: true
53614 * });
53615 * // Add the control to the map.
53616 * map.addControl(geolocate);
53617 * // Set an event listener that fires
53618 * // when an outofmaxbounds event occurs.
53619 * geolocate.on('outofmaxbounds', function() {
53620 * console.log('An outofmaxbounds event has occurred.')
53621 * });
53622 *
53623 */
53624/**
53625 * Fired when the Geolocate Control changes to the active lock state, which happens either upon first obtaining a successful Geolocation API position for the user (a geolocate event will follow), or the user clicks the geolocate button when in the background state which uses the last known position to recenter the map and enter active lock state (no geolocate event will follow unless the users's location changes).
53626 *
53627 * @event trackuserlocationstart
53628 * @memberof GeolocateControl
53629 * @instance
53630 * @example
53631 * // Initialize the geolocate control.
53632 * var geolocate = new maplibregl.GeolocateControl({
53633 * positionOptions: {
53634 * enableHighAccuracy: true
53635 * },
53636 * trackUserLocation: true
53637 * });
53638 * // Add the control to the map.
53639 * map.addControl(geolocate);
53640 * // Set an event listener that fires
53641 * // when a trackuserlocationstart event occurs.
53642 * geolocate.on('trackuserlocationstart', function() {
53643 * console.log('A trackuserlocationstart event has occurred.')
53644 * });
53645 *
53646 */
53647/**
53648 * Fired when the Geolocate Control changes to the background state, which happens when a user changes the camera during an active position lock. This only applies when trackUserLocation is true. In the background state, the dot on the map will update with location updates but the camera will not.
53649 *
53650 * @event trackuserlocationend
53651 * @memberof GeolocateControl
53652 * @instance
53653 * @example
53654 * // Initialize the geolocate control.
53655 * var geolocate = new maplibregl.GeolocateControl({
53656 * positionOptions: {
53657 * enableHighAccuracy: true
53658 * },
53659 * trackUserLocation: true
53660 * });
53661 * // Add the control to the map.
53662 * map.addControl(geolocate);
53663 * // Set an event listener that fires
53664 * // when a trackuserlocationend event occurs.
53665 * geolocate.on('trackuserlocationend', function() {
53666 * console.log('A trackuserlocationend event has occurred.')
53667 * });
53668 *
53669 */
53670
53671const defaultOptions$1 = {
53672 maxWidth: 100,
53673 unit: 'metric'
53674};
53675/**
53676 * A `ScaleControl` control displays the ratio of a distance on the map to the corresponding distance on the ground.
53677 *
53678 * @implements {IControl}
53679 * @param {Object} [options]
53680 * @param {number} [options.maxWidth='100'] The maximum length of the scale control in pixels.
53681 * @param {string} [options.unit='metric'] Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`).
53682 * @example
53683 * var scale = new maplibregl.ScaleControl({
53684 * maxWidth: 80,
53685 * unit: 'imperial'
53686 * });
53687 * map.addControl(scale);
53688 *
53689 * scale.setUnit('metric');
53690 */
53691class ScaleControl {
53692 constructor(options) {
53693 this.options = performance.extend({}, defaultOptions$1, options);
53694 performance.bindAll([
53695 '_onMove',
53696 'setUnit'
53697 ], this);
53698 }
53699 getDefaultPosition() {
53700 return 'bottom-left';
53701 }
53702 _onMove() {
53703 updateScale(this._map, this._container, this.options);
53704 }
53705 onAdd(map) {
53706 this._map = map;
53707 this._container = DOM.create('div', 'maplibregl-ctrl maplibregl-ctrl-scale mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer());
53708 this._map.on('move', this._onMove);
53709 this._onMove();
53710 return this._container;
53711 }
53712 onRemove() {
53713 DOM.remove(this._container);
53714 this._map.off('move', this._onMove);
53715 this._map = undefined;
53716 }
53717 /**
53718 * Set the scale's unit of the distance
53719 *
53720 * @param unit Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`).
53721 */
53722 setUnit(unit) {
53723 this.options.unit = unit;
53724 updateScale(this._map, this._container, this.options);
53725 }
53726}
53727function updateScale(map, container, options) {
53728 // A horizontal scale is imagined to be present at center of the map
53729 // container with maximum length (Default) as 100px.
53730 // Using spherical law of cosines approximation, the real distance is
53731 // found between the two coordinates.
53732 const maxWidth = options && options.maxWidth || 100;
53733 const y = map._container.clientHeight / 2;
53734 const left = map.unproject([0, y]);
53735 const right = map.unproject([maxWidth, y]);
53736 const maxMeters = left.distanceTo(right);
53737 // The real distance corresponding to 100px scale length is rounded off to
53738 // near pretty number and the scale length for the same is found out.
53739 // Default unit of the scale is based on User's locale.
53740 if (options && options.unit === 'imperial') {
53741 const maxFeet = 3.2808 * maxMeters;
53742 if (maxFeet > 5280) {
53743 const maxMiles = maxFeet / 5280;
53744 setScale(container, maxWidth, maxMiles, map._getUIString('ScaleControl.Miles'));
53745 }
53746 else {
53747 setScale(container, maxWidth, maxFeet, map._getUIString('ScaleControl.Feet'));
53748 }
53749 }
53750 else if (options && options.unit === 'nautical') {
53751 const maxNauticals = maxMeters / 1852;
53752 setScale(container, maxWidth, maxNauticals, map._getUIString('ScaleControl.NauticalMiles'));
53753 }
53754 else if (maxMeters >= 1000) {
53755 setScale(container, maxWidth, maxMeters / 1000, map._getUIString('ScaleControl.Kilometers'));
53756 }
53757 else {
53758 setScale(container, maxWidth, maxMeters, map._getUIString('ScaleControl.Meters'));
53759 }
53760}
53761function setScale(container, maxWidth, maxDistance, unit) {
53762 const distance = getRoundNum(maxDistance);
53763 const ratio = distance / maxDistance;
53764 container.style.width = `${maxWidth * ratio}px`;
53765 container.innerHTML = `${distance}&nbsp;${unit}`;
53766}
53767function getDecimalRoundNum(d) {
53768 const multiplier = Math.pow(10, Math.ceil(-Math.log(d) / Math.LN10));
53769 return Math.round(d * multiplier) / multiplier;
53770}
53771function getRoundNum(num) {
53772 const pow10 = Math.pow(10, (`${Math.floor(num)}`).length - 1);
53773 let d = num / pow10;
53774 d = d >= 10 ? 10 :
53775 d >= 5 ? 5 :
53776 d >= 3 ? 3 :
53777 d >= 2 ? 2 :
53778 d >= 1 ? 1 : getDecimalRoundNum(d);
53779 return pow10 * d;
53780}
53781
53782/**
53783 * A `FullscreenControl` control contains a button for toggling the map in and out of fullscreen mode.
53784 *
53785 * @implements {IControl}
53786 * @param {Object} [options]
53787 * @param {HTMLElement} [options.container] `container` is the [compatible DOM element](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen#Compatible_elements) which should be made full screen. By default, the map container element will be made full screen.
53788 *
53789 * @example
53790 * map.addControl(new maplibregl.FullscreenControl({container: document.querySelector('body')}));
53791 * @see [View a fullscreen map](https://maplibre.org/maplibre-gl-js-docs/example/fullscreen/)
53792 */
53793class FullscreenControl {
53794 constructor(options) {
53795 this._fullscreen = false;
53796 if (options && options.container) {
53797 if (options.container instanceof HTMLElement) {
53798 this._container = options.container;
53799 }
53800 else {
53801 performance.warnOnce('Full screen control \'container\' must be a DOM element.');
53802 }
53803 }
53804 performance.bindAll([
53805 '_onClickFullscreen',
53806 '_changeIcon'
53807 ], this);
53808 if ('onfullscreenchange' in document) {
53809 this._fullscreenchange = 'fullscreenchange';
53810 }
53811 else if ('onmozfullscreenchange' in document) {
53812 this._fullscreenchange = 'mozfullscreenchange';
53813 }
53814 else if ('onwebkitfullscreenchange' in document) {
53815 this._fullscreenchange = 'webkitfullscreenchange';
53816 }
53817 else if ('onmsfullscreenchange' in document) {
53818 this._fullscreenchange = 'MSFullscreenChange';
53819 }
53820 }
53821 onAdd(map) {
53822 this._map = map;
53823 if (!this._container)
53824 this._container = this._map.getContainer();
53825 this._controlContainer = DOM.create('div', 'maplibregl-ctrl maplibregl-ctrl-group mapboxgl-ctrl mapboxgl-ctrl-group');
53826 if (this._checkFullscreenSupport()) {
53827 this._setupUI();
53828 }
53829 else {
53830 this._controlContainer.style.display = 'none';
53831 performance.warnOnce('This device does not support fullscreen mode.');
53832 }
53833 return this._controlContainer;
53834 }
53835 onRemove() {
53836 DOM.remove(this._controlContainer);
53837 this._map = null;
53838 window.document.removeEventListener(this._fullscreenchange, this._changeIcon);
53839 }
53840 _checkFullscreenSupport() {
53841 return !!(document.fullscreenEnabled ||
53842 document.mozFullScreenEnabled ||
53843 document.msFullscreenEnabled ||
53844 document.webkitFullscreenEnabled);
53845 }
53846 _setupUI() {
53847 const button = this._fullscreenButton = DOM.create('button', (('maplibregl-ctrl-fullscreen mapboxgl-ctrl-fullscreen')), this._controlContainer);
53848 DOM.create('span', 'maplibregl-ctrl-icon mapboxgl-ctrl-icon', button).setAttribute('aria-hidden', 'true');
53849 button.type = 'button';
53850 this._updateTitle();
53851 this._fullscreenButton.addEventListener('click', this._onClickFullscreen);
53852 window.document.addEventListener(this._fullscreenchange, this._changeIcon);
53853 }
53854 _updateTitle() {
53855 const title = this._getTitle();
53856 this._fullscreenButton.setAttribute('aria-label', title);
53857 this._fullscreenButton.title = title;
53858 }
53859 _getTitle() {
53860 return this._map._getUIString(this._isFullscreen() ? 'FullscreenControl.Exit' : 'FullscreenControl.Enter');
53861 }
53862 _isFullscreen() {
53863 return this._fullscreen;
53864 }
53865 _changeIcon() {
53866 const fullscreenElement = window.document.fullscreenElement ||
53867 window.document.mozFullScreenElement ||
53868 window.document.webkitFullscreenElement ||
53869 window.document.msFullscreenElement;
53870 if ((fullscreenElement === this._container) !== this._fullscreen) {
53871 this._fullscreen = !this._fullscreen;
53872 this._fullscreenButton.classList.toggle('maplibregl-ctrl-shrink');
53873 this._fullscreenButton.classList.toggle('mapboxgl-ctrl-shrink');
53874 this._fullscreenButton.classList.toggle('maplibregl-ctrl-fullscreen');
53875 this._fullscreenButton.classList.toggle('mapboxgl-ctrl-fullscreen');
53876 this._updateTitle();
53877 }
53878 }
53879 _onClickFullscreen() {
53880 if (this._isFullscreen()) {
53881 if (window.document.exitFullscreen) {
53882 window.document.exitFullscreen();
53883 }
53884 else if (window.document.mozCancelFullScreen) {
53885 window.document.mozCancelFullScreen();
53886 }
53887 else if (window.document.msExitFullscreen) {
53888 window.document.msExitFullscreen();
53889 }
53890 else if (window.document.webkitCancelFullScreen) {
53891 window.document.webkitCancelFullScreen();
53892 }
53893 }
53894 else if (this._container.requestFullscreen) {
53895 this._container.requestFullscreen();
53896 }
53897 else if (this._container.mozRequestFullScreen) {
53898 this._container.mozRequestFullScreen();
53899 }
53900 else if (this._container.msRequestFullscreen) {
53901 this._container.msRequestFullscreen();
53902 }
53903 else if (this._container.webkitRequestFullscreen) {
53904 this._container.webkitRequestFullscreen();
53905 }
53906 }
53907}
53908
53909const defaultOptions = {
53910 closeButton: true,
53911 closeOnClick: true,
53912 focusAfterOpen: true,
53913 className: '',
53914 maxWidth: '240px'
53915};
53916const focusQuerySelector = [
53917 'a[href]',
53918 '[tabindex]:not([tabindex=\'-1\'])',
53919 '[contenteditable]:not([contenteditable=\'false\'])',
53920 'button:not([disabled])',
53921 'input:not([disabled])',
53922 'select:not([disabled])',
53923 'textarea:not([disabled])',
53924].join(', ');
53925/**
53926 * A popup component.
53927 *
53928 * @param {Object} [options]
53929 * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the
53930 * top right corner of the popup.
53931 * @param {boolean} [options.closeOnClick=true] If `true`, the popup will closed when the
53932 * map is clicked.
53933 * @param {boolean} [options.closeOnMove=false] If `true`, the popup will closed when the
53934 * map moves.
53935 * @param {boolean} [options.focusAfterOpen=true] If `true`, the popup will try to focus the
53936 * first focusable element inside the popup.
53937 * @param {string} [options.anchor] - A string indicating the part of the Popup that should
53938 * be positioned closest to the coordinate set via {@link Popup#setLngLat}.
53939 * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`,
53940 * `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be
53941 * dynamically set to ensure the popup falls within the map container with a preference
53942 * for `'bottom'`.
53943 * @param {number|PointLike|Object} [options.offset] -
53944 * A pixel offset applied to the popup's location specified as:
53945 * - a single number specifying a distance from the popup's location
53946 * - a {@link PointLike} specifying a constant offset
53947 * - an object of {@link Point}s specifing an offset for each anchor position
53948 * Negative offsets indicate left and up.
53949 * @param {string} [options.className] Space-separated CSS class names to add to popup container
53950 * @param {string} [options.maxWidth='240px'] -
53951 * A string that sets the CSS property of the popup's maximum width, eg `'300px'`.
53952 * To ensure the popup resizes to fit its content, set this property to `'none'`.
53953 * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width
53954 * @example
53955 * var markerHeight = 50, markerRadius = 10, linearOffset = 25;
53956 * var popupOffsets = {
53957 * 'top': [0, 0],
53958 * 'top-left': [0,0],
53959 * 'top-right': [0,0],
53960 * 'bottom': [0, -markerHeight],
53961 * 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1],
53962 * 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1],
53963 * 'left': [markerRadius, (markerHeight - markerRadius) * -1],
53964 * 'right': [-markerRadius, (markerHeight - markerRadius) * -1]
53965 * };
53966 * var popup = new maplibregl.Popup({offset: popupOffsets, className: 'my-class'})
53967 * .setLngLat(e.lngLat)
53968 * .setHTML("<h1>Hello World!</h1>")
53969 * .setMaxWidth("300px")
53970 * .addTo(map);
53971 * @see [Display a popup](https://maplibre.org/maplibre-gl-js-docs/example/popup/)
53972 * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-hover/)
53973 * @see [Display a popup on click](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-click/)
53974 * @see [Attach a popup to a marker instance](https://maplibre.org/maplibre-gl-js-docs/example/set-popup/)
53975 */
53976class Popup extends performance.Evented {
53977 constructor(options) {
53978 super();
53979 this.options = performance.extend(Object.create(defaultOptions), options);
53980 performance.bindAll(['_update', '_onClose', 'remove', '_onMouseMove', '_onMouseUp', '_onDrag'], this);
53981 }
53982 /**
53983 * Adds the popup to a map.
53984 *
53985 * @param {Map} map The MapLibre GL JS map to add the popup to.
53986 * @returns {Popup} `this`
53987 * @example
53988 * new maplibregl.Popup()
53989 * .setLngLat([0, 0])
53990 * .setHTML("<h1>Null Island</h1>")
53991 * .addTo(map);
53992 * @see [Display a popup](https://maplibre.org/maplibre-gl-js-docs/example/popup/)
53993 * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-hover/)
53994 * @see [Display a popup on click](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-click/)
53995 * @see [Show polygon information on click](https://maplibre.org/maplibre-gl-js-docs/example/polygon-popup-on-click/)
53996 */
53997 addTo(map) {
53998 if (this._map)
53999 this.remove();
54000 this._map = map;
54001 if (this.options.closeOnClick) {
54002 this._map.on('click', this._onClose);
54003 }
54004 if (this.options.closeOnMove) {
54005 this._map.on('move', this._onClose);
54006 }
54007 this._map.on('remove', this.remove);
54008 this._update();
54009 this._focusFirstElement();
54010 if (this._trackPointer) {
54011 this._map.on('mousemove', this._onMouseMove);
54012 this._map.on('mouseup', this._onMouseUp);
54013 if (this._container) {
54014 this._container.classList.add('maplibregl-popup-track-pointer', 'mapboxgl-popup-track-pointer');
54015 }
54016 this._map._canvasContainer.classList.add('maplibregl-track-pointer', 'mapboxgl-track-pointer');
54017 }
54018 else {
54019 this._map.on('move', this._update);
54020 }
54021 /**
54022 * Fired when the popup is opened manually or programatically.
54023 *
54024 * @event open
54025 * @memberof Popup
54026 * @instance
54027 * @type {Object}
54028 * @property {Popup} popup object that was opened
54029 *
54030 * @example
54031 * // Create a popup
54032 * var popup = new maplibregl.Popup();
54033 * // Set an event listener that will fire
54034 * // any time the popup is opened
54035 * popup.on('open', function(){
54036 * console.log('popup was opened');
54037 * });
54038 *
54039 */
54040 this.fire(new performance.Event('open'));
54041 return this;
54042 }
54043 /**
54044 * @returns {boolean} `true` if the popup is open, `false` if it is closed.
54045 */
54046 isOpen() {
54047 return !!this._map;
54048 }
54049 /**
54050 * Removes the popup from the map it has been added to.
54051 *
54052 * @example
54053 * var popup = new maplibregl.Popup().addTo(map);
54054 * popup.remove();
54055 * @returns {Popup} `this`
54056 */
54057 remove() {
54058 if (this._content) {
54059 DOM.remove(this._content);
54060 }
54061 if (this._container) {
54062 DOM.remove(this._container);
54063 delete this._container;
54064 }
54065 if (this._map) {
54066 this._map.off('move', this._update);
54067 this._map.off('move', this._onClose);
54068 this._map.off('click', this._onClose);
54069 this._map.off('remove', this.remove);
54070 this._map.off('mousemove', this._onMouseMove);
54071 this._map.off('mouseup', this._onMouseUp);
54072 this._map.off('drag', this._onDrag);
54073 delete this._map;
54074 }
54075 /**
54076 * Fired when the popup is closed manually or programatically.
54077 *
54078 * @event close
54079 * @memberof Popup
54080 * @instance
54081 * @type {Object}
54082 * @property {Popup} popup object that was closed
54083 *
54084 * @example
54085 * // Create a popup
54086 * var popup = new maplibregl.Popup();
54087 * // Set an event listener that will fire
54088 * // any time the popup is closed
54089 * popup.on('close', function(){
54090 * console.log('popup was closed');
54091 * });
54092 *
54093 */
54094 this.fire(new performance.Event('close'));
54095 return this;
54096 }
54097 /**
54098 * Returns the geographical location of the popup's anchor.
54099 *
54100 * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously
54101 * set by `setLngLat` because `Popup` wraps the anchor longitude across copies of the world to keep
54102 * the popup on screen.
54103 *
54104 * @returns {LngLat} The geographical location of the popup's anchor.
54105 */
54106 getLngLat() {
54107 return this._lngLat;
54108 }
54109 /**
54110 * Sets the geographical location of the popup's anchor, and moves the popup to it. Replaces trackPointer() behavior.
54111 *
54112 * @param lnglat The geographical location to set as the popup's anchor.
54113 * @returns {Popup} `this`
54114 */
54115 setLngLat(lnglat) {
54116 this._lngLat = performance.LngLat.convert(lnglat);
54117 this._pos = null;
54118 this._trackPointer = false;
54119 this._update();
54120 if (this._map) {
54121 this._map.on('move', this._update);
54122 this._map.off('mousemove', this._onMouseMove);
54123 if (this._container) {
54124 this._container.classList.remove('maplibregl-popup-track-pointer', 'mapboxgl-popup-track-pointer');
54125 }
54126 this._map._canvasContainer.classList.remove('maplibregl-track-pointer', 'mapboxgl-track-pointer');
54127 }
54128 return this;
54129 }
54130 /**
54131 * Tracks the popup anchor to the cursor position on screens with a pointer device (it will be hidden on touchscreens). Replaces the `setLngLat` behavior.
54132 * For most use cases, set `closeOnClick` and `closeButton` to `false`.
54133 * @example
54134 * var popup = new maplibregl.Popup({ closeOnClick: false, closeButton: false })
54135 * .setHTML("<h1>Hello World!</h1>")
54136 * .trackPointer()
54137 * .addTo(map);
54138 * @returns {Popup} `this`
54139 */
54140 trackPointer() {
54141 this._trackPointer = true;
54142 this._pos = null;
54143 this._update();
54144 if (this._map) {
54145 this._map.off('move', this._update);
54146 this._map.on('mousemove', this._onMouseMove);
54147 this._map.on('drag', this._onDrag);
54148 if (this._container) {
54149 this._container.classList.add('maplibregl-popup-track-pointer', 'mapboxgl-popup-track-pointer');
54150 }
54151 this._map._canvasContainer.classList.add('maplibregl-track-pointer', 'mapboxgl-track-pointer');
54152 }
54153 return this;
54154 }
54155 /**
54156 * Returns the `Popup`'s HTML element.
54157 * @example
54158 * // Change the `Popup` element's font size
54159 * var popup = new maplibregl.Popup()
54160 * .setLngLat([-96, 37.8])
54161 * .setHTML("<p>Hello World!</p>")
54162 * .addTo(map);
54163 * var popupElem = popup.getElement();
54164 * popupElem.style.fontSize = "25px";
54165 * @returns {HTMLElement} element
54166 */
54167 getElement() {
54168 return this._container;
54169 }
54170 /**
54171 * Sets the popup's content to a string of text.
54172 *
54173 * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM,
54174 * so it cannot insert raw HTML. Use this method for security against XSS
54175 * if the popup content is user-provided.
54176 *
54177 * @param text Textual content for the popup.
54178 * @returns {Popup} `this`
54179 * @example
54180 * var popup = new maplibregl.Popup()
54181 * .setLngLat(e.lngLat)
54182 * .setText('Hello, world!')
54183 * .addTo(map);
54184 */
54185 setText(text) {
54186 return this.setDOMContent(document.createTextNode(text));
54187 }
54188 /**
54189 * Sets the popup's content to the HTML provided as a string.
54190 *
54191 * This method does not perform HTML filtering or sanitization, and must be
54192 * used only with trusted content. Consider {@link Popup#setText} if
54193 * the content is an untrusted text string.
54194 *
54195 * @param html A string representing HTML content for the popup.
54196 * @returns {Popup} `this`
54197 * @example
54198 * var popup = new maplibregl.Popup()
54199 * .setLngLat(e.lngLat)
54200 * .setHTML("<h1>Hello World!</h1>")
54201 * .addTo(map);
54202 * @see [Display a popup](https://maplibre.org/maplibre-gl-js-docs/example/popup/)
54203 * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-hover/)
54204 * @see [Display a popup on click](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-click/)
54205 * @see [Attach a popup to a marker instance](https://maplibre.org/maplibre-gl-js-docs/example/set-popup/)
54206 */
54207 setHTML(html) {
54208 const frag = document.createDocumentFragment();
54209 const temp = document.createElement('body');
54210 let child;
54211 temp.innerHTML = html;
54212 while (true) {
54213 child = temp.firstChild;
54214 if (!child)
54215 break;
54216 frag.appendChild(child);
54217 }
54218 return this.setDOMContent(frag);
54219 }
54220 /**
54221 * Returns the popup's maximum width.
54222 *
54223 * @returns {string} The maximum width of the popup.
54224 */
54225 getMaxWidth() {
54226 return this._container && this._container.style.maxWidth;
54227 }
54228 /**
54229 * Sets the popup's maximum width. This is setting the CSS property `max-width`.
54230 * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width
54231 *
54232 * @param maxWidth A string representing the value for the maximum width.
54233 * @returns {Popup} `this`
54234 */
54235 setMaxWidth(maxWidth) {
54236 this.options.maxWidth = maxWidth;
54237 this._update();
54238 return this;
54239 }
54240 /**
54241 * Sets the popup's content to the element provided as a DOM node.
54242 *
54243 * @param htmlNode A DOM node to be used as content for the popup.
54244 * @returns {Popup} `this`
54245 * @example
54246 * // create an element with the popup content
54247 * var div = document.createElement('div');
54248 * div.innerHTML = 'Hello, world!';
54249 * var popup = new maplibregl.Popup()
54250 * .setLngLat(e.lngLat)
54251 * .setDOMContent(div)
54252 * .addTo(map);
54253 */
54254 setDOMContent(htmlNode) {
54255 if (this._content) {
54256 // Clear out children first.
54257 while (this._content.hasChildNodes()) {
54258 if (this._content.firstChild) {
54259 this._content.removeChild(this._content.firstChild);
54260 }
54261 }
54262 }
54263 else {
54264 this._content = DOM.create('div', 'maplibregl-popup-content mapboxgl-popup-content', this._container);
54265 }
54266 // The close button should be the last tabbable element inside the popup for a good keyboard UX.
54267 this._content.appendChild(htmlNode);
54268 this._createCloseButton();
54269 this._update();
54270 this._focusFirstElement();
54271 return this;
54272 }
54273 /**
54274 * Adds a CSS class to the popup container element.
54275 *
54276 * @param {string} className Non-empty string with CSS class name to add to popup container
54277 *
54278 * @example
54279 * let popup = new maplibregl.Popup()
54280 * popup.addClassName('some-class')
54281 */
54282 addClassName(className) {
54283 if (this._container) {
54284 this._container.classList.add(className);
54285 }
54286 }
54287 /**
54288 * Removes a CSS class from the popup container element.
54289 *
54290 * @param {string} className Non-empty string with CSS class name to remove from popup container
54291 *
54292 * @example
54293 * let popup = new maplibregl.Popup()
54294 * popup.removeClassName('some-class')
54295 */
54296 removeClassName(className) {
54297 if (this._container) {
54298 this._container.classList.remove(className);
54299 }
54300 }
54301 /**
54302 * Sets the popup's offset.
54303 *
54304 * @param offset Sets the popup's offset.
54305 * @returns {Popup} `this`
54306 */
54307 setOffset(offset) {
54308 this.options.offset = offset;
54309 this._update();
54310 return this;
54311 }
54312 /**
54313 * Add or remove the given CSS class on the popup container, depending on whether the container currently has that class.
54314 *
54315 * @param {string} className Non-empty string with CSS class name to add/remove
54316 *
54317 * @returns {boolean} if the class was removed return false, if class was added, then return true
54318 *
54319 * @example
54320 * let popup = new maplibregl.Popup()
54321 * popup.toggleClassName('toggleClass')
54322 */
54323 toggleClassName(className) {
54324 if (this._container) {
54325 return this._container.classList.toggle(className);
54326 }
54327 }
54328 _createCloseButton() {
54329 if (this.options.closeButton) {
54330 this._closeButton = DOM.create('button', 'maplibregl-popup-close-button mapboxgl-popup-close-button', this._content);
54331 this._closeButton.type = 'button';
54332 this._closeButton.setAttribute('aria-label', 'Close popup');
54333 this._closeButton.innerHTML = '&#215;';
54334 this._closeButton.addEventListener('click', this._onClose);
54335 }
54336 }
54337 _onMouseUp(event) {
54338 this._update(event.point);
54339 }
54340 _onMouseMove(event) {
54341 this._update(event.point);
54342 }
54343 _onDrag(event) {
54344 this._update(event.point);
54345 }
54346 _update(cursor) {
54347 const hasPosition = this._lngLat || this._trackPointer;
54348 if (!this._map || !hasPosition || !this._content) {
54349 return;
54350 }
54351 if (!this._container) {
54352 this._container = DOM.create('div', 'maplibregl-popup mapboxgl-popup', this._map.getContainer());
54353 this._tip = DOM.create('div', 'maplibregl-popup-tip mapboxgl-popup-tip', this._container);
54354 this._container.appendChild(this._content);
54355 if (this.options.className) {
54356 this.options.className.split(' ').forEach(name => this._container.classList.add(name));
54357 }
54358 if (this._trackPointer) {
54359 this._container.classList.add('maplibregl-popup-track-pointer', 'mapboxgl-popup-track-pointer');
54360 }
54361 }
54362 if (this.options.maxWidth && this._container.style.maxWidth !== this.options.maxWidth) {
54363 this._container.style.maxWidth = this.options.maxWidth;
54364 }
54365 if (this._map.transform.renderWorldCopies && !this._trackPointer) {
54366 this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform);
54367 }
54368 if (this._trackPointer && !cursor)
54369 return;
54370 const pos = this._pos = this._trackPointer && cursor ? cursor : this._map.project(this._lngLat);
54371 let anchor = this.options.anchor;
54372 const offset = normalizeOffset(this.options.offset);
54373 if (!anchor) {
54374 const width = this._container.offsetWidth;
54375 const height = this._container.offsetHeight;
54376 let anchorComponents;
54377 if (pos.y + offset.bottom.y < height) {
54378 anchorComponents = ['top'];
54379 }
54380 else if (pos.y > this._map.transform.height - height) {
54381 anchorComponents = ['bottom'];
54382 }
54383 else {
54384 anchorComponents = [];
54385 }
54386 if (pos.x < width / 2) {
54387 anchorComponents.push('left');
54388 }
54389 else if (pos.x > this._map.transform.width - width / 2) {
54390 anchorComponents.push('right');
54391 }
54392 if (anchorComponents.length === 0) {
54393 anchor = 'bottom';
54394 }
54395 else {
54396 anchor = anchorComponents.join('-');
54397 }
54398 }
54399 const offsetedPos = pos.add(offset[anchor]).round();
54400 DOM.setTransform(this._container, `${anchorTranslate[anchor]} translate(${offsetedPos.x}px,${offsetedPos.y}px)`);
54401 applyAnchorClass(this._container, anchor, 'popup');
54402 }
54403 _focusFirstElement() {
54404 if (!this.options.focusAfterOpen || !this._container)
54405 return;
54406 const firstFocusable = this._container.querySelector(focusQuerySelector);
54407 if (firstFocusable)
54408 firstFocusable.focus();
54409 }
54410 _onClose() {
54411 this.remove();
54412 }
54413}
54414function normalizeOffset(offset) {
54415 if (!offset) {
54416 return normalizeOffset(new performance.pointGeometry(0, 0));
54417 }
54418 else if (typeof offset === 'number') {
54419 // input specifies a radius from which to calculate offsets at all positions
54420 const cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2)));
54421 return {
54422 'center': new performance.pointGeometry(0, 0),
54423 'top': new performance.pointGeometry(0, offset),
54424 'top-left': new performance.pointGeometry(cornerOffset, cornerOffset),
54425 'top-right': new performance.pointGeometry(-cornerOffset, cornerOffset),
54426 'bottom': new performance.pointGeometry(0, -offset),
54427 'bottom-left': new performance.pointGeometry(cornerOffset, -cornerOffset),
54428 'bottom-right': new performance.pointGeometry(-cornerOffset, -cornerOffset),
54429 'left': new performance.pointGeometry(offset, 0),
54430 'right': new performance.pointGeometry(-offset, 0)
54431 };
54432 }
54433 else if (offset instanceof performance.pointGeometry || Array.isArray(offset)) {
54434 // input specifies a single offset to be applied to all positions
54435 const convertedOffset = performance.pointGeometry.convert(offset);
54436 return {
54437 'center': convertedOffset,
54438 'top': convertedOffset,
54439 'top-left': convertedOffset,
54440 'top-right': convertedOffset,
54441 'bottom': convertedOffset,
54442 'bottom-left': convertedOffset,
54443 'bottom-right': convertedOffset,
54444 'left': convertedOffset,
54445 'right': convertedOffset
54446 };
54447 }
54448 else {
54449 // input specifies an offset per position
54450 return {
54451 'center': performance.pointGeometry.convert(offset['center'] || [0, 0]),
54452 'top': performance.pointGeometry.convert(offset['top'] || [0, 0]),
54453 'top-left': performance.pointGeometry.convert(offset['top-left'] || [0, 0]),
54454 'top-right': performance.pointGeometry.convert(offset['top-right'] || [0, 0]),
54455 'bottom': performance.pointGeometry.convert(offset['bottom'] || [0, 0]),
54456 'bottom-left': performance.pointGeometry.convert(offset['bottom-left'] || [0, 0]),
54457 'bottom-right': performance.pointGeometry.convert(offset['bottom-right'] || [0, 0]),
54458 'left': performance.pointGeometry.convert(offset['left'] || [0, 0]),
54459 'right': performance.pointGeometry.convert(offset['right'] || [0, 0])
54460 };
54461 }
54462}
54463
54464const exported = {
54465 supported,
54466 setRTLTextPlugin: performance.setRTLTextPlugin,
54467 getRTLTextPluginStatus: performance.getRTLTextPluginStatus,
54468 Map,
54469 NavigationControl,
54470 GeolocateControl,
54471 AttributionControl,
54472 LogoControl,
54473 ScaleControl,
54474 FullscreenControl,
54475 Popup,
54476 Marker,
54477 Style,
54478 LngLat: performance.LngLat,
54479 LngLatBounds: performance.LngLatBounds,
54480 Point: performance.pointGeometry,
54481 MercatorCoordinate: performance.MercatorCoordinate,
54482 Evented: performance.Evented,
54483 AJAXError: performance.AJAXError,
54484 config: performance.config,
54485 CanvasSource,
54486 GeoJSONSource,
54487 ImageSource,
54488 RasterDEMTileSource,
54489 RasterTileSource,
54490 VectorTileSource,
54491 VideoSource,
54492 /**
54493 * Initializes resources like WebWorkers that can be shared across maps to lower load
54494 * times in some situations. `maplibregl.workerUrl` and `maplibregl.workerCount`, if being
54495 * used, must be set before `prewarm()` is called to have an effect.
54496 *
54497 * By default, the lifecycle of these resources is managed automatically, and they are
54498 * lazily initialized when a Map is first created. By invoking `prewarm()`, these
54499 * resources will be created ahead of time, and will not be cleared when the last Map
54500 * is removed from the page. This allows them to be re-used by new Map instances that
54501 * are created later. They can be manually cleared by calling
54502 * `maplibregl.clearPrewarmedResources()`. This is only necessary if your web page remains
54503 * active but stops using maps altogether.
54504 *
54505 * This is primarily useful when using GL-JS maps in a single page app, wherein a user
54506 * would navigate between various views that can cause Map instances to constantly be
54507 * created and destroyed.
54508 *
54509 * @function prewarm
54510 * @example
54511 * maplibregl.prewarm()
54512 */
54513 prewarm,
54514 /**
54515 * Clears up resources that have previously been created by `maplibregl.prewarm()`.
54516 * Note that this is typically not necessary. You should only call this function
54517 * if you expect the user of your app to not return to a Map view at any point
54518 * in your application.
54519 *
54520 * @function clearPrewarmedResources
54521 * @example
54522 * maplibregl.clearPrewarmedResources()
54523 */
54524 clearPrewarmedResources,
54525 /**
54526 * Gets and sets the number of web workers instantiated on a page with GL JS maps.
54527 * By default, it is set to half the number of CPU cores (capped at 6).
54528 * Make sure to set this property before creating any map instances for it to have effect.
54529 *
54530 * @var {string} workerCount
54531 * @returns {number} Number of workers currently configured.
54532 * @example
54533 * maplibregl.workerCount = 2;
54534 */
54535 get workerCount() {
54536 return WorkerPool.workerCount;
54537 },
54538 set workerCount(count) {
54539 WorkerPool.workerCount = count;
54540 },
54541 /**
54542 * Gets and sets the maximum number of images (raster tiles, sprites, icons) to load in parallel,
54543 * which affects performance in raster-heavy maps. 16 by default.
54544 *
54545 * @var {string} maxParallelImageRequests
54546 * @returns {number} Number of parallel requests currently configured.
54547 * @example
54548 * maplibregl.maxParallelImageRequests = 10;
54549 */
54550 get maxParallelImageRequests() {
54551 return performance.config.MAX_PARALLEL_IMAGE_REQUESTS;
54552 },
54553 set maxParallelImageRequests(numRequests) {
54554 performance.config.MAX_PARALLEL_IMAGE_REQUESTS = numRequests;
54555 },
54556 /**
54557 * Clears browser storage used by this library. Using this method flushes the MapLibre tile
54558 * cache that is managed by this library. Tiles may still be cached by the browser
54559 * in some cases.
54560 *
54561 * This API is supported on browsers where the [`Cache` API](https://developer.mozilla.org/en-US/docs/Web/API/Cache)
54562 * is supported and enabled. This includes all major browsers when pages are served over
54563 * `https://`, except Internet Explorer and Edge Mobile.
54564 *
54565 * When called in unsupported browsers or environments (private or incognito mode), the
54566 * callback will be called with an error argument.
54567 *
54568 * @function clearStorage
54569 * @param {Function} callback Called with an error argument if there is an error.
54570 * @example
54571 * maplibregl.clearStorage();
54572 */
54573 clearStorage(callback) {
54574 performance.clearTileCache(callback);
54575 },
54576 workerUrl: '',
54577 /**
54578 * Sets a custom load tile function that will be called when using a source that starts with a custom url schema.
54579 * The example below will be triggered for custom:// urls defined in the sources list in the style definitions.
54580 * The function passed will receive the request parameters and should call the callback with the resulting request,
54581 * for example a pbf vector tile, non-compressed, represented as ArrayBuffer.
54582 *
54583 * @function addProtocol
54584 * @param {string} customProtocol - the protocol to hook, for example 'custom'
54585 * @param {Function} loadFn - the function to use when trying to fetch a tile specified by the customProtocol
54586 * @example
54587 * // this will fetch a file using the fetch API (this is obviously a non iteresting example...)
54588 * maplibre.addProtocol('custom', (params, callback) => {
54589 fetch(`https://${params.url.split("://")[1]}`)
54590 .then(t => {
54591 if (t.status == 200) {
54592 t.arrayBuffer().then(arr => {
54593 callback(null, arr, null, null);
54594 });
54595 } else {
54596 callback(new Error(`Tile fetch error: ${t.statusText}`));
54597 }
54598 })
54599 .catch(e => {
54600 callback(new Error(e));
54601 });
54602 return { cancel: () => { } };
54603 });
54604 * // the following is an example of a way to return an error when trying to load a tile
54605 * maplibre.addProtocol('custom2', (params, callback) => {
54606 * callback(new Error('someErrorMessage'));
54607 * return { cancel: () => { } };
54608 * });
54609 */
54610 addProtocol(customProtocol, loadFn) {
54611 performance.config.REGISTERED_PROTOCOLS[customProtocol] = loadFn;
54612 },
54613 /**
54614 * Removes a previusly added protocol
54615 *
54616 * @function removeProtocol
54617 * @param {string} customProtocol - the custom protocol to remove registration for
54618 * @example
54619 * maplibregl.removeProtocol('custom');
54620 */
54621 removeProtocol(customProtocol) {
54622 delete performance.config.REGISTERED_PROTOCOLS[customProtocol];
54623 }
54624};
54625//This gets automatically stripped out in production builds.
54626Debug.extend(exported, { isSafari: performance.isSafari, getPerformanceMetrics: performance.PerformanceUtils.getPerformanceMetrics });
54627/**
54628 * Test whether the browser supports MapLibre GL JS.
54629 *
54630 * @function supported
54631 * @param {Object} [options]
54632 * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`,
54633 * the function will return `false` if the performance of MapLibre GL JS would
54634 * be dramatically worse than expected (e.g. a software WebGL renderer would be used).
54635 * @return {boolean}
54636 * @example
54637 * // Show an alert if the browser does not support MapLibre GL
54638 * if (!maplibregl.supported()) {
54639 * alert('Your browser does not support MapLibre GL');
54640 * }
54641 * @see [Check for browser support](https://maplibre.org/maplibre-gl-js-docs/example/check-for-support/)
54642 */
54643/**
54644 * Sets the map's [RTL text plugin](https://www.mapbox.com/mapbox-gl-js/plugins/#mapbox-gl-rtl-text).
54645 * Necessary for supporting the Arabic and Hebrew languages, which are written right-to-left.
54646 *
54647 * @function setRTLTextPlugin
54648 * @param {string} pluginURL URL pointing to the Mapbox RTL text plugin source.
54649 * @param {Function} callback Called with an error argument if there is an error.
54650 * @param {boolean} lazy If set to `true`, mapboxgl will defer loading the plugin until rtl text is encountered,
54651 * rtl text will then be rendered only after the plugin finishes loading.
54652 * @example
54653 * maplibregl.setRTLTextPlugin('https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.2.0/mapbox-gl-rtl-text.js');
54654 * @see [Add support for right-to-left scripts](https://maplibre.org/maplibre-gl-js-docs/example/mapbox-gl-rtl-text/)
54655 */
54656/**
54657 * Gets the map's [RTL text plugin](https://www.mapbox.com/mapbox-gl-js/plugins/#mapbox-gl-rtl-text) status.
54658 * The status can be `unavailable` (i.e. not requested or removed), `loading`, `loaded` or `error`.
54659 * If the status is `loaded` and the plugin is requested again, an error will be thrown.
54660 *
54661 * @function getRTLTextPluginStatus
54662 * @example
54663 * const pluginStatus = maplibregl.getRTLTextPluginStatus();
54664 */
54665var maplibregl = exported;
54666// canary assert: used to confirm that asserts have been removed from production build
54667performance.assert(true, 'canary assert');
54668
54669return maplibregl;
54670
54671}));
54672
54673//
54674
54675var maplibregl$1 = maplibregl;
54676
54677return maplibregl$1;
54678
54679}));
54680//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwbGlicmUtZ2wtZGV2LmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9hc3NlcnQvbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvYXNzZXJ0L25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9hc3NlcnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC91bml0YmV6aWVyL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9kZWVwX2VxdWFsLnRzIiwiLi4vc3JjL3V0aWwvdXRpbC50cyIsIi4uL3NyYy91dGlsL2Jyb3dzZXIudHMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC9wb2ludC1nZW9tZXRyeS9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2NvbmZpZy50cyIsIi4uL3NyYy91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZS50cyIsIi4uL3NyYy91dGlsL3dlYnBfc3VwcG9ydGVkLnRzIiwiLi4vc3JjL3V0aWwvYWpheC50cyIsIi4uL3NyYy91dGlsL2V2ZW50ZWQudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9lcnJvci92YWxpZGF0aW9uX2Vycm9yLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfY29uc3RhbnRzLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9leHRlbmQudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3VuYnVuZGxlX2pzb25saW50LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9wYXJzaW5nX2Vycm9yLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9zY29wZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMudHMiLCIuLi9ub2RlX21vZHVsZXMvY3NzY29sb3JwYXJzZXIvY3NzY29sb3JwYXJzZXIuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2NvbG9yLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9jb2xsYXRvci50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdmFsdWVzLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9saXRlcmFsLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9ydW50aW1lX2Vycm9yLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9hc3NlcnRpb24udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2Zvcm1hdC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW1hZ2UudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvZXJjaW9uLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9ldmFsdWF0aW9uX2NvbnRleHQudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2NvbXBvdW5kX2V4cHJlc3Npb24udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvbGxhdG9yLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy93aXRoaW4udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2lzX2NvbnN0YW50LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy92YXIudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3BhcnNpbmdfY29udGV4dC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vc3RvcHMudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL3N0ZXAudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9jb2xvcl9zcGFjZXMudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2ludGVycG9sYXRlLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb2FsZXNjZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGV0LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9hdC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW4udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2luZGV4X29mLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9tYXRjaC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY2FzZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvc2xpY2UudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvbXBhcmlzb24udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL251bWJlcl9mb3JtYXQudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2xlbmd0aC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW5kZXgudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3Jlc3VsdC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvcHJvcGVydGllcy50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvZ2V0X3R5cGUudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9mdW5jdGlvbi9pbmRleC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXgudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9vYmplY3QudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9hcnJheS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX251bWJlci50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Z1bmN0aW9uLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZXhwcmVzc2lvbi50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Jvb2xlYW4udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9jb2xvci50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2VudW0udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlci9pbmRleC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZpbHRlci50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3Byb3BlcnR5LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHkudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9sYXllci50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3N0cmluZy50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZm9ybWF0dGVkLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfaW1hZ2UudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2dseXBoc191cmwudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZV9zdHlsZS5taW4udHMiLCIuLi9zcmMvc3R5bGUvdmFsaWRhdGVfc3R5bGUudHMiLCIuLi9zcmMvdXRpbC90cmFuc2ZlcmFibGVfZ3JpZF9pbmRleC50cyIsIi4uL3NyYy91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIudHMiLCIuLi9zcmMvc3R5bGUvem9vbV9oaXN0b3J5LnRzIiwiLi4vc3JjL3V0aWwvaXNfY2hhcl9pbl91bmljb2RlX2Jsb2NrLnRzIiwiLi4vc3JjL3V0aWwvc2NyaXB0X2RldGVjdGlvbi50cyIsIi4uL3NyYy9zb3VyY2UvcnRsX3RleHRfcGx1Z2luLnRzIiwiLi4vc3JjL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy50cyIsIi4uL3NyYy9zdHlsZS9wcm9wZXJ0aWVzLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyLnRzIiwiLi4vc3JjL3V0aWwvc3RydWN0X2FycmF5LnRzIiwiLi4vc3JjL2RhdGEvYXJyYXlfdHlwZXMuZy50cyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9jaXJjbGVfYXR0cmlidXRlcy50cyIsIi4uL3NyYy9kYXRhL3NlZ21lbnQudHMiLCIuLi9zcmMvc2hhZGVycy9lbmNvZGVfYXR0cmlidXRlLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3BhdHRlcm5fYXR0cmlidXRlcy50cyIsIi4uL25vZGVfbW9kdWxlcy9tdXJtdXJoYXNoLWpzL211cm11cmhhc2gzX2djLmpzIiwiLi4vbm9kZV9tb2R1bGVzL211cm11cmhhc2gtanMvbXVybXVyaGFzaDJfZ2MuanMiLCIuLi9ub2RlX21vZHVsZXMvbXVybXVyaGFzaC1qcy9pbmRleC5qcyIsIi4uL3NyYy9kYXRhL2ZlYXR1cmVfcG9zaXRpb25fbWFwLnRzIiwiLi4vc3JjL3JlbmRlci91bmlmb3JtX2JpbmRpbmcudHMiLCIuLi9zcmMvZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24udHMiLCIuLi9zcmMvZGF0YS9leHRlbnQudHMiLCIuLi9zcmMvZGF0YS9sb2FkX2dlb21ldHJ5LnRzIiwiLi4vc3JjL2RhdGEvZXZhbHVhdGlvbl9mZWF0dXJlLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2NpcmNsZV9idWNrZXQudHMiLCIuLi9zcmMvdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMudHMiLCIuLi9zcmMvc3R5bGUvcXVlcnlfdXRpbHMudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuZy50cyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL2NvbW1vbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDIuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQyZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDMuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQ0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjMy5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3ZlYzQuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9xdWF0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vcXVhdDIuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMyLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllci50cyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9oZWF0bWFwX2J1Y2tldC50cyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuZy50cyIsIi4uL3NyYy91dGlsL2ltYWdlLnRzIiwiLi4vc3JjL3V0aWwvY29sb3JfcmFtcC50cyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmcudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGlsbHNoYWRlX3N0eWxlX2xheWVyLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfYXR0cmlidXRlcy50cyIsIi4uL25vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9xdWlja3NlbGVjdC9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2NsYXNzaWZ5X3JpbmdzLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3BhdHRlcm5fYnVja2V0X2ZlYXR1cmVzLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0LnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5nLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXIudHMiLCIuLi9zcmMvZGF0YS9idWNrZXQvZmlsbF9leHRydXNpb25fYXR0cmlidXRlcy50cyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3ZlY3Rvci10aWxlL2luZGV4LmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldC50cyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmcudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXIudHMiLCIuLi9zcmMvZGF0YS9idWNrZXQvbGluZV9hdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2xpbmVfYXR0cmlidXRlc19leHQudHMiLCIuLi9zcmMvZGF0YS9idWNrZXQvbGluZV9idWNrZXQudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmcudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllci50cyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9zeW1ib2xfYXR0cmlidXRlcy50cyIsIi4uL3NyYy9zeW1ib2wvdHJhbnNmb3JtX3RleHQudHMiLCIuLi9zcmMvc3ltYm9sL21lcmdlbGluZXMudHMiLCIuLi9zcmMvdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbi50cyIsIi4uL3NyYy9zeW1ib2wvb25lX2VtLnRzIiwiLi4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvcGJmL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlL3BhcnNlX2dseXBoX3BiZi50cyIsIi4uL25vZGVfbW9kdWxlcy9wb3RwYWNrL2luZGV4Lm1qcyIsIi4uL3NyYy9yZW5kZXIvaW1hZ2VfYXRsYXMudHMiLCIuLi9zcmMvc3ltYm9sL3NoYXBpbmcudHMiLCIuLi9zcmMvc3ltYm9sL3N5bWJvbF9zaXplLnRzIiwiLi4vc3JjL3N5bWJvbC9hbmNob3IudHMiLCIuLi9zcmMvc3ltYm9sL2NoZWNrX21heF9hbmdsZS50cyIsIi4uL3NyYy9zeW1ib2wvZ2V0X2FuY2hvcnMudHMiLCIuLi9zcmMvc3ltYm9sL2NsaXBfbGluZS50cyIsIi4uL3NyYy9zeW1ib2wvcXVhZHMudHMiLCIuLi9zcmMvc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlLnRzIiwiLi4vbm9kZV9tb2R1bGVzL3RpbnlxdWV1ZS9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2ZpbmRfcG9sZV9vZl9pbmFjY2Vzc2liaWxpdHkudHMiLCIuLi9zcmMvc3ltYm9sL3N5bWJvbF9sYXlvdXQudHMiLCIuLi9zcmMvZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC50cyIsIi4uL3NyYy91dGlsL3Jlc29sdmVfdG9rZW5zLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmcudHMiLCIuLi9zcmMvc3R5bGUvZm9ybWF0X3NlY3Rpb25fb3ZlcnJpZGUudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5nLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXIudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvcmFzdGVyX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuZy50cyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXIudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyLnRzIiwiLi4vc3JjL3N0eWxlL2NyZWF0ZV9zdHlsZV9sYXllci50cyIsIi4uL3NyYy91dGlsL3Rocm90dGxlZF9pbnZva2VyLnRzIiwiLi4vc3JjL3V0aWwvYWN0b3IudHMiLCIuLi9zcmMvZ2VvL2xuZ19sYXQudHMiLCIuLi9zcmMvZ2VvL2xuZ19sYXRfYm91bmRzLnRzIiwiLi4vc3JjL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLnRzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvd2hvb3RzLWpzL2luZGV4Lm1qcyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9pZC50cyIsIi4uL3NyYy9kYXRhL2RlbV9kYXRhLnRzIiwiLi4vc3JjL3V0aWwvZGljdGlvbmFyeV9jb2Rlci50cyIsIi4uL3NyYy91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvbi50cyIsIi4uL3NyYy9kYXRhL2ZlYXR1cmVfaW5kZXgudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3JlZl9wcm9wZXJ0aWVzLnRzIiwiLi4vc3JjL3V0aWwvcGVyZm9ybWFuY2UudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9ncm91cF9ieV9sYXlvdXQudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXJfaW5kZXgudHMiLCIuLi9zcmMvcmVuZGVyL2dseXBoX2F0bGFzLnRzIiwiLi4vc3JjL3NvdXJjZS93b3JrZXJfdGlsZS50cyIsIi4uL3NyYy9zb3VyY2UvdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZS50cyIsIi4uL3NyYy9zb3VyY2UvcmFzdGVyX2RlbV90aWxlX3dvcmtlcl9zb3VyY2UudHMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC9nZW9qc29uLXJld2luZC9pbmRleC5qcyIsIi4uL3NyYy9zb3VyY2UvZ2VvanNvbl93cmFwcGVyLnRzIiwiLi4vbm9kZV9tb2R1bGVzL3Z0LXBiZi9saWIvZ2VvanNvbl93cmFwcGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Z0LXBiZi9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9rZGJ1c2gvc3JjL3NvcnQuanMiLCIuLi9ub2RlX21vZHVsZXMva2RidXNoL3NyYy9yYW5nZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9rZGJ1c2gvc3JjL3dpdGhpbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9rZGJ1c2gvc3JjL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3N1cGVyY2x1c3Rlci9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9mZWF0dXJlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NvbnZlcnQuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY2xpcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy93cmFwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3RyYW5zZm9ybS5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2luZGV4LmpzIiwiLi4vc3JjL3NvdXJjZS9nZW9qc29uX3dvcmtlcl9zb3VyY2UudHMiLCIuLi9zcmMvc291cmNlL3dvcmtlci50cyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQvaW5kZXguanMiLCIuLi9zcmMvdXRpbC9kb20udHMiLCIuLi9zcmMvdXRpbC9yZXF1ZXN0X21hbmFnZXIudHMiLCIuLi9zcmMvc3R5bGUvbG9hZF9zcHJpdGUudHMiLCIuLi9zcmMvcmVuZGVyL3RleHR1cmUudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfaW1hZ2UudHMiLCIuLi9zcmMvcmVuZGVyL2ltYWdlX21hbmFnZXIudHMiLCIuLi9zcmMvc3R5bGUvbG9hZF9nbHlwaF9yYW5nZS50cyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3Rpbnktc2RmL2luZGV4LmpzIiwiLi4vc3JjL3JlbmRlci9nbHlwaF9tYW5hZ2VyLnRzIiwiLi4vc3JjL3N0eWxlL2xpZ2h0LnRzIiwiLi4vc3JjL3JlbmRlci9saW5lX2F0bGFzLnRzIiwiLi4vc3JjL3V0aWwvZGlzcGF0Y2hlci50cyIsIi4uL3NyYy9zb3VyY2UvbG9hZF90aWxlanNvbi50cyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9ib3VuZHMudHMiLCIuLi9zcmMvc291cmNlL3ZlY3Rvcl90aWxlX3NvdXJjZS50cyIsIi4uL3NyYy9zb3VyY2UvcmFzdGVyX3RpbGVfc291cmNlLnRzIiwiLi4vc3JjL3V0aWwvb2Zmc2NyZWVuX2NhbnZhc19zdXBwb3J0ZWQudHMiLCIuLi9zcmMvc291cmNlL3Jhc3Rlcl9kZW1fdGlsZV9zb3VyY2UudHMiLCIuLi9zcmMvc291cmNlL2dlb2pzb25fc291cmNlLnRzIiwiLi4vc3JjL2RhdGEvcmFzdGVyX2JvdW5kc19hdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL3NvdXJjZS9pbWFnZV9zb3VyY2UudHMiLCIuLi9zcmMvc291cmNlL3ZpZGVvX3NvdXJjZS50cyIsIi4uL3NyYy9zb3VyY2UvY2FudmFzX3NvdXJjZS50cyIsIi4uL3NyYy9zb3VyY2Uvc291cmNlLnRzIiwiLi4vc3JjL3NvdXJjZS9xdWVyeV9mZWF0dXJlcy50cyIsIi4uL3NyYy9kYXRhL2J1Y2tldC50cyIsIi4uL3NyYy9zb3VyY2UvdGlsZS50cyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9jYWNoZS50cyIsIi4uL3NyYy9zb3VyY2Uvc291cmNlX3N0YXRlLnRzIiwiLi4vc3JjL3NvdXJjZS9zb3VyY2VfY2FjaGUudHMiLCIuLi9zcmMvdXRpbC93ZWJfd29ya2VyLnRzIiwiLi4vc3JjL3V0aWwvd29ya2VyX3Bvb2wudHMiLCIuLi9zcmMvdXRpbC9nbG9iYWxfd29ya2VyX3Bvb2wudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9kZXJlZi50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2VtcHR5LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZGlmZi50cyIsIi4uL3NyYy9zeW1ib2wvcGF0aF9pbnRlcnBvbGF0b3IudHMiLCIuLi9zcmMvc3ltYm9sL2dyaWRfaW5kZXgudHMiLCIuLi9zcmMvc3ltYm9sL3Byb2plY3Rpb24udHMiLCIuLi9zcmMvc3ltYm9sL2NvbGxpc2lvbl9pbmRleC50cyIsIi4uL3NyYy9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMudHMiLCIuLi9zcmMvc3ltYm9sL3BsYWNlbWVudC50cyIsIi4uL3NyYy9zdHlsZS9wYXVzZWFibGVfcGxhY2VtZW50LnRzIiwiLi4vc3JjL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleC50cyIsIi4uL3NyYy9zdHlsZS9zdHlsZS50cyIsIi4uL3NyYy9kYXRhL3Bvc19hdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL3NoYWRlcnMvX3ByZWx1ZGUuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvX3ByZWx1ZGUudmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2JhY2tncm91bmQuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvYmFja2dyb3VuZC52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvYmFja2dyb3VuZF9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2JhY2tncm91bmRfcGF0dGVybi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvY2lyY2xlLmZyYWdtZW50Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2NpcmNsZS52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvY2xpcHBpbmdfbWFzay5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9jbGlwcGluZ19tYXNrLnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9oZWF0bWFwLmZyYWdtZW50Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2hlYXRtYXAudmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2hlYXRtYXBfdGV4dHVyZS5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9oZWF0bWFwX3RleHR1cmUudmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2NvbGxpc2lvbl9ib3guZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvY29sbGlzaW9uX2JveC52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvY29sbGlzaW9uX2NpcmNsZS5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9jb2xsaXNpb25fY2lyY2xlLnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9kZWJ1Zy5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9kZWJ1Zy52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbC5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9maWxsLnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9maWxsX291dGxpbmUuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbF9vdXRsaW5lLnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9maWxsX291dGxpbmVfcGF0dGVybi5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9maWxsX291dGxpbmVfcGF0dGVybi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbF9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2ZpbGxfcGF0dGVybi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbF9leHRydXNpb24uZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbF9leHRydXNpb24udmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2ZpbGxfZXh0cnVzaW9uX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbF9leHRydXNpb25fcGF0dGVybi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvaGlsbHNoYWRlX3ByZXBhcmUuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvaGlsbHNoYWRlX3ByZXBhcmUudmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2hpbGxzaGFkZS5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9oaWxsc2hhZGUudmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2xpbmUuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvbGluZS52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvbGluZV9ncmFkaWVudC5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9saW5lX2dyYWRpZW50LnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9saW5lX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvbGluZV9wYXR0ZXJuLnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9saW5lX3NkZi5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9saW5lX3NkZi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvcmFzdGVyLmZyYWdtZW50Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL3Jhc3Rlci52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvc3ltYm9sX2ljb24uZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvc3ltYm9sX2ljb24udmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL3N5bWJvbF9zZGYuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvc3ltYm9sX3NkZi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvc3ltYm9sX3RleHRfYW5kX2ljb24uZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvc3ltYm9sX3RleHRfYW5kX2ljb24udmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL3NoYWRlcnMudHMiLCIuLi9zcmMvcmVuZGVyL3ZlcnRleF9hcnJheV9vYmplY3QudHMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0udHMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vcGF0dGVybi50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9maWxsX2V4dHJ1c2lvbl9wcm9ncmFtLnRzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2ZpbGxfcHJvZ3JhbS50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9jaXJjbGVfcHJvZ3JhbS50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9jb2xsaXNpb25fcHJvZ3JhbS50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9kZWJ1Z19wcm9ncmFtLnRzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2NsaXBwaW5nX21hc2tfcHJvZ3JhbS50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9oZWF0bWFwX3Byb2dyYW0udHMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vaGlsbHNoYWRlX3Byb2dyYW0udHMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vbGluZV9wcm9ncmFtLnRzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3Jhc3Rlcl9wcm9ncmFtLnRzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3N5bWJvbF9wcm9ncmFtLnRzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2JhY2tncm91bmRfcHJvZ3JhbS50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9wcm9ncmFtX3VuaWZvcm1zLnRzIiwiLi4vc3JjL2dsL2luZGV4X2J1ZmZlci50cyIsIi4uL3NyYy9nbC92ZXJ0ZXhfYnVmZmVyLnRzIiwiLi4vc3JjL2dsL3ZhbHVlLnRzIiwiLi4vc3JjL2dsL2ZyYW1lYnVmZmVyLnRzIiwiLi4vc3JjL2dsL2NvbG9yX21vZGUudHMiLCIuLi9zcmMvZ2wvY29udGV4dC50cyIsIi4uL3NyYy9nbC9kZXB0aF9tb2RlLnRzIiwiLi4vc3JjL2dsL3N0ZW5jaWxfbW9kZS50cyIsIi4uL3NyYy9nbC9jdWxsX2ZhY2VfbW9kZS50cyIsIi4uL3NyYy9yZW5kZXIvZHJhd19jb2xsaXNpb25fZGVidWcudHMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfc3ltYm9sLnRzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2NpcmNsZS50cyIsIi4uL3NyYy9yZW5kZXIvZHJhd19oZWF0bWFwLnRzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2xpbmUudHMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfZmlsbC50cyIsIi4uL3NyYy9yZW5kZXIvZHJhd19maWxsX2V4dHJ1c2lvbi50cyIsIi4uL3NyYy9yZW5kZXIvZHJhd19oaWxsc2hhZGUudHMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfcmFzdGVyLnRzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2JhY2tncm91bmQudHMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfZGVidWcudHMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfY3VzdG9tLnRzIiwiLi4vc3JjL3JlbmRlci9wYWludGVyLnRzIiwiLi4vc3JjL3V0aWwvcHJpbWl0aXZlcy50cyIsIi4uL3NyYy9nZW8vZWRnZV9pbnNldHMudHMiLCIuLi9zcmMvZ2VvL3RyYW5zZm9ybS50cyIsIi4uL3NyYy91dGlsL3Rocm90dGxlLnRzIiwiLi4vc3JjL3VpL2hhc2gudHMiLCIuLi9zcmMvdWkvaGFuZGxlcl9pbmVydGlhLnRzIiwiLi4vc3JjL3VpL2V2ZW50cy50cyIsIi4uL3NyYy91aS9oYW5kbGVyL21hcF9ldmVudC50cyIsIi4uL3NyYy91aS9oYW5kbGVyL2JveF96b29tLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvaGFuZGxlcl91dGlsLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdGFwX3JlY29nbml6ZXIudHMiLCIuLi9zcmMvdWkvaGFuZGxlci90YXBfem9vbS50cyIsIi4uL3NyYy91aS9oYW5kbGVyL21vdXNlLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdG91Y2hfcGFuLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdG91Y2hfem9vbV9yb3RhdGUudHMiLCIuLi9zcmMvdWkvaGFuZGxlci9rZXlib2FyZC50cyIsIi4uL3NyYy91aS9oYW5kbGVyL3Njcm9sbF96b29tLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2hpbS9kYmxjbGlja196b29tLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvY2xpY2tfem9vbS50cyIsIi4uL3NyYy91aS9oYW5kbGVyL3RhcF9kcmFnX3pvb20udHMiLCIuLi9zcmMvdWkvaGFuZGxlci9zaGltL2RyYWdfcGFuLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2hpbS9kcmFnX3JvdGF0ZS50cyIsIi4uL3NyYy91aS9oYW5kbGVyL3NoaW0vdG91Y2hfem9vbV9yb3RhdGUudHMiLCIuLi9zcmMvdWkvaGFuZGxlcl9tYW5hZ2VyLnRzIiwiLi4vc3JjL3V0aWwvZGVidWcudHMiLCIuLi9zcmMvdWkvY2FtZXJhLnRzIiwiLi4vc3JjL3VpL2NvbnRyb2wvYXR0cmlidXRpb25fY29udHJvbC50cyIsIi4uL3NyYy91aS9jb250cm9sL2xvZ29fY29udHJvbC50cyIsIi4uL3NyYy91dGlsL3Rhc2tfcXVldWUudHMiLCIuLi9zcmMvdWkvZGVmYXVsdF9sb2NhbGUudHMiLCIuLi9zcmMvdWkvbWFwLnRzIiwiLi4vc3JjL3VpL2NvbnRyb2wvbmF2aWdhdGlvbl9jb250cm9sLnRzIiwiLi4vc3JjL3V0aWwvc21hcnRfd3JhcC50cyIsIi4uL3NyYy91aS9hbmNob3IudHMiLCIuLi9zcmMvdWkvbWFya2VyLnRzIiwiLi4vc3JjL3VpL2NvbnRyb2wvZ2VvbG9jYXRlX2NvbnRyb2wudHMiLCIuLi9zcmMvdWkvY29udHJvbC9zY2FsZV9jb250cm9sLnRzIiwiLi4vc3JjL3VpL2NvbnRyb2wvZnVsbHNjcmVlbl9jb250cm9sLnRzIiwiLi4vc3JjL3VpL3BvcHVwLnRzIiwiLi4vc3JjL2luZGV4LnRzIiwiLi4vcm9sbHVwL21hcGxpYnJlZ2wuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG9iamVjdEFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxuLy8gY29tcGFyZSBhbmQgaXNCdWZmZXIgdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9ibG9iLzY4MGU5ZTVlNDg4ZjIyYWFjMjc1OTlhNTdkYzg0NGE2MzE1OTI4ZGQvaW5kZXguanNcbi8vIG9yaWdpbmFsIG5vdGljZTpcblxuLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2YXIgeCA9IGEubGVuZ3RoO1xuICB2YXIgeSA9IGIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldO1xuICAgICAgeSA9IGJbaV07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKHkgPCB4KSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBpc0J1ZmZlcihiKSB7XG4gIGlmIChnbG9iYWwuQnVmZmVyICYmIHR5cGVvZiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXIoYik7XG4gIH1cbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcik7XG59XG5cbi8vIGJhc2VkIG9uIG5vZGUgYXNzZXJ0LCBvcmlnaW5hbCBub3RpY2U6XG4vLyBOQjogVGhlIFVSTCB0byB0aGUgQ29tbW9uSlMgc3BlYyBpcyBrZXB0IGp1c3QgZm9yIHRyYWRpdGlvbi5cbi8vICAgICBub2RlLWFzc2VydCBoYXMgZXZvbHZlZCBhIGxvdCBzaW5jZSB0aGVuLCBib3RoIGluIEFQSSBhbmQgYmVoYXZpb3IuXG5cbi8vIGh0dHA6Ly93aWtpLmNvbW1vbmpzLm9yZy93aWtpL1VuaXRfVGVzdGluZy8xLjBcbi8vXG4vLyBUSElTIElTIE5PVCBURVNURUQgTk9SIExJS0VMWSBUTyBXT1JLIE9VVFNJREUgVjghXG4vL1xuLy8gT3JpZ2luYWxseSBmcm9tIG5hcndoYWwuanMgKGh0dHA6Ly9uYXJ3aGFsanMub3JnKVxuLy8gQ29weXJpZ2h0IChjKSAyMDA5IFRob21hcyBSb2JpbnNvbiA8Mjgwbm9ydGguY29tPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU5cbi8vIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbi8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwvJyk7XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgZnVuY3Rpb25zSGF2ZU5hbWVzID0gKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvbygpIHt9Lm5hbWUgPT09ICdmb28nO1xufSgpKTtcbmZ1bmN0aW9uIHBUb1N0cmluZyAob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbn1cbmZ1bmN0aW9uIGlzVmlldyhhcnJidWYpIHtcbiAgaWYgKGlzQnVmZmVyKGFycmJ1ZikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGFycmJ1Zik7XG4gIH1cbiAgaWYgKCFhcnJidWYpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGFycmJ1ZiBpbnN0YW5jZW9mIERhdGFWaWV3KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGFycmJ1Zi5idWZmZXIgJiYgYXJyYnVmLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuLy8gMS4gVGhlIGFzc2VydCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRoYXQgdGhyb3dcbi8vIEFzc2VydGlvbkVycm9yJ3Mgd2hlbiBwYXJ0aWN1bGFyIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQuIFRoZVxuLy8gYXNzZXJ0IG1vZHVsZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UuXG5cbnZhciBhc3NlcnQgPSBtb2R1bGUuZXhwb3J0cyA9IG9rO1xuXG4vLyAyLiBUaGUgQXNzZXJ0aW9uRXJyb3IgaXMgZGVmaW5lZCBpbiBhc3NlcnQuXG4vLyBuZXcgYXNzZXJ0LkFzc2VydGlvbkVycm9yKHsgbWVzc2FnZTogbWVzc2FnZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogZXhwZWN0ZWQgfSlcblxudmFyIHJlZ2V4ID0gL1xccypmdW5jdGlvblxccysoW15cXChcXHNdKilcXHMqLztcbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvZnVuY3Rpb24ucHJvdG90eXBlLm5hbWUvYmxvYi9hZGVlZWVjOGJmY2M2MDY4YjE4N2Q3ZDlmYjNkNWJiMWQzYTMwODk5L2ltcGxlbWVudGF0aW9uLmpzXG5mdW5jdGlvbiBnZXROYW1lKGZ1bmMpIHtcbiAgaWYgKCF1dGlsLmlzRnVuY3Rpb24oZnVuYykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGZ1bmN0aW9uc0hhdmVOYW1lcykge1xuICAgIHJldHVybiBmdW5jLm5hbWU7XG4gIH1cbiAgdmFyIHN0ciA9IGZ1bmMudG9TdHJpbmcoKTtcbiAgdmFyIG1hdGNoID0gc3RyLm1hdGNoKHJlZ2V4KTtcbiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdO1xufVxuYXNzZXJ0LkFzc2VydGlvbkVycm9yID0gZnVuY3Rpb24gQXNzZXJ0aW9uRXJyb3Iob3B0aW9ucykge1xuICB0aGlzLm5hbWUgPSAnQXNzZXJ0aW9uRXJyb3InO1xuICB0aGlzLmFjdHVhbCA9IG9wdGlvbnMuYWN0dWFsO1xuICB0aGlzLmV4cGVjdGVkID0gb3B0aW9ucy5leHBlY3RlZDtcbiAgdGhpcy5vcGVyYXRvciA9IG9wdGlvbnMub3BlcmF0b3I7XG4gIGlmIChvcHRpb25zLm1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2U7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5tZXNzYWdlID0gZ2V0TWVzc2FnZSh0aGlzKTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSB0cnVlO1xuICB9XG4gIHZhciBzdGFja1N0YXJ0RnVuY3Rpb24gPSBvcHRpb25zLnN0YWNrU3RhcnRGdW5jdGlvbiB8fCBmYWlsO1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vbiB2OCBicm93c2VycyBzbyB3ZSBjYW4gaGF2ZSBhIHN0YWNrdHJhY2VcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCk7XG4gICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgdmFyIG91dCA9IGVyci5zdGFjaztcblxuICAgICAgLy8gdHJ5IHRvIHN0cmlwIHVzZWxlc3MgZnJhbWVzXG4gICAgICB2YXIgZm5fbmFtZSA9IGdldE5hbWUoc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgICAgIHZhciBpZHggPSBvdXQuaW5kZXhPZignXFxuJyArIGZuX25hbWUpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIC8vIG9uY2Ugd2UgaGF2ZSBsb2NhdGVkIHRoZSBmdW5jdGlvbiBmcmFtZVxuICAgICAgICAvLyB3ZSBuZWVkIHRvIHN0cmlwIG91dCBldmVyeXRoaW5nIGJlZm9yZSBpdCAoYW5kIGl0cyBsaW5lKVxuICAgICAgICB2YXIgbmV4dF9saW5lID0gb3V0LmluZGV4T2YoJ1xcbicsIGlkeCArIDEpO1xuICAgICAgICBvdXQgPSBvdXQuc3Vic3RyaW5nKG5leHRfbGluZSArIDEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YWNrID0gb3V0O1xuICAgIH1cbiAgfVxufTtcblxuLy8gYXNzZXJ0LkFzc2VydGlvbkVycm9yIGluc3RhbmNlb2YgRXJyb3JcbnV0aWwuaW5oZXJpdHMoYXNzZXJ0LkFzc2VydGlvbkVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIHRydW5jYXRlKHMsIG4pIHtcbiAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzLmxlbmd0aCA8IG4gPyBzIDogcy5zbGljZSgwLCBuKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcztcbiAgfVxufVxuZnVuY3Rpb24gaW5zcGVjdChzb21ldGhpbmcpIHtcbiAgaWYgKGZ1bmN0aW9uc0hhdmVOYW1lcyB8fCAhdXRpbC5pc0Z1bmN0aW9uKHNvbWV0aGluZykpIHtcbiAgICByZXR1cm4gdXRpbC5pbnNwZWN0KHNvbWV0aGluZyk7XG4gIH1cbiAgdmFyIHJhd25hbWUgPSBnZXROYW1lKHNvbWV0aGluZyk7XG4gIHZhciBuYW1lID0gcmF3bmFtZSA/ICc6ICcgKyByYXduYW1lIDogJyc7XG4gIHJldHVybiAnW0Z1bmN0aW9uJyArICBuYW1lICsgJ10nO1xufVxuZnVuY3Rpb24gZ2V0TWVzc2FnZShzZWxmKSB7XG4gIHJldHVybiB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuYWN0dWFsKSwgMTI4KSArICcgJyArXG4gICAgICAgICBzZWxmLm9wZXJhdG9yICsgJyAnICtcbiAgICAgICAgIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5leHBlY3RlZCksIDEyOCk7XG59XG5cbi8vIEF0IHByZXNlbnQgb25seSB0aGUgdGhyZWUga2V5cyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgYW5kXG4vLyB1bmRlcnN0b29kIGJ5IHRoZSBzcGVjLiBJbXBsZW1lbnRhdGlvbnMgb3Igc3ViIG1vZHVsZXMgY2FuIHBhc3Ncbi8vIG90aGVyIGtleXMgdG8gdGhlIEFzc2VydGlvbkVycm9yJ3MgY29uc3RydWN0b3IgLSB0aGV5IHdpbGwgYmVcbi8vIGlnbm9yZWQuXG5cbi8vIDMuIEFsbCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtdXN0IHRocm93IGFuIEFzc2VydGlvbkVycm9yXG4vLyB3aGVuIGEgY29ycmVzcG9uZGluZyBjb25kaXRpb24gaXMgbm90IG1ldCwgd2l0aCBhIG1lc3NhZ2UgdGhhdFxuLy8gbWF5IGJlIHVuZGVmaW5lZCBpZiBub3QgcHJvdmlkZWQuICBBbGwgYXNzZXJ0aW9uIG1ldGhvZHMgcHJvdmlkZVxuLy8gYm90aCB0aGUgYWN0dWFsIGFuZCBleHBlY3RlZCB2YWx1ZXMgdG8gdGhlIGFzc2VydGlvbiBlcnJvciBmb3Jcbi8vIGRpc3BsYXkgcHVycG9zZXMuXG5cbmZ1bmN0aW9uIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IsIHN0YWNrU3RhcnRGdW5jdGlvbikge1xuICB0aHJvdyBuZXcgYXNzZXJ0LkFzc2VydGlvbkVycm9yKHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGFjdHVhbDogYWN0dWFsLFxuICAgIGV4cGVjdGVkOiBleHBlY3RlZCxcbiAgICBvcGVyYXRvcjogb3BlcmF0b3IsXG4gICAgc3RhY2tTdGFydEZ1bmN0aW9uOiBzdGFja1N0YXJ0RnVuY3Rpb25cbiAgfSk7XG59XG5cbi8vIEVYVEVOU0lPTiEgYWxsb3dzIGZvciB3ZWxsIGJlaGF2ZWQgZXJyb3JzIGRlZmluZWQgZWxzZXdoZXJlLlxuYXNzZXJ0LmZhaWwgPSBmYWlsO1xuXG4vLyA0LiBQdXJlIGFzc2VydGlvbiB0ZXN0cyB3aGV0aGVyIGEgdmFsdWUgaXMgdHJ1dGh5LCBhcyBkZXRlcm1pbmVkXG4vLyBieSAhIWd1YXJkLlxuLy8gYXNzZXJ0Lm9rKGd1YXJkLCBtZXNzYWdlX29wdCk7XG4vLyBUaGlzIHN0YXRlbWVudCBpcyBlcXVpdmFsZW50IHRvIGFzc2VydC5lcXVhbCh0cnVlLCAhIWd1YXJkLFxuLy8gbWVzc2FnZV9vcHQpOy4gVG8gdGVzdCBzdHJpY3RseSBmb3IgdGhlIHZhbHVlIHRydWUsIHVzZVxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKHRydWUsIGd1YXJkLCBtZXNzYWdlX29wdCk7LlxuXG5mdW5jdGlvbiBvayh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBhc3NlcnQub2spO1xufVxuYXNzZXJ0Lm9rID0gb2s7XG5cbi8vIDUuIFRoZSBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc2hhbGxvdywgY29lcmNpdmUgZXF1YWxpdHkgd2l0aFxuLy8gPT0uXG4vLyBhc3NlcnQuZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuZXF1YWwgPSBmdW5jdGlvbiBlcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT0gZXhwZWN0ZWQpIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09JywgYXNzZXJ0LmVxdWFsKTtcbn07XG5cbi8vIDYuIFRoZSBub24tZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIGZvciB3aGV0aGVyIHR3byBvYmplY3RzIGFyZSBub3QgZXF1YWxcbi8vIHdpdGggIT0gYXNzZXJ0Lm5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdEVxdWFsID0gZnVuY3Rpb24gbm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT0nLCBhc3NlcnQubm90RXF1YWwpO1xuICB9XG59O1xuXG4vLyA3LiBUaGUgZXF1aXZhbGVuY2UgYXNzZXJ0aW9uIHRlc3RzIGEgZGVlcCBlcXVhbGl0eSByZWxhdGlvbi5cbi8vIGFzc2VydC5kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuZGVlcEVxdWFsID0gZnVuY3Rpb24gZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIGZhbHNlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBFcXVhbCcsIGFzc2VydC5kZWVwRXF1YWwpO1xuICB9XG59O1xuXG5hc3NlcnQuZGVlcFN0cmljdEVxdWFsID0gZnVuY3Rpb24gZGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHRydWUpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcFN0cmljdEVxdWFsJywgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgc3RyaWN0LCBtZW1vcykge1xuICAvLyA3LjEuIEFsbCBpZGVudGljYWwgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbiAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0J1ZmZlcihhY3R1YWwpICYmIGlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBjb21wYXJlKGFjdHVhbCwgZXhwZWN0ZWQpID09PSAwO1xuXG4gIC8vIDcuMi4gSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgRGF0ZSBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgRGF0ZSBvYmplY3QgdGhhdCByZWZlcnMgdG8gdGhlIHNhbWUgdGltZS5cbiAgfSBlbHNlIGlmICh1dGlsLmlzRGF0ZShhY3R1YWwpICYmIHV0aWwuaXNEYXRlKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgUmVnRXhwIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNvdXJjZSBhbmRcbiAgLy8gcHJvcGVydGllcyAoYGdsb2JhbGAsIGBtdWx0aWxpbmVgLCBgbGFzdEluZGV4YCwgYGlnbm9yZUNhc2VgKS5cbiAgfSBlbHNlIGlmICh1dGlsLmlzUmVnRXhwKGFjdHVhbCkgJiYgdXRpbC5pc1JlZ0V4cChleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLnNvdXJjZSA9PT0gZXhwZWN0ZWQuc291cmNlICYmXG4gICAgICAgICAgIGFjdHVhbC5nbG9iYWwgPT09IGV4cGVjdGVkLmdsb2JhbCAmJlxuICAgICAgICAgICBhY3R1YWwubXVsdGlsaW5lID09PSBleHBlY3RlZC5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgYWN0dWFsLmxhc3RJbmRleCA9PT0gZXhwZWN0ZWQubGFzdEluZGV4ICYmXG4gICAgICAgICAgIGFjdHVhbC5pZ25vcmVDYXNlID09PSBleHBlY3RlZC5pZ25vcmVDYXNlO1xuXG4gIC8vIDcuNC4gT3RoZXIgcGFpcnMgdGhhdCBkbyBub3QgYm90aCBwYXNzIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyxcbiAgLy8gZXF1aXZhbGVuY2UgaXMgZGV0ZXJtaW5lZCBieSA9PS5cbiAgfSBlbHNlIGlmICgoYWN0dWFsID09PSBudWxsIHx8IHR5cGVvZiBhY3R1YWwgIT09ICdvYmplY3QnKSAmJlxuICAgICAgICAgICAgIChleHBlY3RlZCA9PT0gbnVsbCB8fCB0eXBlb2YgZXhwZWN0ZWQgIT09ICdvYmplY3QnKSkge1xuICAgIHJldHVybiBzdHJpY3QgPyBhY3R1YWwgPT09IGV4cGVjdGVkIDogYWN0dWFsID09IGV4cGVjdGVkO1xuXG4gIC8vIElmIGJvdGggdmFsdWVzIGFyZSBpbnN0YW5jZXMgb2YgdHlwZWQgYXJyYXlzLCB3cmFwIHRoZWlyIHVuZGVybHlpbmdcbiAgLy8gQXJyYXlCdWZmZXJzIGluIGEgQnVmZmVyIGVhY2ggdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2VcbiAgLy8gVGhpcyBvcHRpbWl6YXRpb24gcmVxdWlyZXMgdGhlIGFycmF5cyB0byBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgY2hlY2tlZCBieVxuICAvLyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIChha2EgcFRvU3RyaW5nKS4gTmV2ZXIgcGVyZm9ybSBiaW5hcnlcbiAgLy8gY29tcGFyaXNvbnMgZm9yIEZsb2F0KkFycmF5cywgdGhvdWdoLCBzaW5jZSBlLmcuICswID09PSAtMCBidXQgdGhlaXJcbiAgLy8gYml0IHBhdHRlcm5zIGFyZSBub3QgaWRlbnRpY2FsLlxuICB9IGVsc2UgaWYgKGlzVmlldyhhY3R1YWwpICYmIGlzVmlldyhleHBlY3RlZCkgJiZcbiAgICAgICAgICAgICBwVG9TdHJpbmcoYWN0dWFsKSA9PT0gcFRvU3RyaW5nKGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgICEoYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8XG4gICAgICAgICAgICAgICBhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUobmV3IFVpbnQ4QXJyYXkoYWN0dWFsLmJ1ZmZlciksXG4gICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoZXhwZWN0ZWQuYnVmZmVyKSkgPT09IDA7XG5cbiAgLy8gNy41IEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgLy8gZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gIC8vIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgLy8gKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAvLyBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAvLyBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgfSBlbHNlIGlmIChpc0J1ZmZlcihhY3R1YWwpICE9PSBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgbWVtb3MgPSBtZW1vcyB8fCB7YWN0dWFsOiBbXSwgZXhwZWN0ZWQ6IFtdfTtcblxuICAgIHZhciBhY3R1YWxJbmRleCA9IG1lbW9zLmFjdHVhbC5pbmRleE9mKGFjdHVhbCk7XG4gICAgaWYgKGFjdHVhbEluZGV4ICE9PSAtMSkge1xuICAgICAgaWYgKGFjdHVhbEluZGV4ID09PSBtZW1vcy5leHBlY3RlZC5pbmRleE9mKGV4cGVjdGVkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtZW1vcy5hY3R1YWwucHVzaChhY3R1YWwpO1xuICAgIG1lbW9zLmV4cGVjdGVkLnB1c2goZXhwZWN0ZWQpO1xuXG4gICAgcmV0dXJuIG9iakVxdWl2KGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG59XG5cbmZ1bmN0aW9uIG9iakVxdWl2KGEsIGIsIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpIHtcbiAgaWYgKGEgPT09IG51bGwgfHwgYSA9PT0gdW5kZWZpbmVkIHx8IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy8gaWYgb25lIGlzIGEgcHJpbWl0aXZlLCB0aGUgb3RoZXIgbXVzdCBiZSBzYW1lXG4gIGlmICh1dGlsLmlzUHJpbWl0aXZlKGEpIHx8IHV0aWwuaXNQcmltaXRpdmUoYikpXG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIGlmIChzdHJpY3QgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpICE9PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB2YXIgYUlzQXJncyA9IGlzQXJndW1lbnRzKGEpO1xuICB2YXIgYklzQXJncyA9IGlzQXJndW1lbnRzKGIpO1xuICBpZiAoKGFJc0FyZ3MgJiYgIWJJc0FyZ3MpIHx8ICghYUlzQXJncyAmJiBiSXNBcmdzKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChhSXNBcmdzKSB7XG4gICAgYSA9IHBTbGljZS5jYWxsKGEpO1xuICAgIGIgPSBwU2xpY2UuY2FsbChiKTtcbiAgICByZXR1cm4gX2RlZXBFcXVhbChhLCBiLCBzdHJpY3QpO1xuICB9XG4gIHZhciBrYSA9IG9iamVjdEtleXMoYSk7XG4gIHZhciBrYiA9IG9iamVjdEtleXMoYik7XG4gIHZhciBrZXksIGk7XG4gIC8vIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoa2V5cyBpbmNvcnBvcmF0ZXNcbiAgLy8gaGFzT3duUHJvcGVydHkpXG4gIGlmIChrYS5sZW5ndGggIT09IGtiLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vdGhlIHNhbWUgc2V0IG9mIGtleXMgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksXG4gIGthLnNvcnQoKTtcbiAga2Iuc29ydCgpO1xuICAvL35+fmNoZWFwIGtleSB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGthW2ldICE9PSBrYltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL2VxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kXG4gIC8vfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghX2RlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgc3RyaWN0LCBhY3R1YWxWaXNpdGVkT2JqZWN0cykpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIDguIFRoZSBub24tZXF1aXZhbGVuY2UgYXNzZXJ0aW9uIHRlc3RzIGZvciBhbnkgZGVlcCBpbmVxdWFsaXR5LlxuLy8gYXNzZXJ0Lm5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3REZWVwRXF1YWwgPSBmdW5jdGlvbiBub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwRXF1YWwnLCBhc3NlcnQubm90RGVlcEVxdWFsKTtcbiAgfVxufTtcblxuYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbCA9IG5vdERlZXBTdHJpY3RFcXVhbDtcbmZ1bmN0aW9uIG5vdERlZXBTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHRydWUpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcFN0cmljdEVxdWFsJywgbm90RGVlcFN0cmljdEVxdWFsKTtcbiAgfVxufVxuXG5cbi8vIDkuIFRoZSBzdHJpY3QgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHN0cmljdCBlcXVhbGl0eSwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBzdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT09JywgYXNzZXJ0LnN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gMTAuIFRoZSBzdHJpY3Qgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igc3RyaWN0IGluZXF1YWxpdHksIGFzXG4vLyBkZXRlcm1pbmVkIGJ5ICE9PS4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIG5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPT0nLCBhc3NlcnQubm90U3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXhwZWN0ZWQpID09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG4gICAgcmV0dXJuIGV4cGVjdGVkLnRlc3QoYWN0dWFsKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGFjdHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZ25vcmUuICBUaGUgaW5zdGFuY2VvZiBjaGVjayBkb2Vzbid0IHdvcmsgZm9yIGFycm93IGZ1bmN0aW9ucy5cbiAgfVxuXG4gIGlmIChFcnJvci5pc1Byb3RvdHlwZU9mKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBleHBlY3RlZC5jYWxsKHt9LCBhY3R1YWwpID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBfdHJ5QmxvY2soYmxvY2spIHtcbiAgdmFyIGVycm9yO1xuICB0cnkge1xuICAgIGJsb2NrKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvciA9IGU7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG5mdW5jdGlvbiBfdGhyb3dzKHNob3VsZFRocm93LCBibG9jaywgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGFjdHVhbDtcblxuICBpZiAodHlwZW9mIGJsb2NrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJibG9ja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ3N0cmluZycpIHtcbiAgICBtZXNzYWdlID0gZXhwZWN0ZWQ7XG4gICAgZXhwZWN0ZWQgPSBudWxsO1xuICB9XG5cbiAgYWN0dWFsID0gX3RyeUJsb2NrKGJsb2NrKTtcblxuICBtZXNzYWdlID0gKGV4cGVjdGVkICYmIGV4cGVjdGVkLm5hbWUgPyAnICgnICsgZXhwZWN0ZWQubmFtZSArICcpLicgOiAnLicpICtcbiAgICAgICAgICAgIChtZXNzYWdlID8gJyAnICsgbWVzc2FnZSA6ICcuJyk7XG5cbiAgaWYgKHNob3VsZFRocm93ICYmICFhY3R1YWwpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdNaXNzaW5nIGV4cGVjdGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIHZhciB1c2VyUHJvdmlkZWRNZXNzYWdlID0gdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnO1xuICB2YXIgaXNVbndhbnRlZEV4Y2VwdGlvbiA9ICFzaG91bGRUaHJvdyAmJiB1dGlsLmlzRXJyb3IoYWN0dWFsKTtcbiAgdmFyIGlzVW5leHBlY3RlZEV4Y2VwdGlvbiA9ICFzaG91bGRUaHJvdyAmJiBhY3R1YWwgJiYgIWV4cGVjdGVkO1xuXG4gIGlmICgoaXNVbndhbnRlZEV4Y2VwdGlvbiAmJlxuICAgICAgdXNlclByb3ZpZGVkTWVzc2FnZSAmJlxuICAgICAgZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8XG4gICAgICBpc1VuZXhwZWN0ZWRFeGNlcHRpb24pIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdHb3QgdW53YW50ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgaWYgKChzaG91bGRUaHJvdyAmJiBhY3R1YWwgJiYgZXhwZWN0ZWQgJiZcbiAgICAgICFleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkgfHwgKCFzaG91bGRUaHJvdyAmJiBhY3R1YWwpKSB7XG4gICAgdGhyb3cgYWN0dWFsO1xuICB9XG59XG5cbi8vIDExLiBFeHBlY3RlZCB0byB0aHJvdyBhbiBlcnJvcjpcbi8vIGFzc2VydC50aHJvd3MoYmxvY2ssIEVycm9yX29wdCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQudGhyb3dzID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3ModHJ1ZSwgYmxvY2ssIGVycm9yLCBtZXNzYWdlKTtcbn07XG5cbi8vIEVYVEVOU0lPTiEgVGhpcyBpcyBhbm5veWluZyB0byB3cml0ZSBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKGZhbHNlLCBibG9jaywgZXJyb3IsIG1lc3NhZ2UpO1xufTtcblxuYXNzZXJ0LmlmRXJyb3IgPSBmdW5jdGlvbihlcnIpIHsgaWYgKGVycikgdGhyb3cgZXJyOyB9O1xuXG4vLyBFeHBvc2UgYSBzdHJpY3Qgb25seSB2YXJpYW50IG9mIGFzc2VydFxuZnVuY3Rpb24gc3RyaWN0KHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIGZhaWwodmFsdWUsIHRydWUsIG1lc3NhZ2UsICc9PScsIHN0cmljdCk7XG59XG5hc3NlcnQuc3RyaWN0ID0gb2JqZWN0QXNzaWduKHN0cmljdCwgYXNzZXJ0LCB7XG4gIGVxdWFsOiBhc3NlcnQuc3RyaWN0RXF1YWwsXG4gIGRlZXBFcXVhbDogYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCxcbiAgbm90RXF1YWw6IGFzc2VydC5ub3RTdHJpY3RFcXVhbCxcbiAgbm90RGVlcEVxdWFsOiBhc3NlcnQubm90RGVlcFN0cmljdEVxdWFsXG59KTtcbmFzc2VydC5zdHJpY3Quc3RyaWN0ID0gYXNzZXJ0LnN0cmljdDtcblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVW5pdEJlemllcjtcblxuZnVuY3Rpb24gVW5pdEJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHBvbHlub21pYWwgY29lZmZpY2llbnRzLCBpbXBsaWNpdCBmaXJzdCBhbmQgbGFzdCBjb250cm9sIHBvaW50cyBhcmUgKDAsMCkgYW5kICgxLDEpLlxuICAgIHRoaXMuY3ggPSAzLjAgKiBwMXg7XG4gICAgdGhpcy5ieCA9IDMuMCAqIChwMnggLSBwMXgpIC0gdGhpcy5jeDtcbiAgICB0aGlzLmF4ID0gMS4wIC0gdGhpcy5jeCAtIHRoaXMuYng7XG5cbiAgICB0aGlzLmN5ID0gMy4wICogcDF5O1xuICAgIHRoaXMuYnkgPSAzLjAgKiAocDJ5IC0gcDF5KSAtIHRoaXMuY3k7XG4gICAgdGhpcy5heSA9IDEuMCAtIHRoaXMuY3kgLSB0aGlzLmJ5O1xuXG4gICAgdGhpcy5wMXggPSBwMXg7XG4gICAgdGhpcy5wMXkgPSBwMXk7XG4gICAgdGhpcy5wMnggPSBwMng7XG4gICAgdGhpcy5wMnkgPSBwMnk7XG59XG5cblVuaXRCZXppZXIucHJvdG90eXBlID0ge1xuICAgIHNhbXBsZUN1cnZlWDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgLy8gYGF4IHReMyArIGJ4IHReMiArIGN4IHQnIGV4cGFuZGVkIHVzaW5nIEhvcm5lcidzIHJ1bGUuXG4gICAgICAgIHJldHVybiAoKHRoaXMuYXggKiB0ICsgdGhpcy5ieCkgKiB0ICsgdGhpcy5jeCkgKiB0O1xuICAgIH0sXG5cbiAgICBzYW1wbGVDdXJ2ZVk6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAoKHRoaXMuYXkgKiB0ICsgdGhpcy5ieSkgKiB0ICsgdGhpcy5jeSkgKiB0O1xuICAgIH0sXG5cbiAgICBzYW1wbGVDdXJ2ZURlcml2YXRpdmVYOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gKDMuMCAqIHRoaXMuYXggKiB0ICsgMi4wICogdGhpcy5ieCkgKiB0ICsgdGhpcy5jeDtcbiAgICB9LFxuXG4gICAgc29sdmVDdXJ2ZVg6IGZ1bmN0aW9uICh4LCBlcHNpbG9uKSB7XG4gICAgICAgIGlmIChlcHNpbG9uID09PSB1bmRlZmluZWQpIGVwc2lsb24gPSAxZS02O1xuXG4gICAgICAgIGlmICh4IDwgMC4wKSByZXR1cm4gMC4wO1xuICAgICAgICBpZiAoeCA+IDEuMCkgcmV0dXJuIDEuMDtcblxuICAgICAgICB2YXIgdCA9IHg7XG5cbiAgICAgICAgLy8gRmlyc3QgdHJ5IGEgZmV3IGl0ZXJhdGlvbnMgb2YgTmV3dG9uJ3MgbWV0aG9kIC0gbm9ybWFsbHkgdmVyeSBmYXN0LlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodCkgLSB4O1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHgyKSA8IGVwc2lsb24pIHJldHVybiB0O1xuXG4gICAgICAgICAgICB2YXIgZDIgPSB0aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgodCk7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZDIpIDwgMWUtNikgYnJlYWs7XG5cbiAgICAgICAgICAgIHQgPSB0IC0geDIgLyBkMjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgYmlzZWN0aW9uIG1ldGhvZCBmb3IgcmVsaWFiaWxpdHkuXG4gICAgICAgIHZhciB0MCA9IDAuMDtcbiAgICAgICAgdmFyIHQxID0gMS4wO1xuICAgICAgICB0ID0geDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykge1xuICAgICAgICAgICAgeDIgPSB0aGlzLnNhbXBsZUN1cnZlWCh0KTtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh4MiAtIHgpIDwgZXBzaWxvbikgYnJlYWs7XG5cbiAgICAgICAgICAgIGlmICh4ID4geDIpIHtcbiAgICAgICAgICAgICAgICB0MCA9IHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHQxID0gdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdCA9ICh0MSAtIHQwKSAqIDAuNSArIHQwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfSxcblxuICAgIHNvbHZlOiBmdW5jdGlvbiAoeCwgZXBzaWxvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zYW1wbGVDdXJ2ZVkodGhpcy5zb2x2ZUN1cnZlWCh4LCBlcHNpbG9uKSk7XG4gICAgfVxufTtcbiIsbnVsbCxudWxsLG51bGwsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQb2ludDtcblxuLyoqXG4gKiBBIHN0YW5kYWxvbmUgcG9pbnQgZ2VvbWV0cnkgd2l0aCB1c2VmdWwgYWNjZXNzb3IsIGNvbXBhcmlzb24sIGFuZFxuICogbW9kaWZpY2F0aW9uIG1ldGhvZHMuXG4gKlxuICogQGNsYXNzIFBvaW50XG4gKiBAcGFyYW0ge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlLiB0aGlzIGNvdWxkIGJlIGxvbmdpdHVkZSBvciBzY3JlZW5cbiAqIHBpeGVscywgb3IgYW55IG90aGVyIHNvcnQgb2YgdW5pdC5cbiAqIEBwYXJhbSB7TnVtYmVyfSB5IHRoZSB5LWNvb3JkaW5hdGUuIHRoaXMgY291bGQgYmUgbGF0aXR1ZGUgb3Igc2NyZWVuXG4gKiBwaXhlbHMsIG9yIGFueSBvdGhlciBzb3J0IG9mIHVuaXQuXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvaW50ID0gbmV3IFBvaW50KC03NywgMzgpO1xuICovXG5mdW5jdGlvbiBQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xufVxuXG5Qb2ludC5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSB0aGlzIHBvaW50LCByZXR1cm5pbmcgYSBuZXcgcG9pbnQgdGhhdCBjYW4gYmUgbW9kaWZpZWRcbiAgICAgKiB3aXRob3V0IGFmZmVjdGluZyB0aGUgb2xkIG9uZS5cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gdGhlIGNsb25lXG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTsgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgdG8gYW5vdGhlciBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBhZGQ6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2FkZChwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyB0byBmcm9tIHBvaW50LFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHN1YjogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IHBvaW50LFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIG11bHRCeVBvaW50OiAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHRCeVBvaW50KHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBkaXZCeVBvaW50OiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IGEgZmFjdG9yLFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IGsgZmFjdG9yXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIG11bHQ6ICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdChrKTsgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgYnkgYSBmYWN0b3IsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gayBmYWN0b3JcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgZGl2OiAgICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoayk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhpcyBwb2ludCBhcm91bmQgdGhlIDAsIDAgb3JpZ2luIGJ5IGFuIGFuZ2xlIGEsXG4gICAgICogZ2l2ZW4gaW4gcmFkaWFuc1xuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhIGFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQsIGluIHJhZGlhbnNcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgcm90YXRlOiAgZnVuY3Rpb24oYSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUoYSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhpcyBwb2ludCBhcm91bmQgcCBwb2ludCBieSBhbiBhbmdsZSBhLFxuICAgICAqIGdpdmVuIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYSBhbmdsZSB0byByb3RhdGUgYXJvdW5kLCBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCBQb2ludCB0byByb3RhdGUgYXJvdW5kXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHJvdGF0ZUFyb3VuZDogIGZ1bmN0aW9uKGEscCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGVBcm91bmQoYSxwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoaXMgcG9pbnQgYnkgYSA0eDEgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHtBcnJheTxOdW1iZXI+fSBtIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBtYXRNdWx0OiBmdW5jdGlvbihtKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQobSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhpcyBwb2ludCBidXQgYXMgYSB1bml0IHZlY3RvciBmcm9tIDAsIDAsIG1lYW5pbmdcbiAgICAgKiB0aGF0IHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByZXN1bHRpbmcgcG9pbnQgdG8gdGhlIDAsIDBcbiAgICAgKiBjb29yZGluYXRlIHdpbGwgYmUgZXF1YWwgdG8gMSBhbmQgdGhlIGFuZ2xlIGZyb20gdGhlIHJlc3VsdGluZ1xuICAgICAqIHBvaW50IHRvIHRoZSAwLCAwIGNvb3JkaW5hdGUgd2lsbCBiZSB0aGUgc2FtZSBhcyBiZWZvcmUuXG4gICAgICogQHJldHVybiB7UG9pbnR9IHVuaXQgdmVjdG9yIHBvaW50XG4gICAgICovXG4gICAgdW5pdDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTsgfSxcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgYSBwZXJwZW5kaWN1bGFyIHBvaW50LCB3aGVyZSB0aGUgbmV3IHkgY29vcmRpbmF0ZVxuICAgICAqIGlzIHRoZSBvbGQgeCBjb29yZGluYXRlIGFuZCB0aGUgbmV3IHggY29vcmRpbmF0ZSBpcyB0aGUgb2xkIHlcbiAgICAgKiBjb29yZGluYXRlIG11bHRpcGxpZWQgYnkgLTFcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gcGVycGVuZGljdWxhciBwb2ludFxuICAgICAqL1xuICAgIHBlcnA6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoaXMgcG9pbnQgd2l0aCB0aGUgeCAmIHkgY29vcmRpbmF0ZXNcbiAgICAgKiByb3VuZGVkIHRvIGludGVnZXJzLlxuICAgICAqIEByZXR1cm4ge1BvaW50fSByb3VuZGVkIHBvaW50XG4gICAgICovXG4gICAgcm91bmQ6ICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG1hZ2l0dWRlIG9mIHRoaXMgcG9pbnQ6IHRoaXMgaXMgdGhlIEV1Y2xpZGVhblxuICAgICAqIGRpc3RhbmNlIGZyb20gdGhlIDAsIDAgY29vcmRpbmF0ZSB0byB0aGlzIHBvaW50J3MgeCBhbmQgeVxuICAgICAqIGNvb3JkaW5hdGVzLlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gbWFnbml0dWRlXG4gICAgICovXG4gICAgbWFnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBKdWRnZSB3aGV0aGVyIHRoaXMgcG9pbnQgaXMgZXF1YWwgdG8gYW5vdGhlciBwb2ludCwgcmV0dXJuaW5nXG4gICAgICogdHJ1ZSBvciBmYWxzZS5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBvdGhlciB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB3aGV0aGVyIHRoZSBwb2ludHMgYXJlIGVxdWFsXG4gICAgICovXG4gICAgZXF1YWxzOiBmdW5jdGlvbihvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSBvdGhlci54ICYmXG4gICAgICAgICAgICAgICB0aGlzLnkgPT09IG90aGVyLnk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnRcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAgICAgKi9cbiAgICBkaXN0OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHApKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgcG9pbnQgdG8gYW5vdGhlciBwb2ludCxcbiAgICAgKiB3aXRob3V0IHRoZSBzcXVhcmUgcm9vdCBzdGVwLiBVc2VmdWwgaWYgeW91J3JlIGNvbXBhcmluZ1xuICAgICAqIHJlbGF0aXZlIGRpc3RhbmNlcy5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAgICAgKi9cbiAgICBkaXN0U3FyOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHZhciBkeCA9IHAueCAtIHRoaXMueCxcbiAgICAgICAgICAgIGR5ID0gcC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgZnJvbSB0aGUgMCwgMCBjb29yZGluYXRlIHRvIHRoaXMgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBjb29yZGluYXRlcy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICovXG4gICAgYW5nbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBiIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICAgKi9cbiAgICBhbmdsZVRvOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSAtIGIueSwgdGhpcy54IC0gYi54KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIGFub3RoZXIgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBiIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICAgKi9cbiAgICBhbmdsZVdpdGg6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKGIueCwgYi55KTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBGaW5kIHRoZSBhbmdsZSBvZiB0aGUgdHdvIHZlY3RvcnMsIHNvbHZpbmcgdGhlIGZvcm11bGEgZm9yXG4gICAgICogdGhlIGNyb3NzIHByb2R1Y3QgYSB4IGIgPSB8YXx8YnxzaW4ozrgpIGZvciDOuC5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHkgdGhlIHktY29vcmRpbmF0ZVxuICAgICAqIEByZXR1cm4ge051bWJlcn0gdGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAgICAgKi9cbiAgICBhbmdsZVdpdGhTZXA6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoXG4gICAgICAgICAgICB0aGlzLnggKiB5IC0gdGhpcy55ICogeCxcbiAgICAgICAgICAgIHRoaXMueCAqIHggKyB0aGlzLnkgKiB5KTtcbiAgICB9LFxuXG4gICAgX21hdE11bHQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmFyIHggPSBtWzBdICogdGhpcy54ICsgbVsxXSAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBtWzJdICogdGhpcy54ICsgbVszXSAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9hZGQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54ICs9IHAueDtcbiAgICAgICAgdGhpcy55ICs9IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9zdWI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54IC09IHAueDtcbiAgICAgICAgdGhpcy55IC09IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9tdWx0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAqPSBrO1xuICAgICAgICB0aGlzLnkgKj0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kaXY6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54IC89IGs7XG4gICAgICAgIHRoaXMueSAvPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX211bHRCeVBvaW50OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAqPSBwLng7XG4gICAgICAgIHRoaXMueSAqPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGl2QnlQb2ludDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggLz0gcC54O1xuICAgICAgICB0aGlzLnkgLz0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3VuaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9kaXYodGhpcy5tYWcoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcGVycDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xuICAgICAgICB0aGlzLnkgPSB0aGlzLng7XG4gICAgICAgIHRoaXMueCA9IC15O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdGF0ZTogZnVuY3Rpb24oYW5nbGUpIHtcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHggPSBjb3MgKiB0aGlzLnggLSBzaW4gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gc2luICogdGhpcy54ICsgY29zICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdGF0ZUFyb3VuZDogZnVuY3Rpb24oYW5nbGUsIHApIHtcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHggPSBwLnggKyBjb3MgKiAodGhpcy54IC0gcC54KSAtIHNpbiAqICh0aGlzLnkgLSBwLnkpLFxuICAgICAgICAgICAgeSA9IHAueSArIHNpbiAqICh0aGlzLnggLSBwLngpICsgY29zICogKHRoaXMueSAtIHAueSk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm91bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnggPSBNYXRoLnJvdW5kKHRoaXMueCk7XG4gICAgICAgIHRoaXMueSA9IE1hdGgucm91bmQodGhpcy55KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBwb2ludCBmcm9tIGFuIGFycmF5IGlmIG5lY2Vzc2FyeSwgb3RoZXJ3aXNlIGlmIHRoZSBpbnB1dFxuICogaXMgYWxyZWFkeSBhIFBvaW50LCBvciBhbiB1bmtub3duIHR5cGUsIHJldHVybiBpdCB1bmNoYW5nZWRcbiAqIEBwYXJhbSB7QXJyYXk8TnVtYmVyPnxQb2ludHwqfSBhIGFueSBraW5kIG9mIGlucHV0IHZhbHVlXG4gKiBAcmV0dXJuIHtQb2ludH0gY29uc3RydWN0ZWQgcG9pbnQsIG9yIHBhc3NlZC10aHJvdWdoIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqIC8vIHRoaXNcbiAqIHZhciBwb2ludCA9IFBvaW50LmNvbnZlcnQoWzAsIDFdKTtcbiAqIC8vIGlzIGVxdWl2YWxlbnQgdG9cbiAqIHZhciBwb2ludCA9IG5ldyBQb2ludCgwLCAxKTtcbiAqL1xuUG9pbnQuY29udmVydCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBQb2ludCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChhWzBdLCBhWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG59O1xuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLy8gKGMpIERlYW4gTWNOYW1lZSA8ZGVhbkBnbWFpbC5jb20+LCAyMDEyLlxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWFubS9jc3MtY29sb3ItcGFyc2VyLWpzXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbi8vIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1Ncbi8vIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci9cbnZhciBrQ1NTQ29sb3JUYWJsZSA9IHtcbiAgXCJ0cmFuc3BhcmVudFwiOiBbMCwwLDAsMF0sIFwiYWxpY2VibHVlXCI6IFsyNDAsMjQ4LDI1NSwxXSxcbiAgXCJhbnRpcXVld2hpdGVcIjogWzI1MCwyMzUsMjE1LDFdLCBcImFxdWFcIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJhcXVhbWFyaW5lXCI6IFsxMjcsMjU1LDIxMiwxXSwgXCJhenVyZVwiOiBbMjQwLDI1NSwyNTUsMV0sXG4gIFwiYmVpZ2VcIjogWzI0NSwyNDUsMjIwLDFdLCBcImJpc3F1ZVwiOiBbMjU1LDIyOCwxOTYsMV0sXG4gIFwiYmxhY2tcIjogWzAsMCwwLDFdLCBcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsMjM1LDIwNSwxXSxcbiAgXCJibHVlXCI6IFswLDAsMjU1LDFdLCBcImJsdWV2aW9sZXRcIjogWzEzOCw0MywyMjYsMV0sXG4gIFwiYnJvd25cIjogWzE2NSw0Miw0MiwxXSwgXCJidXJseXdvb2RcIjogWzIyMiwxODQsMTM1LDFdLFxuICBcImNhZGV0Ymx1ZVwiOiBbOTUsMTU4LDE2MCwxXSwgXCJjaGFydHJldXNlXCI6IFsxMjcsMjU1LDAsMV0sXG4gIFwiY2hvY29sYXRlXCI6IFsyMTAsMTA1LDMwLDFdLCBcImNvcmFsXCI6IFsyNTUsMTI3LDgwLDFdLFxuICBcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsMTQ5LDIzNywxXSwgXCJjb3Juc2lsa1wiOiBbMjU1LDI0OCwyMjAsMV0sXG4gIFwiY3JpbXNvblwiOiBbMjIwLDIwLDYwLDFdLCBcImN5YW5cIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJkYXJrYmx1ZVwiOiBbMCwwLDEzOSwxXSwgXCJkYXJrY3lhblwiOiBbMCwxMzksMTM5LDFdLFxuICBcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwxMzQsMTEsMV0sIFwiZGFya2dyYXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtncmVlblwiOiBbMCwxMDAsMCwxXSwgXCJkYXJrZ3JleVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2toYWtpXCI6IFsxODksMTgzLDEwNywxXSwgXCJkYXJrbWFnZW50YVwiOiBbMTM5LDAsMTM5LDFdLFxuICBcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwxMDcsNDcsMV0sIFwiZGFya29yYW5nZVwiOiBbMjU1LDE0MCwwLDFdLFxuICBcImRhcmtvcmNoaWRcIjogWzE1Myw1MCwyMDQsMV0sIFwiZGFya3JlZFwiOiBbMTM5LDAsMCwxXSxcbiAgXCJkYXJrc2FsbW9uXCI6IFsyMzMsMTUwLDEyMiwxXSwgXCJkYXJrc2VhZ3JlZW5cIjogWzE0MywxODgsMTQzLDFdLFxuICBcImRhcmtzbGF0ZWJsdWVcIjogWzcyLDYxLDEzOSwxXSwgXCJkYXJrc2xhdGVncmF5XCI6IFs0Nyw3OSw3OSwxXSxcbiAgXCJkYXJrc2xhdGVncmV5XCI6IFs0Nyw3OSw3OSwxXSwgXCJkYXJrdHVycXVvaXNlXCI6IFswLDIwNiwyMDksMV0sXG4gIFwiZGFya3Zpb2xldFwiOiBbMTQ4LDAsMjExLDFdLCBcImRlZXBwaW5rXCI6IFsyNTUsMjAsMTQ3LDFdLFxuICBcImRlZXBza3libHVlXCI6IFswLDE5MSwyNTUsMV0sIFwiZGltZ3JheVwiOiBbMTA1LDEwNSwxMDUsMV0sXG4gIFwiZGltZ3JleVwiOiBbMTA1LDEwNSwxMDUsMV0sIFwiZG9kZ2VyYmx1ZVwiOiBbMzAsMTQ0LDI1NSwxXSxcbiAgXCJmaXJlYnJpY2tcIjogWzE3OCwzNCwzNCwxXSwgXCJmbG9yYWx3aGl0ZVwiOiBbMjU1LDI1MCwyNDAsMV0sXG4gIFwiZm9yZXN0Z3JlZW5cIjogWzM0LDEzOSwzNCwxXSwgXCJmdWNoc2lhXCI6IFsyNTUsMCwyNTUsMV0sXG4gIFwiZ2FpbnNib3JvXCI6IFsyMjAsMjIwLDIyMCwxXSwgXCJnaG9zdHdoaXRlXCI6IFsyNDgsMjQ4LDI1NSwxXSxcbiAgXCJnb2xkXCI6IFsyNTUsMjE1LDAsMV0sIFwiZ29sZGVucm9kXCI6IFsyMTgsMTY1LDMyLDFdLFxuICBcImdyYXlcIjogWzEyOCwxMjgsMTI4LDFdLCBcImdyZWVuXCI6IFswLDEyOCwwLDFdLFxuICBcImdyZWVueWVsbG93XCI6IFsxNzMsMjU1LDQ3LDFdLCBcImdyZXlcIjogWzEyOCwxMjgsMTI4LDFdLFxuICBcImhvbmV5ZGV3XCI6IFsyNDAsMjU1LDI0MCwxXSwgXCJob3RwaW5rXCI6IFsyNTUsMTA1LDE4MCwxXSxcbiAgXCJpbmRpYW5yZWRcIjogWzIwNSw5Miw5MiwxXSwgXCJpbmRpZ29cIjogWzc1LDAsMTMwLDFdLFxuICBcIml2b3J5XCI6IFsyNTUsMjU1LDI0MCwxXSwgXCJraGFraVwiOiBbMjQwLDIzMCwxNDAsMV0sXG4gIFwibGF2ZW5kZXJcIjogWzIzMCwyMzAsMjUwLDFdLCBcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwyNDAsMjQ1LDFdLFxuICBcImxhd25ncmVlblwiOiBbMTI0LDI1MiwwLDFdLCBcImxlbW9uY2hpZmZvblwiOiBbMjU1LDI1MCwyMDUsMV0sXG4gIFwibGlnaHRibHVlXCI6IFsxNzMsMjE2LDIzMCwxXSwgXCJsaWdodGNvcmFsXCI6IFsyNDAsMTI4LDEyOCwxXSxcbiAgXCJsaWdodGN5YW5cIjogWzIyNCwyNTUsMjU1LDFdLCBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsMjUwLDIxMCwxXSxcbiAgXCJsaWdodGdyYXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0Z3JlZW5cIjogWzE0NCwyMzgsMTQ0LDFdLFxuICBcImxpZ2h0Z3JleVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRwaW5rXCI6IFsyNTUsMTgyLDE5MywxXSxcbiAgXCJsaWdodHNhbG1vblwiOiBbMjU1LDE2MCwxMjIsMV0sIFwibGlnaHRzZWFncmVlblwiOiBbMzIsMTc4LDE3MCwxXSxcbiAgXCJsaWdodHNreWJsdWVcIjogWzEzNSwyMDYsMjUwLDFdLCBcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksMTM2LDE1MywxXSxcbiAgXCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LDEzNiwxNTMsMV0sIFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwxOTYsMjIyLDFdLFxuICBcImxpZ2h0eWVsbG93XCI6IFsyNTUsMjU1LDIyNCwxXSwgXCJsaW1lXCI6IFswLDI1NSwwLDFdLFxuICBcImxpbWVncmVlblwiOiBbNTAsMjA1LDUwLDFdLCBcImxpbmVuXCI6IFsyNTAsMjQwLDIzMCwxXSxcbiAgXCJtYWdlbnRhXCI6IFsyNTUsMCwyNTUsMV0sIFwibWFyb29uXCI6IFsxMjgsMCwwLDFdLFxuICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwyMDUsMTcwLDFdLCBcIm1lZGl1bWJsdWVcIjogWzAsMCwyMDUsMV0sXG4gIFwibWVkaXVtb3JjaGlkXCI6IFsxODYsODUsMjExLDFdLCBcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LDExMiwyMTksMV0sXG4gIFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLDE3OSwxMTMsMV0sIFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsMTA0LDIzOCwxXSxcbiAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwyNTAsMTU0LDFdLCBcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsMjA5LDIwNCwxXSxcbiAgXCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwyMSwxMzMsMV0sIFwibWlkbmlnaHRibHVlXCI6IFsyNSwyNSwxMTIsMV0sXG4gIFwibWludGNyZWFtXCI6IFsyNDUsMjU1LDI1MCwxXSwgXCJtaXN0eXJvc2VcIjogWzI1NSwyMjgsMjI1LDFdLFxuICBcIm1vY2Nhc2luXCI6IFsyNTUsMjI4LDE4MSwxXSwgXCJuYXZham93aGl0ZVwiOiBbMjU1LDIyMiwxNzMsMV0sXG4gIFwibmF2eVwiOiBbMCwwLDEyOCwxXSwgXCJvbGRsYWNlXCI6IFsyNTMsMjQ1LDIzMCwxXSxcbiAgXCJvbGl2ZVwiOiBbMTI4LDEyOCwwLDFdLCBcIm9saXZlZHJhYlwiOiBbMTA3LDE0MiwzNSwxXSxcbiAgXCJvcmFuZ2VcIjogWzI1NSwxNjUsMCwxXSwgXCJvcmFuZ2VyZWRcIjogWzI1NSw2OSwwLDFdLFxuICBcIm9yY2hpZFwiOiBbMjE4LDExMiwyMTQsMV0sIFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LDIzMiwxNzAsMV0sXG4gIFwicGFsZWdyZWVuXCI6IFsxNTIsMjUxLDE1MiwxXSwgXCJwYWxldHVycXVvaXNlXCI6IFsxNzUsMjM4LDIzOCwxXSxcbiAgXCJwYWxldmlvbGV0cmVkXCI6IFsyMTksMTEyLDE0NywxXSwgXCJwYXBheWF3aGlwXCI6IFsyNTUsMjM5LDIxMywxXSxcbiAgXCJwZWFjaHB1ZmZcIjogWzI1NSwyMTgsMTg1LDFdLCBcInBlcnVcIjogWzIwNSwxMzMsNjMsMV0sXG4gIFwicGlua1wiOiBbMjU1LDE5MiwyMDMsMV0sIFwicGx1bVwiOiBbMjIxLDE2MCwyMjEsMV0sXG4gIFwicG93ZGVyYmx1ZVwiOiBbMTc2LDIyNCwyMzAsMV0sIFwicHVycGxlXCI6IFsxMjgsMCwxMjgsMV0sXG4gIFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLDUxLDE1MywxXSxcbiAgXCJyZWRcIjogWzI1NSwwLDAsMV0sIFwicm9zeWJyb3duXCI6IFsxODgsMTQzLDE0MywxXSxcbiAgXCJyb3lhbGJsdWVcIjogWzY1LDEwNSwyMjUsMV0sIFwic2FkZGxlYnJvd25cIjogWzEzOSw2OSwxOSwxXSxcbiAgXCJzYWxtb25cIjogWzI1MCwxMjgsMTE0LDFdLCBcInNhbmR5YnJvd25cIjogWzI0NCwxNjQsOTYsMV0sXG4gIFwic2VhZ3JlZW5cIjogWzQ2LDEzOSw4NywxXSwgXCJzZWFzaGVsbFwiOiBbMjU1LDI0NSwyMzgsMV0sXG4gIFwic2llbm5hXCI6IFsxNjAsODIsNDUsMV0sIFwic2lsdmVyXCI6IFsxOTIsMTkyLDE5MiwxXSxcbiAgXCJza3libHVlXCI6IFsxMzUsMjA2LDIzNSwxXSwgXCJzbGF0ZWJsdWVcIjogWzEwNiw5MCwyMDUsMV0sXG4gIFwic2xhdGVncmF5XCI6IFsxMTIsMTI4LDE0NCwxXSwgXCJzbGF0ZWdyZXlcIjogWzExMiwxMjgsMTQ0LDFdLFxuICBcInNub3dcIjogWzI1NSwyNTAsMjUwLDFdLCBcInNwcmluZ2dyZWVuXCI6IFswLDI1NSwxMjcsMV0sXG4gIFwic3RlZWxibHVlXCI6IFs3MCwxMzAsMTgwLDFdLCBcInRhblwiOiBbMjEwLDE4MCwxNDAsMV0sXG4gIFwidGVhbFwiOiBbMCwxMjgsMTI4LDFdLCBcInRoaXN0bGVcIjogWzIxNiwxOTEsMjE2LDFdLFxuICBcInRvbWF0b1wiOiBbMjU1LDk5LDcxLDFdLCBcInR1cnF1b2lzZVwiOiBbNjQsMjI0LDIwOCwxXSxcbiAgXCJ2aW9sZXRcIjogWzIzOCwxMzAsMjM4LDFdLCBcIndoZWF0XCI6IFsyNDUsMjIyLDE3OSwxXSxcbiAgXCJ3aGl0ZVwiOiBbMjU1LDI1NSwyNTUsMV0sIFwid2hpdGVzbW9rZVwiOiBbMjQ1LDI0NSwyNDUsMV0sXG4gIFwieWVsbG93XCI6IFsyNTUsMjU1LDAsMV0sIFwieWVsbG93Z3JlZW5cIjogWzE1NCwyMDUsNTAsMV19XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19ieXRlKGkpIHsgIC8vIENsYW1wIHRvIGludGVnZXIgMCAuLiAyNTUuXG4gIGkgPSBNYXRoLnJvdW5kKGkpOyAgLy8gU2VlbXMgdG8gYmUgd2hhdCBDaHJvbWUgZG9lcyAodnMgdHJ1bmNhdGlvbikuXG4gIHJldHVybiBpIDwgMCA/IDAgOiBpID4gMjU1ID8gMjU1IDogaTtcbn1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2Zsb2F0KGYpIHsgIC8vIENsYW1wIHRvIGZsb2F0IDAuMCAuLiAxLjAuXG4gIHJldHVybiBmIDwgMCA/IDAgOiBmID4gMSA/IDEgOiBmO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfaW50KHN0cikgeyAgLy8gaW50IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlRmxvYXQoc3RyKSAvIDEwMCAqIDI1NSk7XG4gIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUludChzdHIpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2Zsb2F0KHN0cikgeyAgLy8gZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSAvIDEwMCk7XG4gIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpKTtcbn1cblxuZnVuY3Rpb24gY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSB7XG4gIGlmIChoIDwgMCkgaCArPSAxO1xuICBlbHNlIGlmIChoID4gMSkgaCAtPSAxO1xuXG4gIGlmIChoICogNiA8IDEpIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggKiA2O1xuICBpZiAoaCAqIDIgPCAxKSByZXR1cm4gbTI7XG4gIGlmIChoICogMyA8IDIpIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyLzMgLSBoKSAqIDY7XG4gIHJldHVybiBtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDU1NDb2xvcihjc3Nfc3RyKSB7XG4gIC8vIFJlbW92ZSBhbGwgd2hpdGVzcGFjZSwgbm90IGNvbXBsaWFudCwgYnV0IHNob3VsZCBqdXN0IGJlIG1vcmUgYWNjZXB0aW5nLlxuICB2YXIgc3RyID0gY3NzX3N0ci5yZXBsYWNlKC8gL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIENvbG9yIGtleXdvcmRzIChhbmQgdHJhbnNwYXJlbnQpIGxvb2t1cC5cbiAgaWYgKHN0ciBpbiBrQ1NTQ29sb3JUYWJsZSkgcmV0dXJuIGtDU1NDb2xvclRhYmxlW3N0cl0uc2xpY2UoKTsgIC8vIGR1cC5cblxuICAvLyAjYWJjIGFuZCAjYWJjMTIzIHN5bnRheC5cbiAgaWYgKHN0clswXSA9PT0gJyMnKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDQpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKChpdiAmIDB4ZjAwKSA+PiA0KSB8ICgoaXYgJiAweGYwMCkgPj4gOCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZjApIHwgKChpdiAmIDB4ZjApID4+IDQpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYpIHwgKChpdiAmIDB4ZikgPDwgNCksXG4gICAgICAgICAgICAgIDFdO1xuICAgIH0gZWxzZSBpZiAoc3RyLmxlbmd0aCA9PT0gNykge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoaXYgJiAweGZmMDAwMCkgPj4gMTYsXG4gICAgICAgICAgICAgIChpdiAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgICAgICAgaXYgJiAweGZmLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBvcCA9IHN0ci5pbmRleE9mKCcoJyksIGVwID0gc3RyLmluZGV4T2YoJyknKTtcbiAgaWYgKG9wICE9PSAtMSAmJiBlcCArIDEgPT09IHN0ci5sZW5ndGgpIHtcbiAgICB2YXIgZm5hbWUgPSBzdHIuc3Vic3RyKDAsIG9wKTtcbiAgICB2YXIgcGFyYW1zID0gc3RyLnN1YnN0cihvcCsxLCBlcC0ob3ArMSkpLnNwbGl0KCcsJyk7XG4gICAgdmFyIGFscGhhID0gMTsgIC8vIFRvIGFsbG93IGNhc2UgZmFsbHRocm91Z2guXG4gICAgc3dpdGNoIChmbmFtZSkge1xuICAgICAgY2FzZSAncmdiYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAncmdiJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gW3BhcnNlX2Nzc19pbnQocGFyYW1zWzBdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1sxXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMl0pLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGNhc2UgJ2hzbGEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGggPSAoKChwYXJzZUZsb2F0KHBhcmFtc1swXSkgJSAzNjApICsgMzYwKSAlIDM2MCkgLyAzNjA7ICAvLyAwIC4uIDFcbiAgICAgICAgLy8gTk9URShkZWFubSk6IEFjY29yZGluZyB0byB0aGUgQ1NTIHNwZWMgcy9sIHNob3VsZCBvbmx5IGJlXG4gICAgICAgIC8vIHBlcmNlbnRhZ2VzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGFuZCBsZXQgZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgICAgICAgdmFyIHMgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzFdKTtcbiAgICAgICAgdmFyIGwgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzJdKTtcbiAgICAgICAgdmFyIG0yID0gbCA8PSAwLjUgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICAgIHZhciBtMSA9IGwgKiAyIC0gbTI7XG4gICAgICAgIHJldHVybiBbY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKzEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaC0xLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudHJ5IHsgZXhwb3J0cy5wYXJzZUNTU0NvbG9yID0gcGFyc2VDU1NDb2xvciB9IGNhdGNoKGUpIHsgfVxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLyoqXG4gKiBKUyBJbXBsZW1lbnRhdGlvbiBvZiBNdXJtdXJIYXNoMyAocjEzNikgKGFzIG9mIE1heSAyMCwgMjAxMSlcbiAqIFxuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmdhcnkuY291cnRAZ21haWwuY29tXCI+R2FyeSBDb3VydDwvYT5cbiAqIEBzZWUgaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzphYXBwbGVieUBnbWFpbC5jb21cIj5BdXN0aW4gQXBwbGVieTwvYT5cbiAqIEBzZWUgaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9tdXJtdXJoYXNoL1xuICogXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IEFTQ0lJIG9ubHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWVkIFBvc2l0aXZlIGludGVnZXIgb25seVxuICogQHJldHVybiB7bnVtYmVyfSAzMi1iaXQgcG9zaXRpdmUgaW50ZWdlciBoYXNoIFxuICovXG5cbmZ1bmN0aW9uIG11cm11cmhhc2gzXzMyX2djKGtleSwgc2VlZCkge1xuXHR2YXIgcmVtYWluZGVyLCBieXRlcywgaDEsIGgxYiwgYzEsIGMxYiwgYzIsIGMyYiwgazEsIGk7XG5cdFxuXHRyZW1haW5kZXIgPSBrZXkubGVuZ3RoICYgMzsgLy8ga2V5Lmxlbmd0aCAlIDRcblx0Ynl0ZXMgPSBrZXkubGVuZ3RoIC0gcmVtYWluZGVyO1xuXHRoMSA9IHNlZWQ7XG5cdGMxID0gMHhjYzllMmQ1MTtcblx0YzIgPSAweDFiODczNTkzO1xuXHRpID0gMDtcblx0XG5cdHdoaWxlIChpIDwgYnl0ZXMpIHtcblx0ICBcdGsxID0gXG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoaSkgJiAweGZmKSkgfFxuXHQgIFx0ICAoKGtleS5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCA4KSB8XG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDE2KSB8XG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDI0KTtcblx0XHQrK2k7XG5cdFx0XG5cdFx0azEgPSAoKCgoazEgJiAweGZmZmYpICogYzEpICsgKCgoKGsxID4+PiAxNikgKiBjMSkgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblx0XHRrMSA9IChrMSA8PCAxNSkgfCAoazEgPj4+IDE3KTtcblx0XHRrMSA9ICgoKChrMSAmIDB4ZmZmZikgKiBjMikgKyAoKCgoazEgPj4+IDE2KSAqIGMyKSAmIDB4ZmZmZikgPDwgMTYpKSkgJiAweGZmZmZmZmZmO1xuXG5cdFx0aDEgXj0gazE7XG4gICAgICAgIGgxID0gKGgxIDw8IDEzKSB8IChoMSA+Pj4gMTkpO1xuXHRcdGgxYiA9ICgoKChoMSAmIDB4ZmZmZikgKiA1KSArICgoKChoMSA+Pj4gMTYpICogNSkgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblx0XHRoMSA9ICgoKGgxYiAmIDB4ZmZmZikgKyAweDZiNjQpICsgKCgoKGgxYiA+Pj4gMTYpICsgMHhlNjU0KSAmIDB4ZmZmZikgPDwgMTYpKTtcblx0fVxuXHRcblx0azEgPSAwO1xuXHRcblx0c3dpdGNoIChyZW1haW5kZXIpIHtcblx0XHRjYXNlIDM6IGsxIF49IChrZXkuY2hhckNvZGVBdChpICsgMikgJiAweGZmKSA8PCAxNjtcblx0XHRjYXNlIDI6IGsxIF49IChrZXkuY2hhckNvZGVBdChpICsgMSkgJiAweGZmKSA8PCA4O1xuXHRcdGNhc2UgMTogazEgXj0gKGtleS5jaGFyQ29kZUF0KGkpICYgMHhmZik7XG5cdFx0XG5cdFx0azEgPSAoKChrMSAmIDB4ZmZmZikgKiBjMSkgKyAoKCgoazEgPj4+IDE2KSAqIGMxKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdFx0azEgPSAoazEgPDwgMTUpIHwgKGsxID4+PiAxNyk7XG5cdFx0azEgPSAoKChrMSAmIDB4ZmZmZikgKiBjMikgKyAoKCgoazEgPj4+IDE2KSAqIGMyKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdFx0aDEgXj0gazE7XG5cdH1cblx0XG5cdGgxIF49IGtleS5sZW5ndGg7XG5cblx0aDEgXj0gaDEgPj4+IDE2O1xuXHRoMSA9ICgoKGgxICYgMHhmZmZmKSAqIDB4ODVlYmNhNmIpICsgKCgoKGgxID4+PiAxNikgKiAweDg1ZWJjYTZiKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdGgxIF49IGgxID4+PiAxMztcblx0aDEgPSAoKCgoaDEgJiAweGZmZmYpICogMHhjMmIyYWUzNSkgKyAoKCgoaDEgPj4+IDE2KSAqIDB4YzJiMmFlMzUpICYgMHhmZmZmKSA8PCAxNikpKSAmIDB4ZmZmZmZmZmY7XG5cdGgxIF49IGgxID4+PiAxNjtcblxuXHRyZXR1cm4gaDEgPj4+IDA7XG59XG5cbmlmKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBtdXJtdXJoYXNoM18zMl9nY1xufSIsIi8qKlxuICogSlMgSW1wbGVtZW50YXRpb24gb2YgTXVybXVySGFzaDJcbiAqIFxuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmdhcnkuY291cnRAZ21haWwuY29tXCI+R2FyeSBDb3VydDwvYT5cbiAqIEBzZWUgaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzphYXBwbGVieUBnbWFpbC5jb21cIj5BdXN0aW4gQXBwbGVieTwvYT5cbiAqIEBzZWUgaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9tdXJtdXJoYXNoL1xuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIEFTQ0lJIG9ubHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWVkIFBvc2l0aXZlIGludGVnZXIgb25seVxuICogQHJldHVybiB7bnVtYmVyfSAzMi1iaXQgcG9zaXRpdmUgaW50ZWdlciBoYXNoXG4gKi9cblxuZnVuY3Rpb24gbXVybXVyaGFzaDJfMzJfZ2Moc3RyLCBzZWVkKSB7XG4gIHZhclxuICAgIGwgPSBzdHIubGVuZ3RoLFxuICAgIGggPSBzZWVkIF4gbCxcbiAgICBpID0gMCxcbiAgICBrO1xuICBcbiAgd2hpbGUgKGwgPj0gNCkge1xuICBcdGsgPSBcbiAgXHQgICgoc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKSkgfFxuICBcdCAgKChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgOCkgfFxuICBcdCAgKChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMTYpIHxcbiAgXHQgICgoc3RyLmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDI0KTtcbiAgICBcbiAgICBrID0gKCgoayAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChrID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKTtcbiAgICBrIF49IGsgPj4+IDI0O1xuICAgIGsgPSAoKChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGsgPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuXG5cdGggPSAoKChoICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGggPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpIF4gaztcblxuICAgIGwgLT0gNDtcbiAgICArK2k7XG4gIH1cbiAgXG4gIHN3aXRjaCAobCkge1xuICBjYXNlIDM6IGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAyKSAmIDB4ZmYpIDw8IDE2O1xuICBjYXNlIDI6IGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4ZmYpIDw8IDg7XG4gIGNhc2UgMTogaCBePSAoc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKTtcbiAgICAgICAgICBoID0gKCgoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChoID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKTtcbiAgfVxuXG4gIGggXj0gaCA+Pj4gMTM7XG4gIGggPSAoKChoICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGggPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuICBoIF49IGggPj4+IDE1O1xuXG4gIHJldHVybiBoID4+PiAwO1xufVxuXG5pZih0eXBlb2YgbW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBtdXJtdXJoYXNoMl8zMl9nY1xufVxuIiwidmFyIG11cm11cjMgPSByZXF1aXJlKFwiLi9tdXJtdXJoYXNoM19nYy5qc1wiKVxudmFyIG11cm11cjIgPSByZXF1aXJlKFwiLi9tdXJtdXJoYXNoMl9nYy5qc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IG11cm11cjNcbm1vZHVsZS5leHBvcnRzLm11cm11cjMgPSBtdXJtdXIzXG5tb2R1bGUuZXhwb3J0cy5tdXJtdXIyID0gbXVybXVyMlxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCIvKipcbiAqIENvbW1vbiB1dGlsaXRpZXNcbiAqIEBtb2R1bGUgZ2xNYXRyaXhcbiAqL1xuLy8gQ29uZmlndXJhdGlvbiBDb25zdGFudHNcbmV4cG9ydCB2YXIgRVBTSUxPTiA9IDAuMDAwMDAxO1xuZXhwb3J0IHZhciBBUlJBWV9UWVBFID0gdHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBGbG9hdDMyQXJyYXkgOiBBcnJheTtcbmV4cG9ydCB2YXIgUkFORE9NID0gTWF0aC5yYW5kb207XG4vKipcbiAqIFNldHMgdGhlIHR5cGUgb2YgYXJyYXkgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xuICpcbiAqIEBwYXJhbSB7RmxvYXQzMkFycmF5Q29uc3RydWN0b3IgfCBBcnJheUNvbnN0cnVjdG9yfSB0eXBlIEFycmF5IHR5cGUsIHN1Y2ggYXMgRmxvYXQzMkFycmF5IG9yIEFycmF5XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldE1hdHJpeEFycmF5VHlwZSh0eXBlKSB7XG4gIEFSUkFZX1RZUEUgPSB0eXBlO1xufVxudmFyIGRlZ3JlZSA9IE1hdGguUEkgLyAxODA7XG4vKipcbiAqIENvbnZlcnQgRGVncmVlIFRvIFJhZGlhblxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIEFuZ2xlIGluIERlZ3JlZXNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdG9SYWRpYW4oYSkge1xuICByZXR1cm4gYSAqIGRlZ3JlZTtcbn1cbi8qKlxuICogVGVzdHMgd2hldGhlciBvciBub3QgdGhlIGFyZ3VtZW50cyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgdmFsdWUsIHdpdGhpbiBhbiBhYnNvbHV0ZVxuICogb3IgcmVsYXRpdmUgdG9sZXJhbmNlIG9mIGdsTWF0cml4LkVQU0lMT04gKGFuIGFic29sdXRlIHRvbGVyYW5jZSBpcyB1c2VkIGZvciB2YWx1ZXMgbGVzc1xuICogdGhhbiBvciBlcXVhbCB0byAxLjAsIGFuZCBhIHJlbGF0aXZlIHRvbGVyYW5jZSBpcyB1c2VkIGZvciBsYXJnZXIgdmFsdWVzKVxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIFRoZSBmaXJzdCBudW1iZXIgdG8gdGVzdC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBiIFRoZSBzZWNvbmQgbnVtYmVyIHRvIHRlc3QuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVycyBhcmUgYXBwcm94aW1hdGVseSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG5pZiAoIU1hdGguaHlwb3QpIE1hdGguaHlwb3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB5ID0gMCxcbiAgICAgIGkgPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICB5ICs9IGFyZ3VtZW50c1tpXSAqIGFyZ3VtZW50c1tpXTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLnNxcnQoeSk7XG59OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiAyeDIgTWF0cml4XG4gKiBAbW9kdWxlIG1hdDJcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0MlxuICpcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIG91dFswXSA9IDE7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDJ9IGEgbmV3IDJ4MiBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQyIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgbWF0MiB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBtYXQyIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEByZXR1cm5zIHttYXQyfSBvdXQgQSBuZXcgMngyIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMTAsIG0xMSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMTA7XG4gIG91dFszXSA9IG0xMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0MiB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMTA7XG4gIG91dFszXSA9IG0xMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZVxuICAvLyBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGExID0gYVsxXTtcbiAgICBvdXRbMV0gPSBhWzJdO1xuICAgIG91dFsyXSA9IGExO1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsyXTtcbiAgICBvdXRbMl0gPSBhWzFdO1xuICAgIG91dFszXSA9IGFbM107XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBJbnZlcnRzIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYTAgKiBhMyAtIGEyICogYTE7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gYTMgKiBkZXQ7XG4gIG91dFsxXSA9IC1hMSAqIGRldDtcbiAgb3V0WzJdID0gLWEyICogZGV0O1xuICBvdXRbM10gPSBhMCAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkam9pbnQob3V0LCBhKSB7XG4gIC8vIENhY2hpbmcgdGhpcyB2YWx1ZSBpcyBuZXNzZWNhcnkgaWYgb3V0ID09IGFcbiAgdmFyIGEwID0gYVswXTtcbiAgb3V0WzBdID0gYVszXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzJdICogYVsxXTtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MidzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgb3V0WzJdID0gYTAgKiBiMiArIGEyICogYjM7XG4gIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MiBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYTAgKiBjICsgYTIgKiBzO1xuICBvdXRbMV0gPSBhMSAqIGMgKyBhMyAqIHM7XG4gIG91dFsyXSA9IGEwICogLXMgKyBhMiAqIGM7XG4gIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MiBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciB2MCA9IHZbMF0sXG4gICAgICB2MSA9IHZbMV07XG4gIG91dFswXSA9IGEwICogdjA7XG4gIG91dFsxXSA9IGExICogdjA7XG4gIG91dFsyXSA9IGEyICogdjE7XG4gIG91dFszXSA9IGEzICogdjE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IG1hdDIgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IGM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgbWF0MiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IHZbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwibWF0MihcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xufVxuLyoqXG4gKiBSZXR1cm5zIEwsIEQgYW5kIFUgbWF0cmljZXMgKExvd2VyIHRyaWFuZ3VsYXIsIERpYWdvbmFsIGFuZCBVcHBlciB0cmlhbmd1bGFyKSBieSBmYWN0b3JpemluZyB0aGUgaW5wdXQgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gTCB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBEIHRoZSBkaWFnb25hbCBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBVIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGlucHV0IG1hdHJpeCB0byBmYWN0b3JpemVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gTERVKEwsIEQsIFUsIGEpIHtcbiAgTFsyXSA9IGFbMl0gLyBhWzBdO1xuICBVWzBdID0gYVswXTtcbiAgVVsxXSA9IGFbMV07XG4gIFVbM10gPSBhWzNdIC0gTFsyXSAqIFVbMV07XG4gIHJldHVybiBbTCwgRCwgVV07XG59XG4vKipcbiAqIEFkZHMgdHdvIG1hdDInc1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpO1xufVxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIG1hdDIncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhckFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0Mi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0Mi5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcbiAqIDJ4MyBNYXRyaXhcbiAqIEBtb2R1bGUgbWF0MmRcbiAqIEBkZXNjcmlwdGlvblxuICogQSBtYXQyZCBjb250YWlucyBzaXggZWxlbWVudHMgZGVmaW5lZCBhczpcbiAqIDxwcmU+XG4gKiBbYSwgYixcbiAqICBjLCBkLFxuICogIHR4LCB0eV1cbiAqIDwvcHJlPlxuICogVGhpcyBpcyBhIHNob3J0IGZvcm0gZm9yIHRoZSAzeDMgbWF0cml4OlxuICogPHByZT5cbiAqIFthLCBiLCAwLFxuICogIGMsIGQsIDAsXG4gKiAgdHgsIHR5LCAxXVxuICogPC9wcmU+XG4gKiBUaGUgbGFzdCBjb2x1bW4gaXMgaWdub3JlZCBzbyB0aGUgYXJyYXkgaXMgc2hvcnRlciBhbmQgb3BlcmF0aW9ucyBhcmUgZmFzdGVyLlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQyZFxuICpcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQyZCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDJkIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgbWF0MmQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBtYXQyZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYSBDb21wb25lbnQgQSAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIENvbXBvbmVudCBCIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IGMgQ29tcG9uZW50IEMgKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gZCBDb21wb25lbnQgRCAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eCBDb21wb25lbnQgVFggKGluZGV4IDQpXG4gKiBAcGFyYW0ge051bWJlcn0gdHkgQ29tcG9uZW50IFRZIChpbmRleCA1KVxuICogQHJldHVybnMge21hdDJkfSBBIG5ldyBtYXQyZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNik7XG4gIG91dFswXSA9IGE7XG4gIG91dFsxXSA9IGI7XG4gIG91dFsyXSA9IGM7XG4gIG91dFszXSA9IGQ7XG4gIG91dFs0XSA9IHR4O1xuICBvdXRbNV0gPSB0eTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0MmQgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQ29tcG9uZW50IEEgKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gYiBDb21wb25lbnQgQiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjIENvbXBvbmVudCBDIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IGQgQ29tcG9uZW50IEQgKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gdHggQ29tcG9uZW50IFRYIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IHR5IENvbXBvbmVudCBUWSAoaW5kZXggNSlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICBvdXRbMF0gPSBhO1xuICBvdXRbMV0gPSBiO1xuICBvdXRbMl0gPSBjO1xuICBvdXRbM10gPSBkO1xuICBvdXRbNF0gPSB0eDtcbiAgb3V0WzVdID0gdHk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEludmVydHMgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhYSA9IGFbMF0sXG4gICAgICBhYiA9IGFbMV0sXG4gICAgICBhYyA9IGFbMl0sXG4gICAgICBhZCA9IGFbM107XG4gIHZhciBhdHggPSBhWzRdLFxuICAgICAgYXR5ID0gYVs1XTtcbiAgdmFyIGRldCA9IGFhICogYWQgLSBhYiAqIGFjO1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IGFkICogZGV0O1xuICBvdXRbMV0gPSAtYWIgKiBkZXQ7XG4gIG91dFsyXSA9IC1hYyAqIGRldDtcbiAgb3V0WzNdID0gYWEgKiBkZXQ7XG4gIG91dFs0XSA9IChhYyAqIGF0eSAtIGFkICogYXR4KSAqIGRldDtcbiAgb3V0WzVdID0gKGFiICogYXR4IC0gYWEgKiBhdHkpICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsxXSAqIGFbMl07XG59XG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDJkJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV07XG4gIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgb3V0WzJdID0gYTAgKiBiMiArIGEyICogYjM7XG4gIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICBvdXRbNF0gPSBhMCAqIGI0ICsgYTIgKiBiNSArIGE0O1xuICBvdXRbNV0gPSBhMSAqIGI0ICsgYTMgKiBiNSArIGE1O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MmQgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGEwICogYyArIGEyICogcztcbiAgb3V0WzFdID0gYTEgKiBjICsgYTMgKiBzO1xuICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICBvdXRbM10gPSBhMSAqIC1zICsgYTMgKiBjO1xuICBvdXRbNF0gPSBhNDtcbiAgb3V0WzVdID0gYTU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MmQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgdjAgPSB2WzBdLFxuICAgICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMCAqIHYwO1xuICBvdXRbMV0gPSBhMSAqIHYwO1xuICBvdXRbMl0gPSBhMiAqIHYxO1xuICBvdXRbM10gPSBhMyAqIHYxO1xuICBvdXRbNF0gPSBhNDtcbiAgb3V0WzVdID0gYTU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgdGhlIG1hdDJkIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHRoZSB2ZWMyIHRvIHRyYW5zbGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgdjAgPSB2WzBdLFxuICAgICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMDtcbiAgb3V0WzFdID0gYTE7XG4gIG91dFsyXSA9IGEyO1xuICBvdXRbM10gPSBhMztcbiAgb3V0WzRdID0gYTAgKiB2MCArIGEyICogdjEgKyBhNDtcbiAgb3V0WzVdID0gYTEgKiB2MCArIGEzICogdjEgKyBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQyZC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyZC5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IHM7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSBjO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IG1hdDJkIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IHZbMV07XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IHZbMF07XG4gIG91dFs1XSA9IHZbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQyZChcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIiwgXCIgKyBhWzRdICsgXCIsIFwiICsgYVs1XSArIFwiKVwiO1xufVxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCAxKTtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MmQnc1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MmQncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0MmQuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiAzeDMgTWF0cml4XG4gKiBAbW9kdWxlIG1hdDNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0M1xuICpcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29waWVzIHRoZSB1cHBlci1sZWZ0IDN4MyB2YWx1ZXMgaW50byB0aGUgZ2l2ZW4gbWF0My5cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIDN4MyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhICAgdGhlIHNvdXJjZSA0eDQgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQ0KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzRdO1xuICBvdXRbNF0gPSBhWzVdO1xuICBvdXRbNV0gPSBhWzZdO1xuICBvdXRbNl0gPSBhWzhdO1xuICBvdXRbN10gPSBhWzldO1xuICBvdXRbOF0gPSBhWzEwXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDMgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbWF0MyB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDQpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDUpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDYpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDcpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDgpXG4gKiBAcmV0dXJucyB7bWF0M30gQSBuZXcgbWF0M1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMTA7XG4gIG91dFs0XSA9IG0xMTtcbiAgb3V0WzVdID0gbTEyO1xuICBvdXRbNl0gPSBtMjA7XG4gIG91dFs3XSA9IG0yMTtcbiAgb3V0WzhdID0gbTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA1KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA2KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA3KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA4KVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0xMDtcbiAgb3V0WzRdID0gbTExO1xuICBvdXRbNV0gPSBtMTI7XG4gIG91dFs2XSA9IG0yMDtcbiAgb3V0WzddID0gbTIxO1xuICBvdXRbOF0gPSBtMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCBhIG1hdDMgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAxO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKG91dCwgYSkge1xuICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlIHNvbWUgdmFsdWVzXG4gIGlmIChvdXQgPT09IGEpIHtcbiAgICB2YXIgYTAxID0gYVsxXSxcbiAgICAgICAgYTAyID0gYVsyXSxcbiAgICAgICAgYTEyID0gYVs1XTtcbiAgICBvdXRbMV0gPSBhWzNdO1xuICAgIG91dFsyXSA9IGFbNl07XG4gICAgb3V0WzNdID0gYTAxO1xuICAgIG91dFs1XSA9IGFbN107XG4gICAgb3V0WzZdID0gYTAyO1xuICAgIG91dFs3XSA9IGExMjtcbiAgfSBlbHNlIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbM107XG4gICAgb3V0WzJdID0gYVs2XTtcbiAgICBvdXRbM10gPSBhWzFdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs3XTtcbiAgICBvdXRbNl0gPSBhWzJdO1xuICAgIG91dFs3XSA9IGFbNV07XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgdmFyIGIwMSA9IGEyMiAqIGExMSAtIGExMiAqIGEyMTtcbiAgdmFyIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjA7XG4gIHZhciBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjA7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxO1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IGIwMSAqIGRldDtcbiAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0O1xuICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldDtcbiAgb3V0WzNdID0gYjExICogZGV0O1xuICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldDtcbiAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0O1xuICBvdXRbNl0gPSBiMjEgKiBkZXQ7XG4gIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldDtcbiAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGpvaW50KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdO1xuICB2YXIgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdO1xuICB2YXIgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdO1xuICBvdXRbMF0gPSBhMTEgKiBhMjIgLSBhMTIgKiBhMjE7XG4gIG91dFsxXSA9IGEwMiAqIGEyMSAtIGEwMSAqIGEyMjtcbiAgb3V0WzJdID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICBvdXRbM10gPSBhMTIgKiBhMjAgLSBhMTAgKiBhMjI7XG4gIG91dFs0XSA9IGEwMCAqIGEyMiAtIGEwMiAqIGEyMDtcbiAgb3V0WzVdID0gYTAyICogYTEwIC0gYTAwICogYTEyO1xuICBvdXRbNl0gPSBhMTAgKiBhMjEgLSBhMTEgKiBhMjA7XG4gIG91dFs3XSA9IGEwMSAqIGEyMCAtIGEwMCAqIGEyMTtcbiAgb3V0WzhdID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl07XG4gIHZhciBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV07XG4gIHZhciBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF07XG4gIHJldHVybiBhMDAgKiAoYTIyICogYTExIC0gYTEyICogYTIxKSArIGEwMSAqICgtYTIyICogYTEwICsgYTEyICogYTIwKSArIGEwMiAqIChhMjEgKiBhMTAgLSBhMTEgKiBhMjApO1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQzJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgdmFyIGIwMCA9IGJbMF0sXG4gICAgICBiMDEgPSBiWzFdLFxuICAgICAgYjAyID0gYlsyXTtcbiAgdmFyIGIxMCA9IGJbM10sXG4gICAgICBiMTEgPSBiWzRdLFxuICAgICAgYjEyID0gYls1XTtcbiAgdmFyIGIyMCA9IGJbNl0sXG4gICAgICBiMjEgPSBiWzddLFxuICAgICAgYjIyID0gYls4XTtcbiAgb3V0WzBdID0gYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwO1xuICBvdXRbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjE7XG4gIG91dFsyXSA9IGIwMCAqIGEwMiArIGIwMSAqIGExMiArIGIwMiAqIGEyMjtcbiAgb3V0WzNdID0gYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwO1xuICBvdXRbNF0gPSBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjE7XG4gIG91dFs1XSA9IGIxMCAqIGEwMiArIGIxMSAqIGExMiArIGIxMiAqIGEyMjtcbiAgb3V0WzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwO1xuICBvdXRbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjE7XG4gIG91dFs4XSA9IGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0MyBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XSxcbiAgICAgIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XSxcbiAgICAgIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV07XG4gIG91dFswXSA9IGEwMDtcbiAgb3V0WzFdID0gYTAxO1xuICBvdXRbMl0gPSBhMDI7XG4gIG91dFszXSA9IGExMDtcbiAgb3V0WzRdID0gYTExO1xuICBvdXRbNV0gPSBhMTI7XG4gIG91dFs2XSA9IHggKiBhMDAgKyB5ICogYTEwICsgYTIwO1xuICBvdXRbN10gPSB4ICogYTAxICsgeSAqIGExMSArIGEyMTtcbiAgb3V0WzhdID0geCAqIGEwMiArIHkgKiBhMTIgKyBhMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQzIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV0sXG4gICAgICBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF0sXG4gICAgICBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBjICogYTAwICsgcyAqIGExMDtcbiAgb3V0WzFdID0gYyAqIGEwMSArIHMgKiBhMTE7XG4gIG91dFsyXSA9IGMgKiBhMDIgKyBzICogYTEyO1xuICBvdXRbM10gPSBjICogYTEwIC0gcyAqIGEwMDtcbiAgb3V0WzRdID0gYyAqIGExMSAtIHMgKiBhMDE7XG4gIG91dFs1XSA9IGMgKiBhMTIgLSBzICogYTAyO1xuICBvdXRbNl0gPSBhMjA7XG4gIG91dFs3XSA9IGEyMTtcbiAgb3V0WzhdID0gYTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDMgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXTtcbiAgb3V0WzBdID0geCAqIGFbMF07XG4gIG91dFsxXSA9IHggKiBhWzFdO1xuICBvdXRbMl0gPSB4ICogYVsyXTtcbiAgb3V0WzNdID0geSAqIGFbM107XG4gIG91dFs0XSA9IHkgKiBhWzRdO1xuICBvdXRbNV0gPSB5ICogYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDE7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IHZbMF07XG4gIG91dFs3XSA9IHZbMV07XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gLXM7XG4gIG91dFs0XSA9IGM7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHZbMV07XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIGZyb20gYSBtYXQyZCBpbnRvIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byBjb3B5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0MmQob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IGFbMl07XG4gIG91dFs0XSA9IGFbM107XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IGFbNF07XG4gIG91dFs3XSA9IGFbNV07XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgYSAzeDMgbWF0cml4IGZyb20gdGhlIGdpdmVuIHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBRdWF0ZXJuaW9uIHRvIGNyZWF0ZSBtYXRyaXggZnJvbVxuICpcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQob3V0LCBxKSB7XG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeXggPSB5ICogeDI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHp4ID0geiAqIHgyO1xuICB2YXIgenkgPSB6ICogeTI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgb3V0WzBdID0gMSAtIHl5IC0geno7XG4gIG91dFszXSA9IHl4IC0gd3o7XG4gIG91dFs2XSA9IHp4ICsgd3k7XG4gIG91dFsxXSA9IHl4ICsgd3o7XG4gIG91dFs0XSA9IDEgLSB4eCAtIHp6O1xuICBvdXRbN10gPSB6eSAtIHd4O1xuICBvdXRbMl0gPSB6eCAtIHd5O1xuICBvdXRbNV0gPSB6eSArIHd4O1xuICBvdXRbOF0gPSAxIC0geHggLSB5eTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cbiAqXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsxXSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgb3V0WzNdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcbiAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICBvdXRbOF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgMkQgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIFdpZHRoIG9mIHlvdXIgZ2wgY29udGV4dFxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBIZWlnaHQgb2YgZ2wgY29udGV4dFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0aW9uKG91dCwgd2lkdGgsIGhlaWdodCkge1xuICBvdXRbMF0gPSAyIC8gd2lkdGg7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IC0yIC8gaGVpZ2h0O1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAtMTtcbiAgb3V0WzddID0gMTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQzKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIsIFwiICsgYVs2XSArIFwiLCBcIiArIGFbN10gKyBcIiwgXCIgKyBhWzhdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdLCBhWzddLCBhWzhdKTtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MydzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XTtcbiAgb3V0WzddID0gYVs3XSArIGJbN107XG4gIG91dFs4XSA9IGFbOF0gKyBiWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICBvdXRbNl0gPSBhWzZdIC0gYls2XTtcbiAgb3V0WzddID0gYVs3XSAtIGJbN107XG4gIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICBvdXRbOF0gPSBhWzhdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MydzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF0gKiBzY2FsZTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl0gKiBzY2FsZTtcbiAgb3V0WzddID0gYVs3XSArIGJbN10gKiBzY2FsZTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXSAmJiBhWzRdID09PSBiWzRdICYmIGFbNV0gPT09IGJbNV0gJiYgYVs2XSA9PT0gYls2XSAmJiBhWzddID09PSBiWzddICYmIGFbOF0gPT09IGJbOF07XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV0sXG4gICAgICBhNiA9IGFbNl0sXG4gICAgICBhNyA9IGFbN10sXG4gICAgICBhOCA9IGFbOF07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV0sXG4gICAgICBiNiA9IGJbNl0sXG4gICAgICBiNyA9IGJbN10sXG4gICAgICBiOCA9IGJbOF07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKSAmJiBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpICYmIE1hdGguYWJzKGE4IC0gYjgpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE4KSwgTWF0aC5hYnMoYjgpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxuICogNHg0IE1hdHJpeDxicj5Gb3JtYXQ6IGNvbHVtbi1tYWpvciwgd2hlbiB0eXBlZCBvdXQgaXQgbG9va3MgbGlrZSByb3ctbWFqb3I8YnI+VGhlIG1hdHJpY2VzIGFyZSBiZWluZyBwb3N0IG11bHRpcGxpZWQuXG4gKiBAbW9kdWxlIG1hdDRcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0NFxuICpcbiAqIEByZXR1cm5zIHttYXQ0fSBhIG5ldyA0eDQgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICBvdXRbOV0gPSBhWzldO1xuICBvdXRbMTBdID0gYVsxMF07XG4gIG91dFsxMV0gPSBhWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdO1xuICBvdXRbMTNdID0gYVsxM107XG4gIG91dFsxNF0gPSBhWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIG91dFs5XSA9IGFbOV07XG4gIG91dFsxMF0gPSBhWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdO1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBtYXQ0IHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTMgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggNylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTApXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzEgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMTMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcbiAqIEByZXR1cm5zIHttYXQ0fSBBIG5ldyBtYXQ0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0NCB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTMgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggNylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTApXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzEgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMTMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDE7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0LCBhKSB7XG4gIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIHZhciBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdO1xuICAgIHZhciBhMTIgPSBhWzZdLFxuICAgICAgICBhMTMgPSBhWzddO1xuICAgIHZhciBhMjMgPSBhWzExXTtcbiAgICBvdXRbMV0gPSBhWzRdO1xuICAgIG91dFsyXSA9IGFbOF07XG4gICAgb3V0WzNdID0gYVsxMl07XG4gICAgb3V0WzRdID0gYTAxO1xuICAgIG91dFs2XSA9IGFbOV07XG4gICAgb3V0WzddID0gYVsxM107XG4gICAgb3V0WzhdID0gYTAyO1xuICAgIG91dFs5XSA9IGExMjtcbiAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgb3V0WzEyXSA9IGEwMztcbiAgICBvdXRbMTNdID0gYTEzO1xuICAgIG91dFsxNF0gPSBhMjM7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzRdO1xuICAgIG91dFsyXSA9IGFbOF07XG4gICAgb3V0WzNdID0gYVsxMl07XG4gICAgb3V0WzRdID0gYVsxXTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbOV07XG4gICAgb3V0WzddID0gYVsxM107XG4gICAgb3V0WzhdID0gYVsyXTtcbiAgICBvdXRbOV0gPSBhWzZdO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgb3V0WzEyXSA9IGFbM107XG4gICAgb3V0WzEzXSA9IGFbN107XG4gICAgb3V0WzE0XSA9IGFbMTFdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEludmVydHMgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7XG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7XG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7XG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0O1xuICBvdXRbMV0gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgb3V0WzJdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gIG91dFszXSA9IChhMjIgKiBiMDQgLSBhMjEgKiBiMDUgLSBhMjMgKiBiMDMpICogZGV0O1xuICBvdXRbNF0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcbiAgb3V0WzVdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gIG91dFs2XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICBvdXRbN10gPSAoYTIwICogYjA1IC0gYTIyICogYjAyICsgYTIzICogYjAxKSAqIGRldDtcbiAgb3V0WzhdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG4gIG91dFs5XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuICBvdXRbMTBdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxMV0gPSAoYTIxICogYjAyIC0gYTIwICogYjA0IC0gYTIzICogYjAwKSAqIGRldDtcbiAgb3V0WzEyXSA9IChhMTEgKiBiMDcgLSBhMTAgKiBiMDkgLSBhMTIgKiBiMDYpICogZGV0O1xuICBvdXRbMTNdID0gKGEwMCAqIGIwOSAtIGEwMSAqIGIwNyArIGEwMiAqIGIwNikgKiBkZXQ7XG4gIG91dFsxNF0gPSAoYTMxICogYjAxIC0gYTMwICogYjAzIC0gYTMyICogYjAwKSAqIGRldDtcbiAgb3V0WzE1XSA9IChhMjAgKiBiMDMgLSBhMjEgKiBiMDEgKyBhMjIgKiBiMDApICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRqb2ludChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIG91dFswXSA9IGExMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKTtcbiAgb3V0WzFdID0gLShhMDEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpO1xuICBvdXRbMl0gPSBhMDEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMik7XG4gIG91dFszXSA9IC0oYTAxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgb3V0WzRdID0gLShhMTAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikpO1xuICBvdXRbNV0gPSBhMDAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMik7XG4gIG91dFs2XSA9IC0oYTAwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgb3V0WzddID0gYTAwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpO1xuICBvdXRbOF0gPSBhMTAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSk7XG4gIG91dFs5XSA9IC0oYTAwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpKTtcbiAgb3V0WzEwXSA9IGEwMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKTtcbiAgb3V0WzExXSA9IC0oYTAwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpKTtcbiAgb3V0WzEyXSA9IC0oYTEwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpKTtcbiAgb3V0WzEzXSA9IGEwMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKTtcbiAgb3V0WzE0XSA9IC0oYTAwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpKTtcbiAgb3V0WzE1XSA9IGEwMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHJldHVybiBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG59XG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDRzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdOyAvLyBDYWNoZSBvbmx5IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIHNlY29uZCBtYXRyaXhcblxuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICBvdXRbMF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzFdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsyXSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbM10gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzRdO1xuICBiMSA9IGJbNV07XG4gIGIyID0gYls2XTtcbiAgYjMgPSBiWzddO1xuICBvdXRbNF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzVdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFs2XSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbN10gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzhdO1xuICBiMSA9IGJbOV07XG4gIGIyID0gYlsxMF07XG4gIGIzID0gYlsxMV07XG4gIG91dFs4XSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbOV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzEwXSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbMTFdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIGIwID0gYlsxMl07XG4gIGIxID0gYlsxM107XG4gIGIyID0gYlsxNF07XG4gIGIzID0gYlsxNV07XG4gIG91dFsxMl0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzEzXSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMTRdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFsxNV0gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzFdICogeCArIGFbNV0gKiB5ICsgYVs5XSAqIHogKyBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gIH0gZWxzZSB7XG4gICAgYTAwID0gYVswXTtcbiAgICBhMDEgPSBhWzFdO1xuICAgIGEwMiA9IGFbMl07XG4gICAgYTAzID0gYVszXTtcbiAgICBhMTAgPSBhWzRdO1xuICAgIGExMSA9IGFbNV07XG4gICAgYTEyID0gYVs2XTtcbiAgICBhMTMgPSBhWzddO1xuICAgIGEyMCA9IGFbOF07XG4gICAgYTIxID0gYVs5XTtcbiAgICBhMjIgPSBhWzEwXTtcbiAgICBhMjMgPSBhWzExXTtcbiAgICBvdXRbMF0gPSBhMDA7XG4gICAgb3V0WzFdID0gYTAxO1xuICAgIG91dFsyXSA9IGEwMjtcbiAgICBvdXRbM10gPSBhMDM7XG4gICAgb3V0WzRdID0gYTEwO1xuICAgIG91dFs1XSA9IGExMTtcbiAgICBvdXRbNl0gPSBhMTI7XG4gICAgb3V0WzddID0gYTEzO1xuICAgIG91dFs4XSA9IGEyMDtcbiAgICBvdXRbOV0gPSBhMjE7XG4gICAgb3V0WzEwXSA9IGEyMjtcbiAgICBvdXRbMTFdID0gYTIzO1xuICAgIG91dFsxMl0gPSBhMDAgKiB4ICsgYTEwICogeSArIGEyMCAqIHogKyBhWzEyXTtcbiAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhMDMgKiB4ICsgYTEzICogeSArIGEyMyAqIHogKyBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMyBub3QgdXNpbmcgdmVjdG9yaXphdGlvblxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB0aGUgdmVjMyB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgb3V0WzBdID0gYVswXSAqIHg7XG4gIG91dFsxXSA9IGFbMV0gKiB4O1xuICBvdXRbMl0gPSBhWzJdICogeDtcbiAgb3V0WzNdID0gYVszXSAqIHg7XG4gIG91dFs0XSA9IGFbNF0gKiB5O1xuICBvdXRbNV0gPSBhWzVdICogeTtcbiAgb3V0WzZdID0gYVs2XSAqIHk7XG4gIG91dFs3XSA9IGFbN10gKiB5O1xuICBvdXRbOF0gPSBhWzhdICogejtcbiAgb3V0WzldID0gYVs5XSAqIHo7XG4gIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gIG91dFsxMV0gPSBhWzExXSAqIHo7XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgZ2l2ZW4gYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gIHZhciB4ID0gYXhpc1swXSxcbiAgICAgIHkgPSBheGlzWzFdLFxuICAgICAgeiA9IGF4aXNbMl07XG4gIHZhciBsZW4gPSBNYXRoLmh5cG90KHgsIHksIHopO1xuICB2YXIgcywgYywgdDtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcbiAgdmFyIGIwMCwgYjAxLCBiMDI7XG4gIHZhciBiMTAsIGIxMSwgYjEyO1xuICB2YXIgYjIwLCBiMjEsIGIyMjtcblxuICBpZiAobGVuIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGVuID0gMSAvIGxlbjtcbiAgeCAqPSBsZW47XG4gIHkgKj0gbGVuO1xuICB6ICo9IGxlbjtcbiAgcyA9IE1hdGguc2luKHJhZCk7XG4gIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB0ID0gMSAtIGM7XG4gIGEwMCA9IGFbMF07XG4gIGEwMSA9IGFbMV07XG4gIGEwMiA9IGFbMl07XG4gIGEwMyA9IGFbM107XG4gIGExMCA9IGFbNF07XG4gIGExMSA9IGFbNV07XG4gIGExMiA9IGFbNl07XG4gIGExMyA9IGFbN107XG4gIGEyMCA9IGFbOF07XG4gIGEyMSA9IGFbOV07XG4gIGEyMiA9IGFbMTBdO1xuICBhMjMgPSBhWzExXTsgLy8gQ29uc3RydWN0IHRoZSBlbGVtZW50cyBvZiB0aGUgcm90YXRpb24gbWF0cml4XG5cbiAgYjAwID0geCAqIHggKiB0ICsgYztcbiAgYjAxID0geSAqIHggKiB0ICsgeiAqIHM7XG4gIGIwMiA9IHogKiB4ICogdCAtIHkgKiBzO1xuICBiMTAgPSB4ICogeSAqIHQgLSB6ICogcztcbiAgYjExID0geSAqIHkgKiB0ICsgYztcbiAgYjEyID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gIGIyMCA9IHggKiB6ICogdCArIHkgKiBzO1xuICBiMjEgPSB5ICogeiAqIHQgLSB4ICogcztcbiAgYjIyID0geiAqIHogKiB0ICsgYzsgLy8gUGVyZm9ybSByb3RhdGlvbi1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBhMDAgKiBiMDAgKyBhMTAgKiBiMDEgKyBhMjAgKiBiMDI7XG4gIG91dFsxXSA9IGEwMSAqIGIwMCArIGExMSAqIGIwMSArIGEyMSAqIGIwMjtcbiAgb3V0WzJdID0gYTAyICogYjAwICsgYTEyICogYjAxICsgYTIyICogYjAyO1xuICBvdXRbM10gPSBhMDMgKiBiMDAgKyBhMTMgKiBiMDEgKyBhMjMgKiBiMDI7XG4gIG91dFs0XSA9IGEwMCAqIGIxMCArIGExMCAqIGIxMSArIGEyMCAqIGIxMjtcbiAgb3V0WzVdID0gYTAxICogYjEwICsgYTExICogYjExICsgYTIxICogYjEyO1xuICBvdXRbNl0gPSBhMDIgKiBiMTAgKyBhMTIgKiBiMTEgKyBhMjIgKiBiMTI7XG4gIG91dFs3XSA9IGEwMyAqIGIxMCArIGExMyAqIGIxMSArIGEyMyAqIGIxMjtcbiAgb3V0WzhdID0gYTAwICogYjIwICsgYTEwICogYjIxICsgYTIwICogYjIyO1xuICBvdXRbOV0gPSBhMDEgKiBiMjAgKyBhMTEgKiBiMjEgKyBhMjEgKiBiMjI7XG4gIG91dFsxMF0gPSBhMDIgKiBiMjAgKyBhMTIgKiBiMjEgKyBhMjIgKiBiMjI7XG4gIG91dFsxMV0gPSBhMDMgKiBiMjAgKyBhMTMgKiBiMjEgKyBhMjMgKiBiMjI7XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMTAgPSBhWzRdO1xuICB2YXIgYTExID0gYVs1XTtcbiAgdmFyIGExMiA9IGFbNl07XG4gIHZhciBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XTtcbiAgdmFyIGEyMSA9IGFbOV07XG4gIHZhciBhMjIgPSBhWzEwXTtcbiAgdmFyIGEyMyA9IGFbMTFdO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzRdID0gYTEwICogYyArIGEyMCAqIHM7XG4gIG91dFs1XSA9IGExMSAqIGMgKyBhMjEgKiBzO1xuICBvdXRbNl0gPSBhMTIgKiBjICsgYTIyICogcztcbiAgb3V0WzddID0gYTEzICogYyArIGEyMyAqIHM7XG4gIG91dFs4XSA9IGEyMCAqIGMgLSBhMTAgKiBzO1xuICBvdXRbOV0gPSBhMjEgKiBjIC0gYTExICogcztcbiAgb3V0WzEwXSA9IGEyMiAqIGMgLSBhMTIgKiBzO1xuICBvdXRbMTFdID0gYTIzICogYyAtIGExMyAqIHM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB2YXIgYTAwID0gYVswXTtcbiAgdmFyIGEwMSA9IGFbMV07XG4gIHZhciBhMDIgPSBhWzJdO1xuICB2YXIgYTAzID0gYVszXTtcbiAgdmFyIGEyMCA9IGFbOF07XG4gIHZhciBhMjEgPSBhWzldO1xuICB2YXIgYTIyID0gYVsxMF07XG4gIHZhciBhMjMgPSBhWzExXTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuXG4gIG91dFswXSA9IGEwMCAqIGMgLSBhMjAgKiBzO1xuICBvdXRbMV0gPSBhMDEgKiBjIC0gYTIxICogcztcbiAgb3V0WzJdID0gYTAyICogYyAtIGEyMiAqIHM7XG4gIG91dFszXSA9IGEwMyAqIGMgLSBhMjMgKiBzO1xuICBvdXRbOF0gPSBhMDAgKiBzICsgYTIwICogYztcbiAgb3V0WzldID0gYTAxICogcyArIGEyMSAqIGM7XG4gIG91dFsxMF0gPSBhMDIgKiBzICsgYTIyICogYztcbiAgb3V0WzExXSA9IGEwMyAqIHMgKyBhMjMgKiBjO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGEwMCA9IGFbMF07XG4gIHZhciBhMDEgPSBhWzFdO1xuICB2YXIgYTAyID0gYVsyXTtcbiAgdmFyIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdO1xuICB2YXIgYTExID0gYVs1XTtcbiAgdmFyIGExMiA9IGFbNl07XG4gIHZhciBhMTMgPSBhWzddO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbMF0gPSBhMDAgKiBjICsgYTEwICogcztcbiAgb3V0WzFdID0gYTAxICogYyArIGExMSAqIHM7XG4gIG91dFsyXSA9IGEwMiAqIGMgKyBhMTIgKiBzO1xuICBvdXRbM10gPSBhMDMgKiBjICsgYTEzICogcztcbiAgb3V0WzRdID0gYTEwICogYyAtIGEwMCAqIHM7XG4gIG91dFs1XSA9IGExMSAqIGMgLSBhMDEgKiBzO1xuICBvdXRbNl0gPSBhMTIgKiBjIC0gYTAyICogcztcbiAgb3V0WzddID0gYTEzICogYyAtIGEwMyAqIHM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uKG91dCwgdikge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdO1xuICBvdXRbMTNdID0gdlsxXTtcbiAgb3V0WzE0XSA9IHZbMl07XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikge1xuICBvdXRbMF0gPSB2WzBdO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSB2WzFdO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gdlsyXTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZSBhcm91bmQgYSBnaXZlbiBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZShkZXN0LCBkZXN0LCByYWQsIGF4aXMpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCwgYXhpcykge1xuICB2YXIgeCA9IGF4aXNbMF0sXG4gICAgICB5ID0gYXhpc1sxXSxcbiAgICAgIHogPSBheGlzWzJdO1xuICB2YXIgbGVuID0gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbiAgdmFyIHMsIGMsIHQ7XG5cbiAgaWYgKGxlbiA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxlbiA9IDEgLyBsZW47XG4gIHggKj0gbGVuO1xuICB5ICo9IGxlbjtcbiAgeiAqPSBsZW47XG4gIHMgPSBNYXRoLnNpbihyYWQpO1xuICBjID0gTWF0aC5jb3MocmFkKTtcbiAgdCA9IDEgLSBjOyAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IHggKiB4ICogdCArIGM7XG4gIG91dFsxXSA9IHkgKiB4ICogdCArIHogKiBzO1xuICBvdXRbMl0gPSB6ICogeCAqIHQgLSB5ICogcztcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geCAqIHkgKiB0IC0geiAqIHM7XG4gIG91dFs1XSA9IHkgKiB5ICogdCArIGM7XG4gIG91dFs2XSA9IHogKiB5ICogdCArIHggKiBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB4ICogeiAqIHQgKyB5ICogcztcbiAgb3V0WzldID0geSAqIHogKiB0IC0geCAqIHM7XG4gIG91dFsxMF0gPSB6ICogeiAqIHQgKyBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQucm90YXRlWChkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21YUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBjO1xuICBvdXRbNl0gPSBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAtcztcbiAgb3V0WzEwXSA9IGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFkgYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGVZKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVlSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSBzO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZVooZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWlJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLXM7XG4gIG91dFs1XSA9IGM7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24gYW5kIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBxLCB2KSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSAoeXkgKyB6eik7XG4gIG91dFsxXSA9IHh5ICsgd3o7XG4gIG91dFsyXSA9IHh6IC0gd3k7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHh5IC0gd3o7XG4gIG91dFs1XSA9IDEgLSAoeHggKyB6eik7XG4gIG91dFs2XSA9IHl6ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHh6ICsgd3k7XG4gIG91dFs5XSA9IHl6IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0gKHh4ICsgeXkpO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBmcm9tIGEgZHVhbCBxdWF0LlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IE1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIER1YWwgUXVhdGVybmlvblxuICogQHJldHVybnMge21hdDR9IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQyKG91dCwgYSkge1xuICB2YXIgdHJhbnNsYXRpb24gPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgdmFyIG1hZ25pdHVkZSA9IGJ4ICogYnggKyBieSAqIGJ5ICsgYnogKiBieiArIGJ3ICogYnc7IC8vT25seSBzY2FsZSBpZiBpdCBtYWtlcyBzZW5zZVxuXG4gIGlmIChtYWduaXR1ZGUgPiAwKSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyIC8gbWFnbml0dWRlO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMiAvIG1hZ25pdHVkZTtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDIgLyBtYWduaXR1ZGU7XG4gIH0gZWxzZSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMjtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDI7XG4gIH1cblxuICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIGEsIHRyYW5zbGF0aW9uKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIGNvbXBvbmVudCBvZiBhIHRyYW5zZm9ybWF0aW9uXG4gKiAgbWF0cml4LiBJZiBhIG1hdHJpeCBpcyBidWlsdCB3aXRoIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uLFxuICogIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dCBWZWN0b3IgdG8gcmVjZWl2ZSB0cmFuc2xhdGlvbiBjb21wb25lbnRcbiAqIEBwYXJhbSAge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbihvdXQsIG1hdCkge1xuICBvdXRbMF0gPSBtYXRbMTJdO1xuICBvdXRbMV0gPSBtYXRbMTNdO1xuICBvdXRbMl0gPSBtYXRbMTRdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzY2FsaW5nIGZhY3RvciBjb21wb25lbnQgb2YgYSB0cmFuc2Zvcm1hdGlvblxuICogIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aCBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlXG4gKiAgd2l0aCBhIG5vcm1hbGl6ZWQgUXVhdGVybmlvbiBwYXJhbXRlciwgdGhlIHJldHVybmVkIHZlY3RvciB3aWxsIGJlXG4gKiAgdGhlIHNhbWUgYXMgdGhlIHNjYWxpbmcgdmVjdG9yXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dCBWZWN0b3IgdG8gcmVjZWl2ZSBzY2FsaW5nIGZhY3RvciBjb21wb25lbnRcbiAqIEBwYXJhbSAge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsaW5nKG91dCwgbWF0KSB7XG4gIHZhciBtMTEgPSBtYXRbMF07XG4gIHZhciBtMTIgPSBtYXRbMV07XG4gIHZhciBtMTMgPSBtYXRbMl07XG4gIHZhciBtMjEgPSBtYXRbNF07XG4gIHZhciBtMjIgPSBtYXRbNV07XG4gIHZhciBtMjMgPSBtYXRbNl07XG4gIHZhciBtMzEgPSBtYXRbOF07XG4gIHZhciBtMzIgPSBtYXRbOV07XG4gIHZhciBtMzMgPSBtYXRbMTBdO1xuICBvdXRbMF0gPSBNYXRoLmh5cG90KG0xMSwgbTEyLCBtMTMpO1xuICBvdXRbMV0gPSBNYXRoLmh5cG90KG0yMSwgbTIyLCBtMjMpO1xuICBvdXRbMl0gPSBNYXRoLmh5cG90KG0zMSwgbTMyLCBtMzMpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJvdGF0aW9uYWwgY29tcG9uZW50XG4gKiAgb2YgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGhcbiAqICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbiwgdGhlIHJldHVybmVkIHF1YXRlcm5pb24gd2lsbCBiZSB0aGVcbiAqICBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIG9yaWdpbmFsbHkgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBRdWF0ZXJuaW9uIHRvIHJlY2VpdmUgdGhlIHJvdGF0aW9uIGNvbXBvbmVudFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXG4gKiBAcmV0dXJuIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRpb24ob3V0LCBtYXQpIHtcbiAgdmFyIHNjYWxpbmcgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgZ2V0U2NhbGluZyhzY2FsaW5nLCBtYXQpO1xuICB2YXIgaXMxID0gMSAvIHNjYWxpbmdbMF07XG4gIHZhciBpczIgPSAxIC8gc2NhbGluZ1sxXTtcbiAgdmFyIGlzMyA9IDEgLyBzY2FsaW5nWzJdO1xuICB2YXIgc20xMSA9IG1hdFswXSAqIGlzMTtcbiAgdmFyIHNtMTIgPSBtYXRbMV0gKiBpczI7XG4gIHZhciBzbTEzID0gbWF0WzJdICogaXMzO1xuICB2YXIgc20yMSA9IG1hdFs0XSAqIGlzMTtcbiAgdmFyIHNtMjIgPSBtYXRbNV0gKiBpczI7XG4gIHZhciBzbTIzID0gbWF0WzZdICogaXMzO1xuICB2YXIgc20zMSA9IG1hdFs4XSAqIGlzMTtcbiAgdmFyIHNtMzIgPSBtYXRbOV0gKiBpczI7XG4gIHZhciBzbTMzID0gbWF0WzEwXSAqIGlzMztcbiAgdmFyIHRyYWNlID0gc20xMSArIHNtMjIgKyBzbTMzO1xuICB2YXIgUyA9IDA7XG5cbiAgaWYgKHRyYWNlID4gMCkge1xuICAgIFMgPSBNYXRoLnNxcnQodHJhY2UgKyAxLjApICogMjtcbiAgICBvdXRbM10gPSAwLjI1ICogUztcbiAgICBvdXRbMF0gPSAoc20yMyAtIHNtMzIpIC8gUztcbiAgICBvdXRbMV0gPSAoc20zMSAtIHNtMTMpIC8gUztcbiAgICBvdXRbMl0gPSAoc20xMiAtIHNtMjEpIC8gUztcbiAgfSBlbHNlIGlmIChzbTExID4gc20yMiAmJiBzbTExID4gc20zMykge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20xMSAtIHNtMjIgLSBzbTMzKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMjMgLSBzbTMyKSAvIFM7XG4gICAgb3V0WzBdID0gMC4yNSAqIFM7XG4gICAgb3V0WzFdID0gKHNtMTIgKyBzbTIxKSAvIFM7XG4gICAgb3V0WzJdID0gKHNtMzEgKyBzbTEzKSAvIFM7XG4gIH0gZWxzZSBpZiAoc20yMiA+IHNtMzMpIHtcbiAgICBTID0gTWF0aC5zcXJ0KDEuMCArIHNtMjIgLSBzbTExIC0gc20zMykgKiAyO1xuICAgIG91dFszXSA9IChzbTMxIC0gc20xMykgLyBTO1xuICAgIG91dFswXSA9IChzbTEyICsgc20yMSkgLyBTO1xuICAgIG91dFsxXSA9IDAuMjUgKiBTO1xuICAgIG91dFsyXSA9IChzbTIzICsgc20zMikgLyBTO1xuICB9IGVsc2Uge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20zMyAtIHNtMTEgLSBzbTIyKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMTIgLSBzbTIxKSAvIFM7XG4gICAgb3V0WzBdID0gKHNtMzEgKyBzbTEzKSAvIFM7XG4gICAgb3V0WzFdID0gKHNtMjMgKyBzbTMyKSAvIFM7XG4gICAgb3V0WzJdID0gMC4yNSAqIFM7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uLCB2ZWN0b3IgdHJhbnNsYXRpb24gYW5kIHZlY3RvciBzY2FsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZShvdXQsIHEsIHYsIHMpIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgb3V0WzBdID0gKDEgLSAoeXkgKyB6eikpICogc3g7XG4gIG91dFsxXSA9ICh4eSArIHd6KSAqIHN4O1xuICBvdXRbMl0gPSAoeHogLSB3eSkgKiBzeDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gKHh5IC0gd3opICogc3k7XG4gIG91dFs1XSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICBvdXRbNl0gPSAoeXogKyB3eCkgKiBzeTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gKHh6ICsgd3kpICogc3o7XG4gIG91dFs5XSA9ICh5eiAtIHd4KSAqIHN6O1xuICBvdXRbMTBdID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiwgdmVjdG9yIHRyYW5zbGF0aW9uIGFuZCB2ZWN0b3Igc2NhbGUsIHJvdGF0aW5nIGFuZCBzY2FsaW5nIGFyb3VuZCB0aGUgZ2l2ZW4gb3JpZ2luXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIG9yaWdpbik7XG4gKiAgICAgbGV0IHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xuICogICAgIG1hdDQuc2NhbGUoZGVzdCwgc2NhbGUpXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgbmVnYXRpdmVPcmlnaW4pO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcyBTY2FsaW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IG8gVGhlIG9yaWdpbiB2ZWN0b3IgYXJvdW5kIHdoaWNoIHRvIHNjYWxlIGFuZCByb3RhdGVcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbihvdXQsIHEsIHYsIHMsIG8pIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgdmFyIG94ID0gb1swXTtcbiAgdmFyIG95ID0gb1sxXTtcbiAgdmFyIG96ID0gb1syXTtcbiAgdmFyIG91dDAgPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgdmFyIG91dDEgPSAoeHkgKyB3eikgKiBzeDtcbiAgdmFyIG91dDIgPSAoeHogLSB3eSkgKiBzeDtcbiAgdmFyIG91dDQgPSAoeHkgLSB3eikgKiBzeTtcbiAgdmFyIG91dDUgPSAoMSAtICh4eCArIHp6KSkgKiBzeTtcbiAgdmFyIG91dDYgPSAoeXogKyB3eCkgKiBzeTtcbiAgdmFyIG91dDggPSAoeHogKyB3eSkgKiBzejtcbiAgdmFyIG91dDkgPSAoeXogLSB3eCkgKiBzejtcbiAgdmFyIG91dDEwID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFswXSA9IG91dDA7XG4gIG91dFsxXSA9IG91dDE7XG4gIG91dFsyXSA9IG91dDI7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IG91dDQ7XG4gIG91dFs1XSA9IG91dDU7XG4gIG91dFs2XSA9IG91dDY7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IG91dDg7XG4gIG91dFs5XSA9IG91dDk7XG4gIG91dFsxMF0gPSBvdXQxMDtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdICsgb3ggLSAob3V0MCAqIG94ICsgb3V0NCAqIG95ICsgb3V0OCAqIG96KTtcbiAgb3V0WzEzXSA9IHZbMV0gKyBveSAtIChvdXQxICogb3ggKyBvdXQ1ICogb3kgKyBvdXQ5ICogb3opO1xuICBvdXRbMTRdID0gdlsyXSArIG96IC0gKG91dDIgKiBveCArIG91dDYgKiBveSArIG91dDEwICogb3opO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyBhIDR4NCBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIFF1YXRlcm5pb24gdG8gY3JlYXRlIG1hdHJpeCBmcm9tXG4gKlxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUXVhdChvdXQsIHEpIHtcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB5eCA9IHkgKiB4MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgenggPSB6ICogeDI7XG4gIHZhciB6eSA9IHogKiB5MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICBvdXRbMF0gPSAxIC0geXkgLSB6ejtcbiAgb3V0WzFdID0geXggKyB3ejtcbiAgb3V0WzJdID0genggLSB3eTtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geXggLSB3ejtcbiAgb3V0WzVdID0gMSAtIHh4IC0geno7XG4gIG91dFs2XSA9IHp5ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHp4ICsgd3k7XG4gIG91dFs5XSA9IHp5IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0geHggLSB5eTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBmcnVzdHVtIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge051bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJ1c3R1bShvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gIHZhciBybCA9IDEgLyAocmlnaHQgLSBsZWZ0KTtcbiAgdmFyIHRiID0gMSAvICh0b3AgLSBib3R0b20pO1xuICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMF0gPSBuZWFyICogMiAqIHJsO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBuZWFyICogMiAqIHRiO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAocmlnaHQgKyBsZWZ0KSAqIHJsO1xuICBvdXRbOV0gPSAodG9wICsgYm90dG9tKSAqIHRiO1xuICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gZmFyICogbmVhciAqIDIgKiBuZjtcbiAgb3V0WzE1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cbiAqIFRoZSBuZWFyL2ZhciBjbGlwIHBsYW5lcyBjb3JyZXNwb25kIHRvIGEgbm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZSBaIHJhbmdlIG9mIFstMSwgMV0sXG4gKiB3aGljaCBtYXRjaGVzIFdlYkdML09wZW5HTCdzIGNsaXAgdm9sdW1lLlxuICogUGFzc2luZyBudWxsL3VuZGVmaW5lZC9ubyB2YWx1ZSBmb3IgZmFyIHdpbGwgZ2VuZXJhdGUgaW5maW5pdGUgcHJvamVjdGlvbiBtYXRyaXguXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW0sIGNhbiBiZSBudWxsIG9yIEluZmluaXR5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlTk8ob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgIG5mO1xuICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBmO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTFdID0gLTE7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE1XSA9IDA7XG5cbiAgaWYgKGZhciAhPSBudWxsICYmIGZhciAhPT0gSW5maW5pdHkpIHtcbiAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxNF0gPSAyICogZmFyICogbmVhciAqIG5mO1xuICB9IGVsc2Uge1xuICAgIG91dFsxMF0gPSAtMTtcbiAgICBvdXRbMTRdID0gLTIgKiBuZWFyO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0LnBlcnNwZWN0aXZlTk99XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHBlcnNwZWN0aXZlID0gcGVyc3BlY3RpdmVOTztcbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggc3VpdGFibGUgZm9yIFdlYkdQVSB3aXRoIHRoZSBnaXZlbiBib3VuZHMuXG4gKiBUaGUgbmVhci9mYXIgY2xpcCBwbGFuZXMgY29ycmVzcG9uZCB0byBhIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGUgWiByYW5nZSBvZiBbMCwgMV0sXG4gKiB3aGljaCBtYXRjaGVzIFdlYkdQVS9WdWxrYW4vRGlyZWN0WC9NZXRhbCdzIGNsaXAgdm9sdW1lLlxuICogUGFzc2luZyBudWxsL3VuZGVmaW5lZC9ubyB2YWx1ZSBmb3IgZmFyIHdpbGwgZ2VuZXJhdGUgaW5maW5pdGUgcHJvamVjdGlvbiBtYXRyaXguXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW0sIGNhbiBiZSBudWxsIG9yIEluZmluaXR5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlWk8ob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgIG5mO1xuICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBmO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTFdID0gLTE7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE1XSA9IDA7XG5cbiAgaWYgKGZhciAhPSBudWxsICYmIGZhciAhPT0gSW5maW5pdHkpIHtcbiAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzEwXSA9IGZhciAqIG5mO1xuICAgIG91dFsxNF0gPSBmYXIgKiBuZWFyICogbmY7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzEwXSA9IC0xO1xuICAgIG91dFsxNF0gPSAtbmVhcjtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGZpZWxkIG9mIHZpZXcuXG4gKiBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGdlbmVyYXRpbmcgcHJvamVjdGlvbiBtYXRyaWNlcyB0byBiZSB1c2VkXG4gKiB3aXRoIHRoZSBzdGlsbCBleHBlcmllbWVudGFsIFdlYlZSIEFQSS5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge09iamVjdH0gZm92IE9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiB1cERlZ3JlZXMsIGRvd25EZWdyZWVzLCBsZWZ0RGVncmVlcywgcmlnaHREZWdyZWVzXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyhvdXQsIGZvdiwgbmVhciwgZmFyKSB7XG4gIHZhciB1cFRhbiA9IE1hdGgudGFuKGZvdi51cERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgZG93blRhbiA9IE1hdGgudGFuKGZvdi5kb3duRGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciBsZWZ0VGFuID0gTWF0aC50YW4oZm92LmxlZnREZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIHJpZ2h0VGFuID0gTWF0aC50YW4oZm92LnJpZ2h0RGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciB4U2NhbGUgPSAyLjAgLyAobGVmdFRhbiArIHJpZ2h0VGFuKTtcbiAgdmFyIHlTY2FsZSA9IDIuMCAvICh1cFRhbiArIGRvd25UYW4pO1xuICBvdXRbMF0gPSB4U2NhbGU7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICBvdXRbM10gPSAwLjA7XG4gIG91dFs0XSA9IDAuMDtcbiAgb3V0WzVdID0geVNjYWxlO1xuICBvdXRbNl0gPSAwLjA7XG4gIG91dFs3XSA9IDAuMDtcbiAgb3V0WzhdID0gLSgobGVmdFRhbiAtIHJpZ2h0VGFuKSAqIHhTY2FsZSAqIDAuNSk7XG4gIG91dFs5XSA9ICh1cFRhbiAtIGRvd25UYW4pICogeVNjYWxlICogMC41O1xuICBvdXRbMTBdID0gZmFyIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMTFdID0gLTEuMDtcbiAgb3V0WzEyXSA9IDAuMDtcbiAgb3V0WzEzXSA9IDAuMDtcbiAgb3V0WzE0XSA9IGZhciAqIG5lYXIgLyAobmVhciAtIGZhcik7XG4gIG91dFsxNV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIG9ydGhvZ29uYWwgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLlxuICogVGhlIG5lYXIvZmFyIGNsaXAgcGxhbmVzIGNvcnJlc3BvbmQgdG8gYSBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlIFogcmFuZ2Ugb2YgWy0xLCAxXSxcbiAqIHdoaWNoIG1hdGNoZXMgV2ViR0wvT3BlbkdMJ3MgY2xpcCB2b2x1bWUuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGxlZnQgTGVmdCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IHJpZ2h0IFJpZ2h0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIEJvdHRvbSBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IHRvcCBUb3AgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9ydGhvTk8ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICB2YXIgbHIgPSAxIC8gKGxlZnQgLSByaWdodCk7XG4gIHZhciBidCA9IDEgLyAoYm90dG9tIC0gdG9wKTtcbiAgdmFyIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzBdID0gLTIgKiBscjtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gLTIgKiBidDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDIgKiBuZjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICBvdXRbMTNdID0gKHRvcCArIGJvdHRvbSkgKiBidDtcbiAgb3V0WzE0XSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0Lm9ydGhvTk99XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG9ydGhvID0gb3J0aG9OTztcbi8qKlxuICogR2VuZXJhdGVzIGEgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHMuXG4gKiBUaGUgbmVhci9mYXIgY2xpcCBwbGFuZXMgY29ycmVzcG9uZCB0byBhIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGUgWiByYW5nZSBvZiBbMCwgMV0sXG4gKiB3aGljaCBtYXRjaGVzIFdlYkdQVS9WdWxrYW4vRGlyZWN0WC9NZXRhbCdzIGNsaXAgdm9sdW1lLlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBvcnRob1pPKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgdmFyIGxyID0gMSAvIChsZWZ0IC0gcmlnaHQpO1xuICB2YXIgYnQgPSAxIC8gKGJvdHRvbSAtIHRvcCk7XG4gIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gIG91dFswXSA9IC0yICogbHI7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IC0yICogYnQ7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSBuZjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICBvdXRbMTNdID0gKHRvcCArIGJvdHRvbSkgKiBidDtcbiAgb3V0WzE0XSA9IG5lYXIgKiBuZjtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzLlxuICogSWYgeW91IHdhbnQgYSBtYXRyaXggdGhhdCBhY3R1YWxseSBtYWtlcyBhbiBvYmplY3QgbG9vayBhdCBhbm90aGVyIG9iamVjdCwgeW91IHNob3VsZCB1c2UgdGFyZ2V0VG8gaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsb29rQXQob3V0LCBleWUsIGNlbnRlciwgdXApIHtcbiAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbjtcbiAgdmFyIGV5ZXggPSBleWVbMF07XG4gIHZhciBleWV5ID0gZXllWzFdO1xuICB2YXIgZXlleiA9IGV5ZVsyXTtcbiAgdmFyIHVweCA9IHVwWzBdO1xuICB2YXIgdXB5ID0gdXBbMV07XG4gIHZhciB1cHogPSB1cFsyXTtcbiAgdmFyIGNlbnRlcnggPSBjZW50ZXJbMF07XG4gIHZhciBjZW50ZXJ5ID0gY2VudGVyWzFdO1xuICB2YXIgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCBnbE1hdHJpeC5FUFNJTE9OICYmIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgfVxuXG4gIHowID0gZXlleCAtIGNlbnRlcng7XG4gIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gIHoyID0gZXlleiAtIGNlbnRlcno7XG4gIGxlbiA9IDEgLyBNYXRoLmh5cG90KHowLCB6MSwgejIpO1xuICB6MCAqPSBsZW47XG4gIHoxICo9IGxlbjtcbiAgejIgKj0gbGVuO1xuICB4MCA9IHVweSAqIHoyIC0gdXB6ICogejE7XG4gIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICBsZW4gPSBNYXRoLmh5cG90KHgwLCB4MSwgeDIpO1xuXG4gIGlmICghbGVuKSB7XG4gICAgeDAgPSAwO1xuICAgIHgxID0gMDtcbiAgICB4MiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gIHkyID0gejAgKiB4MSAtIHoxICogeDA7XG4gIGxlbiA9IE1hdGguaHlwb3QoeTAsIHkxLCB5Mik7XG5cbiAgaWYgKCFsZW4pIHtcbiAgICB5MCA9IDA7XG4gICAgeTEgPSAwO1xuICAgIHkyID0gMDtcbiAgfSBlbHNlIHtcbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHkwICo9IGxlbjtcbiAgICB5MSAqPSBsZW47XG4gICAgeTIgKj0gbGVuO1xuICB9XG5cbiAgb3V0WzBdID0geDA7XG4gIG91dFsxXSA9IHkwO1xuICBvdXRbMl0gPSB6MDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geDE7XG4gIG91dFs1XSA9IHkxO1xuICBvdXRbNl0gPSB6MTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geDI7XG4gIG91dFs5XSA9IHkyO1xuICBvdXRbMTBdID0gejI7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gLSh4MCAqIGV5ZXggKyB4MSAqIGV5ZXkgKyB4MiAqIGV5ZXopO1xuICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgbWF0cml4IHRoYXQgbWFrZXMgc29tZXRoaW5nIGxvb2sgYXQgc29tZXRoaW5nIGVsc2UuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdGFyZ2V0VG8ob3V0LCBleWUsIHRhcmdldCwgdXApIHtcbiAgdmFyIGV5ZXggPSBleWVbMF0sXG4gICAgICBleWV5ID0gZXllWzFdLFxuICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgIHVweCA9IHVwWzBdLFxuICAgICAgdXB5ID0gdXBbMV0sXG4gICAgICB1cHogPSB1cFsyXTtcbiAgdmFyIHowID0gZXlleCAtIHRhcmdldFswXSxcbiAgICAgIHoxID0gZXlleSAtIHRhcmdldFsxXSxcbiAgICAgIHoyID0gZXlleiAtIHRhcmdldFsyXTtcbiAgdmFyIGxlbiA9IHowICogejAgKyB6MSAqIHoxICsgejIgKiB6MjtcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcbiAgfVxuXG4gIHZhciB4MCA9IHVweSAqIHoyIC0gdXB6ICogejEsXG4gICAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejIsXG4gICAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gIGxlbiA9IHgwICogeDAgKyB4MSAqIHgxICsgeDIgKiB4MjtcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIG91dFswXSA9IHgwO1xuICBvdXRbMV0gPSB4MTtcbiAgb3V0WzJdID0geDI7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHoxICogeDIgLSB6MiAqIHgxO1xuICBvdXRbNV0gPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgb3V0WzZdID0gejAgKiB4MSAtIHoxICogeDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHowO1xuICBvdXRbOV0gPSB6MTtcbiAgb3V0WzEwXSA9IHoyO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IGV5ZXg7XG4gIG91dFsxM10gPSBleWV5O1xuICBvdXRbMTRdID0gZXllejtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwibWF0NChcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIiwgXCIgKyBhWzRdICsgXCIsIFwiICsgYVs1XSArIFwiLCBcIiArIGFbNl0gKyBcIiwgXCIgKyBhWzddICsgXCIsIFwiICsgYVs4XSArIFwiLCBcIiArIGFbOV0gKyBcIiwgXCIgKyBhWzEwXSArIFwiLCBcIiArIGFbMTFdICsgXCIsIFwiICsgYVsxMl0gKyBcIiwgXCIgKyBhWzEzXSArIFwiLCBcIiArIGFbMTRdICsgXCIsIFwiICsgYVsxNV0gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIGFbNl0sIGFbN10sIGFbOF0sIGFbOV0sIGFbMTBdLCBhWzExXSwgYVsxMl0sIGFbMTNdLCBhWzE0XSwgYVsxNV0pO1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQ0J3NcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF07XG4gIG91dFs5XSA9IGFbOV0gKyBiWzldO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdICsgYlsxMV07XG4gIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdICsgYlsxNF07XG4gIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICBvdXRbNl0gPSBhWzZdIC0gYls2XTtcbiAgb3V0WzddID0gYVs3XSAtIGJbN107XG4gIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICBvdXRbOV0gPSBhWzldIC0gYls5XTtcbiAgb3V0WzEwXSA9IGFbMTBdIC0gYlsxMF07XG4gIG91dFsxMV0gPSBhWzExXSAtIGJbMTFdO1xuICBvdXRbMTJdID0gYVsxMl0gLSBiWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdIC0gYlsxM107XG4gIG91dFsxNF0gPSBhWzE0XSAtIGJbMTRdO1xuICBvdXRbMTVdID0gYVsxNV0gLSBiWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICBvdXRbNF0gPSBhWzRdICogYjtcbiAgb3V0WzVdID0gYVs1XSAqIGI7XG4gIG91dFs2XSA9IGFbNl0gKiBiO1xuICBvdXRbN10gPSBhWzddICogYjtcbiAgb3V0WzhdID0gYVs4XSAqIGI7XG4gIG91dFs5XSA9IGFbOV0gKiBiO1xuICBvdXRbMTBdID0gYVsxMF0gKiBiO1xuICBvdXRbMTFdID0gYVsxMV0gKiBiO1xuICBvdXRbMTJdID0gYVsxMl0gKiBiO1xuICBvdXRbMTNdID0gYVsxM10gKiBiO1xuICBvdXRbMTRdID0gYVsxNF0gKiBiO1xuICBvdXRbMTVdID0gYVsxNV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQ0J3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XSAqIHNjYWxlO1xuICBvdXRbN10gPSBhWzddICsgYls3XSAqIHNjYWxlO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XSAqIHNjYWxlO1xuICBvdXRbOV0gPSBhWzldICsgYls5XSAqIHNjYWxlO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXSAqIHNjYWxlO1xuICBvdXRbMTFdID0gYVsxMV0gKyBiWzExXSAqIHNjYWxlO1xuICBvdXRbMTJdID0gYVsxMl0gKyBiWzEyXSAqIHNjYWxlO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXSAqIHNjYWxlO1xuICBvdXRbMTRdID0gYVsxNF0gKyBiWzE0XSAqIHNjYWxlO1xuICBvdXRbMTVdID0gYVsxNV0gKyBiWzE1XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgYVs4XSA9PT0gYls4XSAmJiBhWzldID09PSBiWzldICYmIGFbMTBdID09PSBiWzEwXSAmJiBhWzExXSA9PT0gYlsxMV0gJiYgYVsxMl0gPT09IGJbMTJdICYmIGFbMTNdID09PSBiWzEzXSAmJiBhWzE0XSA9PT0gYlsxNF0gJiYgYVsxNV0gPT09IGJbMTVdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdLFxuICAgICAgYTYgPSBhWzZdLFxuICAgICAgYTcgPSBhWzddO1xuICB2YXIgYTggPSBhWzhdLFxuICAgICAgYTkgPSBhWzldLFxuICAgICAgYTEwID0gYVsxMF0sXG4gICAgICBhMTEgPSBhWzExXTtcbiAgdmFyIGExMiA9IGFbMTJdLFxuICAgICAgYTEzID0gYVsxM10sXG4gICAgICBhMTQgPSBhWzE0XSxcbiAgICAgIGExNSA9IGFbMTVdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICB2YXIgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdLFxuICAgICAgYjYgPSBiWzZdLFxuICAgICAgYjcgPSBiWzddO1xuICB2YXIgYjggPSBiWzhdLFxuICAgICAgYjkgPSBiWzldLFxuICAgICAgYjEwID0gYlsxMF0sXG4gICAgICBiMTEgPSBiWzExXTtcbiAgdmFyIGIxMiA9IGJbMTJdLFxuICAgICAgYjEzID0gYlsxM10sXG4gICAgICBiMTQgPSBiWzE0XSxcbiAgICAgIGIxNSA9IGJbMTVdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkgJiYgTWF0aC5hYnMoYTYgLSBiNikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTYpLCBNYXRoLmFicyhiNikpICYmIE1hdGguYWJzKGE3IC0gYjcpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKSAmJiBNYXRoLmFicyhhOCAtIGI4KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOCksIE1hdGguYWJzKGI4KSkgJiYgTWF0aC5hYnMoYTkgLSBiOSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTkpLCBNYXRoLmFicyhiOSkpICYmIE1hdGguYWJzKGExMCAtIGIxMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEwKSwgTWF0aC5hYnMoYjEwKSkgJiYgTWF0aC5hYnMoYTExIC0gYjExKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTEpLCBNYXRoLmFicyhiMTEpKSAmJiBNYXRoLmFicyhhMTIgLSBiMTIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMiksIE1hdGguYWJzKGIxMikpICYmIE1hdGguYWJzKGExMyAtIGIxMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEzKSwgTWF0aC5hYnMoYjEzKSkgJiYgTWF0aC5hYnMoYTE0IC0gYjE0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTQpLCBNYXRoLmFicyhiMTQpKSAmJiBNYXRoLmFicyhhMTUgLSBiMTUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExNSksIE1hdGguYWJzKGIxNSkpO1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiAzIERpbWVuc2lvbmFsIFZlY3RvclxuICogQG1vZHVsZSB2ZWMzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMzXG4gKlxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzMgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4LCB5LCB6KSB7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2VpbFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5jZWlsKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gZmxvb3JcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguZmxvb3IoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWF4KGFbMl0sIGJbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyBhIHZlYzMgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWMzJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHopO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICBvdXRbMl0gPSBhWzJdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCBhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl07XG4gIHZhciBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl07XG4gIG91dFswXSA9IGF5ICogYnogLSBheiAqIGJ5O1xuICBvdXRbMV0gPSBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXTtcbiAgdmFyIGF5ID0gYVsxXTtcbiAgdmFyIGF6ID0gYVsyXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBoZXJtaXRlIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBoZXJtaXRlKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgZmFjdG9yVGltZXMyID0gdCAqIHQ7XG4gIHZhciBmYWN0b3IxID0gZmFjdG9yVGltZXMyICogKDIgKiB0IC0gMykgKyAxO1xuICB2YXIgZmFjdG9yMiA9IGZhY3RvclRpbWVzMiAqICh0IC0gMikgKyB0O1xuICB2YXIgZmFjdG9yMyA9IGZhY3RvclRpbWVzMiAqICh0IC0gMSk7XG4gIHZhciBmYWN0b3I0ID0gZmFjdG9yVGltZXMyICogKDMgLSAyICogdCk7XG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgYmV6aWVyIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBiZXppZXIob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBpbnZlcnNlRmFjdG9yID0gMSAtIHQ7XG4gIHZhciBpbnZlcnNlRmFjdG9yVGltZXNUd28gPSBpbnZlcnNlRmFjdG9yICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvclRpbWVzMiA9IHQgKiB0O1xuICB2YXIgZmFjdG9yMSA9IGludmVyc2VGYWN0b3JUaW1lc1R3byAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3IyID0gMyAqIHQgKiBpbnZlcnNlRmFjdG9yVGltZXNUd287XG4gIHZhciBmYWN0b3IzID0gMyAqIGZhY3RvclRpbWVzMiAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3I0ID0gZmFjdG9yVGltZXMyICogdDtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG4gIHZhciByID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICB2YXIgeiA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wIC0gMS4wO1xuICB2YXIgelNjYWxlID0gTWF0aC5zcXJ0KDEuMCAtIHogKiB6KSAqIHNjYWxlO1xuICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHpTY2FsZTtcbiAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiB6U2NhbGU7XG4gIG91dFsyXSA9IHogKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0NC5cbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0NChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgdmFyIHcgPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV07XG4gIHcgPSB3IHx8IDEuMDtcbiAgb3V0WzBdID0gKG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdKSAvIHc7XG4gIG91dFsxXSA9IChtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSkgLyB3O1xuICBvdXRbMl0gPSAobVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdKSAvIHc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDMuXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSB0aGUgM3gzIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgb3V0WzJdID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBxdWF0XG4gKiBDYW4gYWxzbyBiZSB1c2VkIGZvciBkdWFsIHF1YXRlcm5pb25zLiAoTXVsdGlwbHkgaXQgd2l0aCB0aGUgcmVhbCBwYXJ0KVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1RdWF0KG91dCwgYSwgcSkge1xuICAvLyBiZW5jaG1hcmtzOiBodHRwczovL2pzcGVyZi5jb20vcXVhdGVybmlvbi10cmFuc2Zvcm0tdmVjMy1pbXBsZW1lbnRhdGlvbnMtZml4ZWRcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXTtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTsgLy8gdmFyIHF2ZWMgPSBbcXgsIHF5LCBxel07XG4gIC8vIHZhciB1diA9IHZlYzMuY3Jvc3MoW10sIHF2ZWMsIGEpO1xuXG4gIHZhciB1dnggPSBxeSAqIHogLSBxeiAqIHksXG4gICAgICB1dnkgPSBxeiAqIHggLSBxeCAqIHosXG4gICAgICB1dnogPSBxeCAqIHkgLSBxeSAqIHg7IC8vIHZhciB1dXYgPSB2ZWMzLmNyb3NzKFtdLCBxdmVjLCB1dik7XG5cbiAgdmFyIHV1dnggPSBxeSAqIHV2eiAtIHF6ICogdXZ5LFxuICAgICAgdXV2eSA9IHF6ICogdXZ4IC0gcXggKiB1dnosXG4gICAgICB1dXZ6ID0gcXggKiB1dnkgLSBxeSAqIHV2eDsgLy8gdmVjMy5zY2FsZSh1diwgdXYsIDIgKiB3KTtcblxuICB2YXIgdzIgPSBxdyAqIDI7XG4gIHV2eCAqPSB3MjtcbiAgdXZ5ICo9IHcyO1xuICB1dnogKj0gdzI7IC8vIHZlYzMuc2NhbGUodXV2LCB1dXYsIDIpO1xuXG4gIHV1dnggKj0gMjtcbiAgdXV2eSAqPSAyO1xuICB1dXZ6ICo9IDI7IC8vIHJldHVybiB2ZWMzLmFkZChvdXQsIGEsIHZlYzMuYWRkKG91dCwgdXYsIHV1dikpO1xuXG4gIG91dFswXSA9IHggKyB1dnggKyB1dXZ4O1xuICBvdXRbMV0gPSB5ICsgdXZ5ICsgdXV2eTtcbiAgb3V0WzJdID0geiArIHV2eiArIHV1dno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHgtYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgdmVjMyBwb2ludCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzBdO1xuICByWzFdID0gcFsxXSAqIE1hdGguY29zKHJhZCkgLSBwWzJdICogTWF0aC5zaW4ocmFkKTtcbiAgclsyXSA9IHBbMV0gKiBNYXRoLnNpbihyYWQpICsgcFsyXSAqIE1hdGguY29zKHJhZCk7IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB5LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFsyXSAqIE1hdGguc2luKHJhZCkgKyBwWzBdICogTWF0aC5jb3MocmFkKTtcbiAgclsxXSA9IHBbMV07XG4gIHJbMl0gPSBwWzJdICogTWF0aC5jb3MocmFkKSAtIHBbMF0gKiBNYXRoLnNpbihyYWQpOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgei1heGlzXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIGIsIHJhZCkge1xuICB2YXIgcCA9IFtdLFxuICAgICAgciA9IFtdOyAvL1RyYW5zbGF0ZSBwb2ludCB0byB0aGUgb3JpZ2luXG5cbiAgcFswXSA9IGFbMF0gLSBiWzBdO1xuICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIHBbMl0gPSBhWzJdIC0gYlsyXTsgLy9wZXJmb3JtIHJvdGF0aW9uXG5cbiAgclswXSA9IHBbMF0gKiBNYXRoLmNvcyhyYWQpIC0gcFsxXSAqIE1hdGguc2luKHJhZCk7XG4gIHJbMV0gPSBwWzBdICogTWF0aC5zaW4ocmFkKSArIHBbMV0gKiBNYXRoLmNvcyhyYWQpO1xuICByWzJdID0gcFsyXTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0d28gM0QgdmVjdG9yc1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgYnogPSBiWzJdLFxuICAgICAgbWFnMSA9IE1hdGguc3FydChheCAqIGF4ICsgYXkgKiBheSArIGF6ICogYXopLFxuICAgICAgbWFnMiA9IE1hdGguc3FydChieCAqIGJ4ICsgYnkgKiBieSArIGJ6ICogYnopLFxuICAgICAgbWFnID0gbWFnMSAqIG1hZzIsXG4gICAgICBjb3NpbmUgPSBtYWcgJiYgZG90KGEsIGIpIC8gbWFnO1xuICByZXR1cm4gTWF0aC5hY29zKE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSk7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gemVyb1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJ2ZWMzKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzNzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzMuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMzcyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSAzO1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICAgIGFbaSArIDJdID0gdmVjWzJdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiA0IERpbWVuc2lvbmFsIFZlY3RvclxuICogQG1vZHVsZSB2ZWM0XG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWM0XG4gKlxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6LCB3KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeiwgdykge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gIG91dFszXSA9IGFbM10gKiBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gIG91dFszXSA9IGFbM10gLyBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjZWlsXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmNlaWwoYVsyXSk7XG4gIG91dFszXSA9IE1hdGguY2VpbChhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGZsb29yXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICBvdXRbM10gPSBNYXRoLmZsb29yKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtaW4ob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWluKGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWF4KGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gIG91dFszXSA9IE1hdGgucm91bmQoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyBhIHZlYzQgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjNCdzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6LCB3KTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgdmFyIHcgPSBiWzNdIC0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeiwgdyk7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgb3V0WzNdID0gLWFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgb3V0WzJdID0gMS4wIC8gYVsyXTtcbiAgb3V0WzNdID0gMS4wIC8gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSB4ICogbGVuO1xuICBvdXRbMV0gPSB5ICogbGVuO1xuICBvdXRbMl0gPSB6ICogbGVuO1xuICBvdXRbM10gPSB3ICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGNyb3NzLXByb2R1Y3Qgb2YgdGhyZWUgdmVjdG9ycyBpbiBhIDQtZGltZW5zaW9uYWwgc3BhY2VcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gcmVzdWx0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gVSB0aGUgZmlyc3QgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gViB0aGUgc2Vjb25kIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IFcgdGhlIHRoaXJkIHZlY3RvclxuICogQHJldHVybnMge3ZlYzR9IHJlc3VsdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIHUsIHYsIHcpIHtcbiAgdmFyIEEgPSB2WzBdICogd1sxXSAtIHZbMV0gKiB3WzBdLFxuICAgICAgQiA9IHZbMF0gKiB3WzJdIC0gdlsyXSAqIHdbMF0sXG4gICAgICBDID0gdlswXSAqIHdbM10gLSB2WzNdICogd1swXSxcbiAgICAgIEQgPSB2WzFdICogd1syXSAtIHZbMl0gKiB3WzFdLFxuICAgICAgRSA9IHZbMV0gKiB3WzNdIC0gdlszXSAqIHdbMV0sXG4gICAgICBGID0gdlsyXSAqIHdbM10gLSB2WzNdICogd1syXTtcbiAgdmFyIEcgPSB1WzBdO1xuICB2YXIgSCA9IHVbMV07XG4gIHZhciBJID0gdVsyXTtcbiAgdmFyIEogPSB1WzNdO1xuICBvdXRbMF0gPSBIICogRiAtIEkgKiBFICsgSiAqIEQ7XG4gIG91dFsxXSA9IC0oRyAqIEYpICsgSSAqIEMgLSBKICogQjtcbiAgb3V0WzJdID0gRyAqIEUgLSBIICogQyArIEogKiBBO1xuICBvdXRbM10gPSAtKEcgKiBEKSArIEggKiBCIC0gSSAqIEE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXTtcbiAgdmFyIGF5ID0gYVsxXTtcbiAgdmFyIGF6ID0gYVsyXTtcbiAgdmFyIGF3ID0gYVszXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgb3V0WzNdID0gYXcgKyB0ICogKGJbM10gLSBhdyk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wOyAvLyBNYXJzYWdsaWEsIEdlb3JnZS4gQ2hvb3NpbmcgYSBQb2ludCBmcm9tIHRoZSBTdXJmYWNlIG9mIGFcbiAgLy8gU3BoZXJlLiBBbm4uIE1hdGguIFN0YXRpc3QuIDQzICgxOTcyKSwgbm8uIDIsIDY0NS0tNjQ2LlxuICAvLyBodHRwOi8vcHJvamVjdGV1Y2xpZC5vcmcvZXVjbGlkLmFvbXMvMTE3NzY5MjY0NDtcblxuICB2YXIgdjEsIHYyLCB2MywgdjQ7XG4gIHZhciBzMSwgczI7XG5cbiAgZG8ge1xuICAgIHYxID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICB2MiA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgczEgPSB2MSAqIHYxICsgdjIgKiB2MjtcbiAgfSB3aGlsZSAoczEgPj0gMSk7XG5cbiAgZG8ge1xuICAgIHYzID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICB2NCA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgczIgPSB2MyAqIHYzICsgdjQgKiB2NDtcbiAgfSB3aGlsZSAoczIgPj0gMSk7XG5cbiAgdmFyIGQgPSBNYXRoLnNxcnQoKDEgLSBzMSkgLyBzMik7XG4gIG91dFswXSA9IHNjYWxlICogdjE7XG4gIG91dFsxXSA9IHNjYWxlICogdjI7XG4gIG91dFsyXSA9IHNjYWxlICogdjMgKiBkO1xuICBvdXRbM10gPSBzY2FsZSAqIHY0ICogZDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgbWF0NC5cbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdICogdztcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10gKiB3O1xuICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0gKiB3O1xuICBvdXRbM10gPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV0gKiB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWM0IHdpdGggYSBxdWF0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM107IC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG5cbiAgdmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuICB2YXIgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7XG4gIHZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcbiAgdmFyIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejsgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG4gIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gIG91dFsyXSA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzQgdG8gemVyb1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIG91dFszXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzQoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzQuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWM0cyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSA0O1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICB2ZWNbM10gPSBhW2kgKyAzXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgICAgYVtpICsgMl0gPSB2ZWNbMl07XG4gICAgICBhW2kgKyAzXSA9IHZlY1szXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbmltcG9ydCAqIGFzIG1hdDMgZnJvbSBcIi4vbWF0My5qc1wiO1xuaW1wb3J0ICogYXMgdmVjMyBmcm9tIFwiLi92ZWMzLmpzXCI7XG5pbXBvcnQgKiBhcyB2ZWM0IGZyb20gXCIuL3ZlYzQuanNcIjtcbi8qKlxuICogUXVhdGVybmlvblxuICogQG1vZHVsZSBxdWF0XG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IHF1YXRcbiAqXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCBhIHF1YXQgdG8gdGhlIGlkZW50aXR5IHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDA7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldHMgYSBxdWF0IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFuZCByb3RhdGlvbiBheGlzLFxuICogdGhlbiByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgYXJvdW5kIHdoaWNoIHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgaW4gcmFkaWFuc1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXhpc0FuZ2xlKG91dCwgYXhpcywgcmFkKSB7XG4gIHJhZCA9IHJhZCAqIDAuNTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICBvdXRbMF0gPSBzICogYXhpc1swXTtcbiAgb3V0WzFdID0gcyAqIGF4aXNbMV07XG4gIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICBvdXRbM10gPSBNYXRoLmNvcyhyYWQpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZXRzIHRoZSByb3RhdGlvbiBheGlzIGFuZCBhbmdsZSBmb3IgYSBnaXZlblxuICogIHF1YXRlcm5pb24uIElmIGEgcXVhdGVybmlvbiBpcyBjcmVhdGVkIHdpdGhcbiAqICBzZXRBeGlzQW5nbGUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzYW1lXG4gKiAgdmFsdWVzIGFzIHByb3ZpZGllZCBpbiB0aGUgb3JpZ2luYWwgcGFyYW1ldGVyIGxpc3RcbiAqICBPUiBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKiBFeGFtcGxlOiBUaGUgcXVhdGVybmlvbiBmb3JtZWQgYnkgYXhpcyBbMCwgMCwgMV0gYW5kXG4gKiAgYW5nbGUgLTkwIGlzIHRoZSBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIGZvcm1lZCBieVxuICogIFswLCAwLCAxXSBhbmQgMjcwLiBUaGlzIG1ldGhvZCBmYXZvcnMgdGhlIGxhdHRlci5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dF9heGlzICBWZWN0b3IgcmVjZWl2aW5nIHRoZSBheGlzIG9mIHJvdGF0aW9uXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXR9IHEgICAgIFF1YXRlcm5pb24gdG8gYmUgZGVjb21wb3NlZFxuICogQHJldHVybiB7TnVtYmVyfSAgICAgQW5nbGUsIGluIHJhZGlhbnMsIG9mIHRoZSByb3RhdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGlzQW5nbGUob3V0X2F4aXMsIHEpIHtcbiAgdmFyIHJhZCA9IE1hdGguYWNvcyhxWzNdKSAqIDIuMDtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQgLyAyLjApO1xuXG4gIGlmIChzID4gZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIG91dF9heGlzWzBdID0gcVswXSAvIHM7XG4gICAgb3V0X2F4aXNbMV0gPSBxWzFdIC8gcztcbiAgICBvdXRfYXhpc1syXSA9IHFbMl0gLyBzO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHMgaXMgemVybywgcmV0dXJuIGFueSBheGlzIChubyByb3RhdGlvbiAtIGF4aXMgZG9lcyBub3QgbWF0dGVyKVxuICAgIG91dF9heGlzWzBdID0gMTtcbiAgICBvdXRfYXhpc1sxXSA9IDA7XG4gICAgb3V0X2F4aXNbMl0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHJhZDtcbn1cbi8qKlxuICogR2V0cyB0aGUgYW5ndWxhciBkaXN0YW5jZSBiZXR3ZWVuIHR3byB1bml0IHF1YXRlcm5pb25zXG4gKlxuICogQHBhcmFtICB7UmVhZG9ubHlRdWF0fSBhICAgICBPcmlnaW4gdW5pdCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXR9IGIgICAgIERlc3RpbmF0aW9uIHVuaXQgcXVhdGVybmlvblxuICogQHJldHVybiB7TnVtYmVyfSAgICAgQW5nbGUsIGluIHJhZGlhbnMsIGJldHdlZW4gdGhlIHR3byBxdWF0ZXJuaW9uc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmdsZShhLCBiKSB7XG4gIHZhciBkb3Rwcm9kdWN0ID0gZG90KGEsIGIpO1xuICByZXR1cm4gTWF0aC5hY29zKDIgKiBkb3Rwcm9kdWN0ICogZG90cHJvZHVjdCAtIDEpO1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl0sXG4gICAgICBidyA9IGJbM107XG4gIG91dFswXSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYng7XG4gIG91dFszXSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBxdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBhbmdsZSBhYm91dCB0aGUgWCBheGlzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgcmFkKSB7XG4gIHJhZCAqPSAwLjU7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieCA9IE1hdGguc2luKHJhZCksXG4gICAgICBidyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGF4ICogYncgKyBhdyAqIGJ4O1xuICBvdXRbMV0gPSBheSAqIGJ3ICsgYXogKiBieDtcbiAgb3V0WzJdID0gYXogKiBidyAtIGF5ICogYng7XG4gIG91dFszXSA9IGF3ICogYncgLSBheCAqIGJ4O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFkgYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICByYWQgKj0gMC41O1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICB2YXIgYnkgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYncgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBheCAqIGJ3IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnk7XG4gIG91dFsyXSA9IGF6ICogYncgKyBheCAqIGJ5O1xuICBvdXRbM10gPSBhdyAqIGJ3IC0gYXkgKiBieTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBaIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgcmFkICo9IDAuNTtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ6ID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF5ICogYno7XG4gIG91dFsxXSA9IGF5ICogYncgLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheiAqIGJ3ICsgYXcgKiBiejtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIFcgY29tcG9uZW50IG9mIGEgcXVhdCBmcm9tIHRoZSBYLCBZLCBhbmQgWiBjb21wb25lbnRzLlxuICogQXNzdW1lcyB0aGF0IHF1YXRlcm5pb24gaXMgMSB1bml0IGluIGxlbmd0aC5cbiAqIEFueSBleGlzdGluZyBXIGNvbXBvbmVudCB3aWxsIGJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBXIGNvbXBvbmVudCBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVXKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSBNYXRoLnNxcnQoTWF0aC5hYnMoMS4wIC0geCAqIHggLSB5ICogeSAtIHogKiB6KSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2YgYSB1bml0IHF1YXRlcm5pb24uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIHZhciByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG4gIHZhciBldCA9IE1hdGguZXhwKHcpO1xuICB2YXIgcyA9IHIgPiAwID8gZXQgKiBNYXRoLnNpbihyKSAvIHIgOiAwO1xuICBvdXRbMF0gPSB4ICogcztcbiAgb3V0WzFdID0geSAqIHM7XG4gIG91dFsyXSA9IHogKiBzO1xuICBvdXRbM10gPSBldCAqIE1hdGguY29zKHIpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIGEgdW5pdCBxdWF0ZXJuaW9uLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgdGhlIGV4cG9uZW50aWFsIG9mXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxuKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIHZhciByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG4gIHZhciB0ID0gciA+IDAgPyBNYXRoLmF0YW4yKHIsIHcpIC8gciA6IDA7XG4gIG91dFswXSA9IHggKiB0O1xuICBvdXRbMV0gPSB5ICogdDtcbiAgb3V0WzJdID0geiAqIHQ7XG4gIG91dFszXSA9IDAuNSAqIE1hdGgubG9nKHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBzY2FsYXIgcG93ZXIgb2YgYSB1bml0IHF1YXRlcm5pb24uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgcXVhdGVybmlvbiBieVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwb3cob3V0LCBhLCBiKSB7XG4gIGxuKG91dCwgYSk7XG4gIHNjYWxlKG91dCwgb3V0LCBiKTtcbiAgZXhwKG91dCwgb3V0KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgLy8gYmVuY2htYXJrczpcbiAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi1zbGVycC1pbXBsZW1lbnRhdGlvbnNcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXSxcbiAgICAgIGJ3ID0gYlszXTtcbiAgdmFyIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxOyAvLyBjYWxjIGNvc2luZVxuXG4gIGNvc29tID0gYXggKiBieCArIGF5ICogYnkgKyBheiAqIGJ6ICsgYXcgKiBidzsgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG5cbiAgaWYgKGNvc29tIDwgMC4wKSB7XG4gICAgY29zb20gPSAtY29zb207XG4gICAgYnggPSAtYng7XG4gICAgYnkgPSAtYnk7XG4gICAgYnogPSAtYno7XG4gICAgYncgPSAtYnc7XG4gIH0gLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuXG5cbiAgaWYgKDEuMCAtIGNvc29tID4gZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIC8vIHN0YW5kYXJkIGNhc2UgKHNsZXJwKVxuICAgIG9tZWdhID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICBzaW5vbSA9IE1hdGguc2luKG9tZWdhKTtcbiAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICBzY2FsZTEgPSBNYXRoLnNpbih0ICogb21lZ2EpIC8gc2lub207XG4gIH0gZWxzZSB7XG4gICAgLy8gXCJmcm9tXCIgYW5kIFwidG9cIiBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZVxuICAgIC8vICAuLi4gc28gd2UgY2FuIGRvIGEgbGluZWFyIGludGVycG9sYXRpb25cbiAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgIHNjYWxlMSA9IHQ7XG4gIH0gLy8gY2FsY3VsYXRlIGZpbmFsIHZhbHVlc1xuXG5cbiAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgb3V0WzFdID0gc2NhbGUwICogYXkgKyBzY2FsZTEgKiBieTtcbiAgb3V0WzJdID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejtcbiAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHVuaXQgcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0KSB7XG4gIC8vIEltcGxlbWVudGF0aW9uIG9mIGh0dHA6Ly9wbGFubmluZy5jcy51aXVjLmVkdS9ub2RlMTk4Lmh0bWxcbiAgLy8gVE9ETzogQ2FsbGluZyByYW5kb20gMyB0aW1lcyBpcyBwcm9iYWJseSBub3QgdGhlIGZhc3Rlc3Qgc29sdXRpb25cbiAgdmFyIHUxID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gIHZhciB1MiA9IGdsTWF0cml4LlJBTkRPTSgpO1xuICB2YXIgdTMgPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgdmFyIHNxcnQxTWludXNVMSA9IE1hdGguc3FydCgxIC0gdTEpO1xuICB2YXIgc3FydFUxID0gTWF0aC5zcXJ0KHUxKTtcbiAgb3V0WzBdID0gc3FydDFNaW51c1UxICogTWF0aC5zaW4oMi4wICogTWF0aC5QSSAqIHUyKTtcbiAgb3V0WzFdID0gc3FydDFNaW51c1UxICogTWF0aC5jb3MoMi4wICogTWF0aC5QSSAqIHUyKTtcbiAgb3V0WzJdID0gc3FydFUxICogTWF0aC5zaW4oMi4wICogTWF0aC5QSSAqIHUzKTtcbiAgb3V0WzNdID0gc3FydFUxICogTWF0aC5jb3MoMi4wICogTWF0aC5QSSAqIHUzKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW52ZXJzZSBvZiBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGludmVyc2Ugb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgZG90ID0gYTAgKiBhMCArIGExICogYTEgKyBhMiAqIGEyICsgYTMgKiBhMztcbiAgdmFyIGludkRvdCA9IGRvdCA/IDEuMCAvIGRvdCA6IDA7IC8vIFRPRE86IFdvdWxkIGJlIGZhc3RlciB0byByZXR1cm4gWzAsMCwwLDBdIGltbWVkaWF0ZWx5IGlmIGRvdCA9PSAwXG5cbiAgb3V0WzBdID0gLWEwICogaW52RG90O1xuICBvdXRbMV0gPSAtYTEgKiBpbnZEb3Q7XG4gIG91dFsyXSA9IC1hMiAqIGludkRvdDtcbiAgb3V0WzNdID0gYTMgKiBpbnZEb3Q7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNvbmp1Z2F0ZSBvZiBhIHF1YXRcbiAqIElmIHRoZSBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQsIHRoaXMgZnVuY3Rpb24gaXMgZmFzdGVyIHRoYW4gcXVhdC5pbnZlcnNlIGFuZCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29uanVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiAzeDMgcm90YXRpb24gbWF0cml4LlxuICpcbiAqIE5PVEU6IFRoZSByZXN1bHRhbnQgcXVhdGVybmlvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28geW91IHNob3VsZCBiZSBzdXJlXG4gKiB0byByZW5vcm1hbGl6ZSB0aGUgcXVhdGVybmlvbiB5b3Vyc2VsZiB3aGVyZSBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSByb3RhdGlvbiBtYXRyaXhcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0MyhvdXQsIG0pIHtcbiAgLy8gQWxnb3JpdGhtIGluIEtlbiBTaG9lbWFrZSdzIGFydGljbGUgaW4gMTk4NyBTSUdHUkFQSCBjb3Vyc2Ugbm90ZXNcbiAgLy8gYXJ0aWNsZSBcIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uXCIuXG4gIHZhciBmVHJhY2UgPSBtWzBdICsgbVs0XSArIG1bOF07XG4gIHZhciBmUm9vdDtcblxuICBpZiAoZlRyYWNlID4gMC4wKSB7XG4gICAgLy8gfHd8ID4gMS8yLCBtYXkgYXMgd2VsbCBjaG9vc2UgdyA+IDEvMlxuICAgIGZSb290ID0gTWF0aC5zcXJ0KGZUcmFjZSArIDEuMCk7IC8vIDJ3XG5cbiAgICBvdXRbM10gPSAwLjUgKiBmUm9vdDtcbiAgICBmUm9vdCA9IDAuNSAvIGZSb290OyAvLyAxLyg0dylcblxuICAgIG91dFswXSA9IChtWzVdIC0gbVs3XSkgKiBmUm9vdDtcbiAgICBvdXRbMV0gPSAobVs2XSAtIG1bMl0pICogZlJvb3Q7XG4gICAgb3V0WzJdID0gKG1bMV0gLSBtWzNdKSAqIGZSb290O1xuICB9IGVsc2Uge1xuICAgIC8vIHx3fCA8PSAxLzJcbiAgICB2YXIgaSA9IDA7XG4gICAgaWYgKG1bNF0gPiBtWzBdKSBpID0gMTtcbiAgICBpZiAobVs4XSA+IG1baSAqIDMgKyBpXSkgaSA9IDI7XG4gICAgdmFyIGogPSAoaSArIDEpICUgMztcbiAgICB2YXIgayA9IChpICsgMikgJSAzO1xuICAgIGZSb290ID0gTWF0aC5zcXJ0KG1baSAqIDMgKyBpXSAtIG1baiAqIDMgKyBqXSAtIG1bayAqIDMgKyBrXSArIDEuMCk7XG4gICAgb3V0W2ldID0gMC41ICogZlJvb3Q7XG4gICAgZlJvb3QgPSAwLjUgLyBmUm9vdDtcbiAgICBvdXRbM10gPSAobVtqICogMyArIGtdIC0gbVtrICogMyArIGpdKSAqIGZSb290O1xuICAgIG91dFtqXSA9IChtW2ogKiAzICsgaV0gKyBtW2kgKiAzICsgal0pICogZlJvb3Q7XG4gICAgb3V0W2tdID0gKG1bayAqIDMgKyBpXSArIG1baSAqIDMgKyBrXSkgKiBmUm9vdDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIGV1bGVyIGFuZ2xlIHgsIHksIHouXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3h9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWCBheGlzIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge3l9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWSBheGlzIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge3p9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWiBheGlzIGluIGRlZ3JlZXMuXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUV1bGVyKG91dCwgeCwgeSwgeikge1xuICB2YXIgaGFsZlRvUmFkID0gMC41ICogTWF0aC5QSSAvIDE4MC4wO1xuICB4ICo9IGhhbGZUb1JhZDtcbiAgeSAqPSBoYWxmVG9SYWQ7XG4gIHogKj0gaGFsZlRvUmFkO1xuICB2YXIgc3ggPSBNYXRoLnNpbih4KTtcbiAgdmFyIGN4ID0gTWF0aC5jb3MoeCk7XG4gIHZhciBzeSA9IE1hdGguc2luKHkpO1xuICB2YXIgY3kgPSBNYXRoLmNvcyh5KTtcbiAgdmFyIHN6ID0gTWF0aC5zaW4oeik7XG4gIHZhciBjeiA9IE1hdGguY29zKHopO1xuICBvdXRbMF0gPSBzeCAqIGN5ICogY3ogLSBjeCAqIHN5ICogc3o7XG4gIG91dFsxXSA9IGN4ICogc3kgKiBjeiArIHN4ICogY3kgKiBzejtcbiAgb3V0WzJdID0gY3ggKiBjeSAqIHN6IC0gc3ggKiBzeSAqIGN6O1xuICBvdXRbM10gPSBjeCAqIGN5ICogY3ogKyBzeCAqIHN5ICogc3o7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBxdWF0ZW5pb25cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJxdWF0KFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiKVwiO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdGVybmlvbiB0byBjbG9uZVxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgY2xvbmUgPSB2ZWM0LmNsb25lO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGZyb21WYWx1ZXMgPSB2ZWM0LmZyb21WYWx1ZXM7XG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBxdWF0IHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBzb3VyY2UgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBjb3B5ID0gdmVjNC5jb3B5O1xuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBxdWF0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNldCA9IHZlYzQuc2V0O1xuLyoqXG4gKiBBZGRzIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgYWRkID0gdmVjNC5hZGQ7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIFNjYWxlcyBhIHF1YXQgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNjYWxlID0gdmVjNC5zY2FsZTtcbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZG90ID0gdmVjNC5kb3Q7XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGxlcnAgPSB2ZWM0LmxlcnA7XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgdmFyIGxlbmd0aCA9IHZlYzQubGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3F1YXJlZExlbmd0aCA9IHZlYzQuc3F1YXJlZExlbmd0aDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0LnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcbiAqIE5vcm1hbGl6ZSBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXRlcm5pb24gdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG5vcm1hbGl6ZSA9IHZlYzQubm9ybWFsaXplO1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBxdWF0ZXJuaW9ucyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgVGhlIGZpcnN0IHF1YXRlcm5pb24uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiBUaGUgc2Vjb25kIHF1YXRlcm5pb24uXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgdmFyIGV4YWN0RXF1YWxzID0gdmVjNC5leGFjdEVxdWFscztcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcXVhdGVybmlvbnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCB2YXIgZXF1YWxzID0gdmVjNC5lcXVhbHM7XG4vKipcbiAqIFNldHMgYSBxdWF0ZXJuaW9uIHRvIHJlcHJlc2VudCB0aGUgc2hvcnRlc3Qgcm90YXRpb24gZnJvbSBvbmVcbiAqIHZlY3RvciB0byBhbm90aGVyLlxuICpcbiAqIEJvdGggdmVjdG9ycyBhcmUgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb24uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgaW5pdGlhbCB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgdmFyIHJvdGF0aW9uVG8gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0bXB2ZWMzID0gdmVjMy5jcmVhdGUoKTtcbiAgdmFyIHhVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygxLCAwLCAwKTtcbiAgdmFyIHlVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgZG90ID0gdmVjMy5kb3QoYSwgYik7XG5cbiAgICBpZiAoZG90IDwgLTAuOTk5OTk5KSB7XG4gICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIHhVbml0VmVjMywgYSk7XG4gICAgICBpZiAodmVjMy5sZW4odG1wdmVjMykgPCAwLjAwMDAwMSkgdmVjMy5jcm9zcyh0bXB2ZWMzLCB5VW5pdFZlYzMsIGEpO1xuICAgICAgdmVjMy5ub3JtYWxpemUodG1wdmVjMywgdG1wdmVjMyk7XG4gICAgICBzZXRBeGlzQW5nbGUob3V0LCB0bXB2ZWMzLCBNYXRoLlBJKTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSBlbHNlIGlmIChkb3QgPiAwLjk5OTk5OSkge1xuICAgICAgb3V0WzBdID0gMDtcbiAgICAgIG91dFsxXSA9IDA7XG4gICAgICBvdXRbMl0gPSAwO1xuICAgICAgb3V0WzNdID0gMTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZlYzMuY3Jvc3ModG1wdmVjMywgYSwgYik7XG4gICAgICBvdXRbMF0gPSB0bXB2ZWMzWzBdO1xuICAgICAgb3V0WzFdID0gdG1wdmVjM1sxXTtcbiAgICAgIG91dFsyXSA9IHRtcHZlYzNbMl07XG4gICAgICBvdXRbM10gPSAxICsgZG90O1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgfVxuICB9O1xufSgpO1xuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCB2YXIgc3FsZXJwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGVtcDEgPSBjcmVhdGUoKTtcbiAgdmFyIHRlbXAyID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gICAgc2xlcnAodGVtcDEsIGEsIGQsIHQpO1xuICAgIHNsZXJwKHRlbXAyLCBiLCBjLCB0KTtcbiAgICBzbGVycChvdXQsIHRlbXAxLCB0ZW1wMiwgMiAqIHQgKiAoMSAtIHQpKTtcbiAgICByZXR1cm4gb3V0O1xuICB9O1xufSgpO1xuLyoqXG4gKiBTZXRzIHRoZSBzcGVjaWZpZWQgcXVhdGVybmlvbiB3aXRoIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlblxuICogYXhlcy4gRWFjaCBheGlzIGlzIGEgdmVjMyBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgdW5pdCBsZW5ndGggYW5kXG4gKiBwZXJwZW5kaWN1bGFyIHRvIGFsbCBvdGhlciBzcGVjaWZpZWQgYXhlcy5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdmlldyAgdGhlIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHZpZXdpbmcgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcmlnaHQgdGhlIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGxvY2FsIFwicmlnaHRcIiBkaXJlY3Rpb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB1cCAgICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJ1cFwiIGRpcmVjdGlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCB2YXIgc2V0QXhlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG1hdHIgPSBtYXQzLmNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgbWF0clswXSA9IHJpZ2h0WzBdO1xuICAgIG1hdHJbM10gPSByaWdodFsxXTtcbiAgICBtYXRyWzZdID0gcmlnaHRbMl07XG4gICAgbWF0clsxXSA9IHVwWzBdO1xuICAgIG1hdHJbNF0gPSB1cFsxXTtcbiAgICBtYXRyWzddID0gdXBbMl07XG4gICAgbWF0clsyXSA9IC12aWV3WzBdO1xuICAgIG1hdHJbNV0gPSAtdmlld1sxXTtcbiAgICBtYXRyWzhdID0gLXZpZXdbMl07XG4gICAgcmV0dXJuIG5vcm1hbGl6ZShvdXQsIGZyb21NYXQzKG91dCwgbWF0cikpO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuaW1wb3J0ICogYXMgcXVhdCBmcm9tIFwiLi9xdWF0LmpzXCI7XG5pbXBvcnQgKiBhcyBtYXQ0IGZyb20gXCIuL21hdDQuanNcIjtcbi8qKlxuICogRHVhbCBRdWF0ZXJuaW9uPGJyPlxuICogRm9ybWF0OiBbcmVhbCwgZHVhbF08YnI+XG4gKiBRdWF0ZXJuaW9uIGZvcm1hdDogWFlaVzxicj5cbiAqIE1ha2Ugc3VyZSB0byBoYXZlIG5vcm1hbGl6ZWQgZHVhbCBxdWF0ZXJuaW9ucywgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbnMgbWF5IG5vdCB3b3JrIGFzIGludGVuZGVkLjxicj5cbiAqIEBtb2R1bGUgcXVhdDJcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgZHVhbCBxdWF0XG4gKlxuICogQHJldHVybnMge3F1YXQyfSBhIG5ldyBkdWFsIHF1YXRlcm5pb24gW3JlYWwgLT4gcm90YXRpb24sIGR1YWwgLT4gdHJhbnNsYXRpb25dXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgZHFbMF0gPSAwO1xuICAgIGRxWzFdID0gMDtcbiAgICBkcVsyXSA9IDA7XG4gICAgZHFbNF0gPSAwO1xuICAgIGRxWzVdID0gMDtcbiAgICBkcVs2XSA9IDA7XG4gICAgZHFbN10gPSAwO1xuICB9XG5cbiAgZHFbM10gPSAxO1xuICByZXR1cm4gZHE7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0ZXJuaW9uIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG5ldyBkdWFsIHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBkcSA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDgpO1xuICBkcVswXSA9IGFbMF07XG4gIGRxWzFdID0gYVsxXTtcbiAgZHFbMl0gPSBhWzJdO1xuICBkcVszXSA9IGFbM107XG4gIGRxWzRdID0gYVs0XTtcbiAgZHFbNV0gPSBhWzVdO1xuICBkcVs2XSA9IGFbNl07XG4gIGRxWzddID0gYVs3XTtcbiAgcmV0dXJuIGRxO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGR1YWwgcXVhdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geDEgWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdzEgVyBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MiBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkyIFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gejIgWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MiBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3F1YXQyfSBuZXcgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4MSwgeTEsIHoxLCB3MSwgeDIsIHkyLCB6MiwgdzIpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG4gIGRxWzBdID0geDE7XG4gIGRxWzFdID0geTE7XG4gIGRxWzJdID0gejE7XG4gIGRxWzNdID0gdzE7XG4gIGRxWzRdID0geDI7XG4gIGRxWzVdID0geTI7XG4gIGRxWzZdID0gejI7XG4gIGRxWzddID0gdzI7XG4gIHJldHVybiBkcTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgZnJvbSB0aGUgZ2l2ZW4gdmFsdWVzIChxdWF0IGFuZCB0cmFuc2xhdGlvbilcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geDEgWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdzEgVyBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MiBYIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXG4gKiBAcGFyYW0ge051bWJlcn0geTIgWSBjb21wb25lbnQgKHRyYW5zbGF0aW9uKVxuICogQHBhcmFtIHtOdW1iZXJ9IHoyIFogY29tcG9uZW50ICh0cmFuc2xhdGlvbilcbiAqIEByZXR1cm5zIHtxdWF0Mn0gbmV3IGR1YWwgcXVhdGVybmlvblxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uVmFsdWVzKHgxLCB5MSwgejEsIHcxLCB4MiwgeTIsIHoyKSB7XG4gIHZhciBkcSA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDgpO1xuICBkcVswXSA9IHgxO1xuICBkcVsxXSA9IHkxO1xuICBkcVsyXSA9IHoxO1xuICBkcVszXSA9IHcxO1xuICB2YXIgYXggPSB4MiAqIDAuNSxcbiAgICAgIGF5ID0geTIgKiAwLjUsXG4gICAgICBheiA9IHoyICogMC41O1xuICBkcVs0XSA9IGF4ICogdzEgKyBheSAqIHoxIC0gYXogKiB5MTtcbiAgZHFbNV0gPSBheSAqIHcxICsgYXogKiB4MSAtIGF4ICogejE7XG4gIGRxWzZdID0gYXogKiB3MSArIGF4ICogeTEgLSBheSAqIHgxO1xuICBkcVs3XSA9IC1heCAqIHgxIC0gYXkgKiB5MSAtIGF6ICogejE7XG4gIHJldHVybiBkcTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIGR1YWwgcXVhdCBmcm9tIGEgcXVhdGVybmlvbiBhbmQgYSB0cmFuc2xhdGlvblxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBhIG5vcm1hbGl6ZWQgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHQgdHJhbmxhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBxLCB0KSB7XG4gIHZhciBheCA9IHRbMF0gKiAwLjUsXG4gICAgICBheSA9IHRbMV0gKiAwLjUsXG4gICAgICBheiA9IHRbMl0gKiAwLjUsXG4gICAgICBieCA9IHFbMF0sXG4gICAgICBieSA9IHFbMV0sXG4gICAgICBieiA9IHFbMl0sXG4gICAgICBidyA9IHFbM107XG4gIG91dFswXSA9IGJ4O1xuICBvdXRbMV0gPSBieTtcbiAgb3V0WzJdID0gYno7XG4gIG91dFszXSA9IGJ3O1xuICBvdXRbNF0gPSBheCAqIGJ3ICsgYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFs1XSA9IGF5ICogYncgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzZdID0gYXogKiBidyArIGF4ICogYnkgLSBheSAqIGJ4O1xuICBvdXRbN10gPSAtYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgZHVhbCBxdWF0IGZyb20gYSB0cmFuc2xhdGlvblxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdCB0cmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uKG91dCwgdCkge1xuICBvdXRbMF0gPSAwO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICBvdXRbNF0gPSB0WzBdICogMC41O1xuICBvdXRbNV0gPSB0WzFdICogMC41O1xuICBvdXRbNl0gPSB0WzJdICogMC41O1xuICBvdXRbN10gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgZHVhbCBxdWF0IGZyb20gYSBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHRoZSBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHEpIHtcbiAgb3V0WzBdID0gcVswXTtcbiAgb3V0WzFdID0gcVsxXTtcbiAgb3V0WzJdID0gcVsyXTtcbiAgb3V0WzNdID0gcVszXTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgZnJvbSBhIG1hdHJpeCAoNHg0KVxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQ0KG91dCwgYSkge1xuICAvL1RPRE8gT3B0aW1pemUgdGhpc1xuICB2YXIgb3V0ZXIgPSBxdWF0LmNyZWF0ZSgpO1xuICBtYXQ0LmdldFJvdGF0aW9uKG91dGVyLCBhKTtcbiAgdmFyIHQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgbWF0NC5nZXRUcmFuc2xhdGlvbih0LCBhKTtcbiAgZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBvdXRlciwgdCk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBkdWFsIHF1YXQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBzb3VyY2UgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCBhIGR1YWwgcXVhdCB0byB0aGUgaWRlbnRpdHkgZHVhbCBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDA7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIGR1YWwgcXVhdCB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHgxIFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geTEgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MSBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcxIFcgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geDIgWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MiBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHoyIFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdzIgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeDEsIHkxLCB6MSwgdzEsIHgyLCB5MiwgejIsIHcyKSB7XG4gIG91dFswXSA9IHgxO1xuICBvdXRbMV0gPSB5MTtcbiAgb3V0WzJdID0gejE7XG4gIG91dFszXSA9IHcxO1xuICBvdXRbNF0gPSB4MjtcbiAgb3V0WzVdID0geTI7XG4gIG91dFs2XSA9IHoyO1xuICBvdXRbN10gPSB3MjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2V0cyB0aGUgcmVhbCBwYXJ0IG9mIGEgZHVhbCBxdWF0XG4gKiBAcGFyYW0gIHtxdWF0fSBvdXQgcmVhbCBwYXJ0XG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXQyfSBhIER1YWwgUXVhdGVybmlvblxuICogQHJldHVybiB7cXVhdH0gcmVhbCBwYXJ0XG4gKi9cblxuZXhwb3J0IHZhciBnZXRSZWFsID0gcXVhdC5jb3B5O1xuLyoqXG4gKiBHZXRzIHRoZSBkdWFsIHBhcnQgb2YgYSBkdWFsIHF1YXRcbiAqIEBwYXJhbSAge3F1YXR9IG91dCBkdWFsIHBhcnRcbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uXG4gKiBAcmV0dXJuIHtxdWF0fSBkdWFsIHBhcnRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHVhbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVs0XTtcbiAgb3V0WzFdID0gYVs1XTtcbiAgb3V0WzJdID0gYVs2XTtcbiAgb3V0WzNdID0gYVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSByZWFsIGNvbXBvbmVudCBvZiBhIGR1YWwgcXVhdCB0byB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJlYWwgcGFydFxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc2V0UmVhbCA9IHF1YXQuY29weTtcbi8qKlxuICogU2V0IHRoZSBkdWFsIGNvbXBvbmVudCBvZiBhIGR1YWwgcXVhdCB0byB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIGR1YWwgcGFydFxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREdWFsKG91dCwgcSkge1xuICBvdXRbNF0gPSBxWzBdO1xuICBvdXRbNV0gPSBxWzFdO1xuICBvdXRbNl0gPSBxWzJdO1xuICBvdXRbN10gPSBxWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZXRzIHRoZSB0cmFuc2xhdGlvbiBvZiBhIG5vcm1hbGl6ZWQgZHVhbCBxdWF0XG4gKiBAcGFyYW0gIHt2ZWMzfSBvdXQgdHJhbnNsYXRpb25cbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uIHRvIGJlIGRlY29tcG9zZWRcbiAqIEByZXR1cm4ge3ZlYzN9IHRyYW5zbGF0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKG91dCwgYSkge1xuICB2YXIgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddLFxuICAgICAgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdO1xuICBvdXRbMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyO1xuICBvdXRbMV0gPSAoYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieikgKiAyO1xuICBvdXRbMl0gPSAoYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCkgKiAyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2xhdGVzIGEgZHVhbCBxdWF0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYXgxID0gYVswXSxcbiAgICAgIGF5MSA9IGFbMV0sXG4gICAgICBhejEgPSBhWzJdLFxuICAgICAgYXcxID0gYVszXSxcbiAgICAgIGJ4MSA9IHZbMF0gKiAwLjUsXG4gICAgICBieTEgPSB2WzFdICogMC41LFxuICAgICAgYnoxID0gdlsyXSAqIDAuNSxcbiAgICAgIGF4MiA9IGFbNF0sXG4gICAgICBheTIgPSBhWzVdLFxuICAgICAgYXoyID0gYVs2XSxcbiAgICAgIGF3MiA9IGFbN107XG4gIG91dFswXSA9IGF4MTtcbiAgb3V0WzFdID0gYXkxO1xuICBvdXRbMl0gPSBhejE7XG4gIG91dFszXSA9IGF3MTtcbiAgb3V0WzRdID0gYXcxICogYngxICsgYXkxICogYnoxIC0gYXoxICogYnkxICsgYXgyO1xuICBvdXRbNV0gPSBhdzEgKiBieTEgKyBhejEgKiBieDEgLSBheDEgKiBiejEgKyBheTI7XG4gIG91dFs2XSA9IGF3MSAqIGJ6MSArIGF4MSAqIGJ5MSAtIGF5MSAqIGJ4MSArIGF6MjtcbiAgb3V0WzddID0gLWF4MSAqIGJ4MSAtIGF5MSAqIGJ5MSAtIGF6MSAqIGJ6MSArIGF3MjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBhcm91bmQgdGhlIFggYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGhvdyBmYXIgc2hvdWxkIHRoZSByb3RhdGlvbiBiZVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIHJhZCkge1xuICB2YXIgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdLFxuICAgICAgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddLFxuICAgICAgYXgxID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSxcbiAgICAgIGF5MSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnosXG4gICAgICBhejEgPSBheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4LFxuICAgICAgYXcxID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcXVhdC5yb3RhdGVYKG91dCwgYSwgcmFkKTtcbiAgYnggPSBvdXRbMF07XG4gIGJ5ID0gb3V0WzFdO1xuICBieiA9IG91dFsyXTtcbiAgYncgPSBvdXRbM107XG4gIG91dFs0XSA9IGF4MSAqIGJ3ICsgYXcxICogYnggKyBheTEgKiBieiAtIGF6MSAqIGJ5O1xuICBvdXRbNV0gPSBheTEgKiBidyArIGF3MSAqIGJ5ICsgYXoxICogYnggLSBheDEgKiBiejtcbiAgb3V0WzZdID0gYXoxICogYncgKyBhdzEgKiBieiArIGF4MSAqIGJ5IC0gYXkxICogYng7XG4gIG91dFs3XSA9IGF3MSAqIGJ3IC0gYXgxICogYnggLSBheTEgKiBieSAtIGF6MSAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGFyb3VuZCB0aGUgWSBheGlzXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgaG93IGZhciBzaG91bGQgdGhlIHJvdGF0aW9uIGJlXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgcmFkKSB7XG4gIHZhciBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM10sXG4gICAgICBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN10sXG4gICAgICBheDEgPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5LFxuICAgICAgYXkxID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieixcbiAgICAgIGF6MSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngsXG4gICAgICBhdzEgPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICBxdWF0LnJvdGF0ZVkob3V0LCBhLCByYWQpO1xuICBieCA9IG91dFswXTtcbiAgYnkgPSBvdXRbMV07XG4gIGJ6ID0gb3V0WzJdO1xuICBidyA9IG91dFszXTtcbiAgb3V0WzRdID0gYXgxICogYncgKyBhdzEgKiBieCArIGF5MSAqIGJ6IC0gYXoxICogYnk7XG4gIG91dFs1XSA9IGF5MSAqIGJ3ICsgYXcxICogYnkgKyBhejEgKiBieCAtIGF4MSAqIGJ6O1xuICBvdXRbNl0gPSBhejEgKiBidyArIGF3MSAqIGJ6ICsgYXgxICogYnkgLSBheTEgKiBieDtcbiAgb3V0WzddID0gYXcxICogYncgLSBheDEgKiBieCAtIGF5MSAqIGJ5IC0gYXoxICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYXJvdW5kIHRoZSBaIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBob3cgZmFyIHNob3VsZCB0aGUgcm90YXRpb24gYmVcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XSxcbiAgICAgIGF4MSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnksXG4gICAgICBheTEgPSBheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6LFxuICAgICAgYXoxID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCxcbiAgICAgIGF3MSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHF1YXQucm90YXRlWihvdXQsIGEsIHJhZCk7XG4gIGJ4ID0gb3V0WzBdO1xuICBieSA9IG91dFsxXTtcbiAgYnogPSBvdXRbMl07XG4gIGJ3ID0gb3V0WzNdO1xuICBvdXRbNF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzVdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFs2XSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbN10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBieSBhIGdpdmVuIHF1YXRlcm5pb24gKGEgKiBxKVxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHJvdGF0ZSBieVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlQnlRdWF0QXBwZW5kKG91dCwgYSwgcSkge1xuICB2YXIgcXggPSBxWzBdLFxuICAgICAgcXkgPSBxWzFdLFxuICAgICAgcXogPSBxWzJdLFxuICAgICAgcXcgPSBxWzNdLFxuICAgICAgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICBvdXRbMF0gPSBheCAqIHF3ICsgYXcgKiBxeCArIGF5ICogcXogLSBheiAqIHF5O1xuICBvdXRbMV0gPSBheSAqIHF3ICsgYXcgKiBxeSArIGF6ICogcXggLSBheCAqIHF6O1xuICBvdXRbMl0gPSBheiAqIHF3ICsgYXcgKiBxeiArIGF4ICogcXkgLSBheSAqIHF4O1xuICBvdXRbM10gPSBhdyAqIHF3IC0gYXggKiBxeCAtIGF5ICogcXkgLSBheiAqIHF6O1xuICBheCA9IGFbNF07XG4gIGF5ID0gYVs1XTtcbiAgYXogPSBhWzZdO1xuICBhdyA9IGFbN107XG4gIG91dFs0XSA9IGF4ICogcXcgKyBhdyAqIHF4ICsgYXkgKiBxeiAtIGF6ICogcXk7XG4gIG91dFs1XSA9IGF5ICogcXcgKyBhdyAqIHF5ICsgYXogKiBxeCAtIGF4ICogcXo7XG4gIG91dFs2XSA9IGF6ICogcXcgKyBhdyAqIHF6ICsgYXggKiBxeSAtIGF5ICogcXg7XG4gIG91dFs3XSA9IGF3ICogcXcgLSBheCAqIHF4IC0gYXkgKiBxeSAtIGF6ICogcXo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYnkgYSBnaXZlbiBxdWF0ZXJuaW9uIChxICogYSlcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHF1YXRlcm5pb24gdG8gcm90YXRlIGJ5XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZUJ5UXVhdFByZXBlbmQob3V0LCBxLCBhKSB7XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM10sXG4gICAgICBieCA9IGFbMF0sXG4gICAgICBieSA9IGFbMV0sXG4gICAgICBieiA9IGFbMl0sXG4gICAgICBidyA9IGFbM107XG4gIG91dFswXSA9IHF4ICogYncgKyBxdyAqIGJ4ICsgcXkgKiBieiAtIHF6ICogYnk7XG4gIG91dFsxXSA9IHF5ICogYncgKyBxdyAqIGJ5ICsgcXogKiBieCAtIHF4ICogYno7XG4gIG91dFsyXSA9IHF6ICogYncgKyBxdyAqIGJ6ICsgcXggKiBieSAtIHF5ICogYng7XG4gIG91dFszXSA9IHF3ICogYncgLSBxeCAqIGJ4IC0gcXkgKiBieSAtIHF6ICogYno7XG4gIGJ4ID0gYVs0XTtcbiAgYnkgPSBhWzVdO1xuICBieiA9IGFbNl07XG4gIGJ3ID0gYVs3XTtcbiAgb3V0WzRdID0gcXggKiBidyArIHF3ICogYnggKyBxeSAqIGJ6IC0gcXogKiBieTtcbiAgb3V0WzVdID0gcXkgKiBidyArIHF3ICogYnkgKyBxeiAqIGJ4IC0gcXggKiBiejtcbiAgb3V0WzZdID0gcXogKiBidyArIHF3ICogYnogKyBxeCAqIGJ5IC0gcXkgKiBieDtcbiAgb3V0WzddID0gcXcgKiBidyAtIHF4ICogYnggLSBxeSAqIGJ5IC0gcXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBhcm91bmQgYSBnaXZlbiBheGlzLiBEb2VzIHRoZSBub3JtYWxpc2F0aW9uIGF1dG9tYXRpY2FsbHlcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBob3cgZmFyIHRoZSByb3RhdGlvbiBzaG91bGQgYmVcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZUFyb3VuZEF4aXMob3V0LCBhLCBheGlzLCByYWQpIHtcbiAgLy9TcGVjaWFsIGNhc2UgZm9yIHJhZCA9IDBcbiAgaWYgKE1hdGguYWJzKHJhZCkgPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIGNvcHkob3V0LCBhKTtcbiAgfVxuXG4gIHZhciBheGlzTGVuZ3RoID0gTWF0aC5oeXBvdChheGlzWzBdLCBheGlzWzFdLCBheGlzWzJdKTtcbiAgcmFkID0gcmFkICogMC41O1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBieCA9IHMgKiBheGlzWzBdIC8gYXhpc0xlbmd0aDtcbiAgdmFyIGJ5ID0gcyAqIGF4aXNbMV0gLyBheGlzTGVuZ3RoO1xuICB2YXIgYnogPSBzICogYXhpc1syXSAvIGF4aXNMZW5ndGg7XG4gIHZhciBidyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBheDEgPSBhWzBdLFxuICAgICAgYXkxID0gYVsxXSxcbiAgICAgIGF6MSA9IGFbMl0sXG4gICAgICBhdzEgPSBhWzNdO1xuICBvdXRbMF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzFdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFsyXSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbM10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgdmFyIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgb3V0WzRdID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzVdID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzZdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgb3V0WzddID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gZHVhbCBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gZHVhbCBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBheDAgPSBhWzBdLFxuICAgICAgYXkwID0gYVsxXSxcbiAgICAgIGF6MCA9IGFbMl0sXG4gICAgICBhdzAgPSBhWzNdLFxuICAgICAgYngxID0gYls0XSxcbiAgICAgIGJ5MSA9IGJbNV0sXG4gICAgICBiejEgPSBiWzZdLFxuICAgICAgYncxID0gYls3XSxcbiAgICAgIGF4MSA9IGFbNF0sXG4gICAgICBheTEgPSBhWzVdLFxuICAgICAgYXoxID0gYVs2XSxcbiAgICAgIGF3MSA9IGFbN10sXG4gICAgICBieDAgPSBiWzBdLFxuICAgICAgYnkwID0gYlsxXSxcbiAgICAgIGJ6MCA9IGJbMl0sXG4gICAgICBidzAgPSBiWzNdO1xuICBvdXRbMF0gPSBheDAgKiBidzAgKyBhdzAgKiBieDAgKyBheTAgKiBiejAgLSBhejAgKiBieTA7XG4gIG91dFsxXSA9IGF5MCAqIGJ3MCArIGF3MCAqIGJ5MCArIGF6MCAqIGJ4MCAtIGF4MCAqIGJ6MDtcbiAgb3V0WzJdID0gYXowICogYncwICsgYXcwICogYnowICsgYXgwICogYnkwIC0gYXkwICogYngwO1xuICBvdXRbM10gPSBhdzAgKiBidzAgLSBheDAgKiBieDAgLSBheTAgKiBieTAgLSBhejAgKiBiejA7XG4gIG91dFs0XSA9IGF4MCAqIGJ3MSArIGF3MCAqIGJ4MSArIGF5MCAqIGJ6MSAtIGF6MCAqIGJ5MSArIGF4MSAqIGJ3MCArIGF3MSAqIGJ4MCArIGF5MSAqIGJ6MCAtIGF6MSAqIGJ5MDtcbiAgb3V0WzVdID0gYXkwICogYncxICsgYXcwICogYnkxICsgYXowICogYngxIC0gYXgwICogYnoxICsgYXkxICogYncwICsgYXcxICogYnkwICsgYXoxICogYngwIC0gYXgxICogYnowO1xuICBvdXRbNl0gPSBhejAgKiBidzEgKyBhdzAgKiBiejEgKyBheDAgKiBieTEgLSBheTAgKiBieDEgKyBhejEgKiBidzAgKyBhdzEgKiBiejAgKyBheDEgKiBieTAgLSBheTEgKiBieDA7XG4gIG91dFs3XSA9IGF3MCAqIGJ3MSAtIGF4MCAqIGJ4MSAtIGF5MCAqIGJ5MSAtIGF6MCAqIGJ6MSArIGF3MSAqIGJ3MCAtIGF4MSAqIGJ4MCAtIGF5MSAqIGJ5MCAtIGF6MSAqIGJ6MDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Mi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIFNjYWxlcyBhIGR1YWwgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0IHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIGR1YWwgcXVhdCBieVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gZHVhbCBxdWF0J3MgKFRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgcmVhbCBwYXJ0cylcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZG90ID0gcXVhdC5kb3Q7XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gZHVhbCBxdWF0cydzXG4gKiBOT1RFOiBUaGUgcmVzdWx0aW5nIGR1YWwgcXVhdGVybmlvbnMgd29uJ3QgYWx3YXlzIGJlIG5vcm1hbGl6ZWQgKFRoZSBlcnJvciBpcyBtb3N0IG5vdGljZWFibGUgd2hlbiB0ID0gMC41KVxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgbXQgPSAxIC0gdDtcbiAgaWYgKGRvdChhLCBiKSA8IDApIHQgPSAtdDtcbiAgb3V0WzBdID0gYVswXSAqIG10ICsgYlswXSAqIHQ7XG4gIG91dFsxXSA9IGFbMV0gKiBtdCArIGJbMV0gKiB0O1xuICBvdXRbMl0gPSBhWzJdICogbXQgKyBiWzJdICogdDtcbiAgb3V0WzNdID0gYVszXSAqIG10ICsgYlszXSAqIHQ7XG4gIG91dFs0XSA9IGFbNF0gKiBtdCArIGJbNF0gKiB0O1xuICBvdXRbNV0gPSBhWzVdICogbXQgKyBiWzVdICogdDtcbiAgb3V0WzZdID0gYVs2XSAqIG10ICsgYls2XSAqIHQ7XG4gIG91dFs3XSA9IGFbN10gKiBtdCArIGJbN10gKiB0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBpbnZlcnNlIG9mIGEgZHVhbCBxdWF0LiBJZiB0aGV5IGFyZSBub3JtYWxpemVkLCBjb25qdWdhdGUgaXMgY2hlYXBlclxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIGR1YWwgcXVhdCB0byBjYWxjdWxhdGUgaW52ZXJzZSBvZlxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgc3FsZW4gPSBzcXVhcmVkTGVuZ3RoKGEpO1xuICBvdXRbMF0gPSAtYVswXSAvIHNxbGVuO1xuICBvdXRbMV0gPSAtYVsxXSAvIHNxbGVuO1xuICBvdXRbMl0gPSAtYVsyXSAvIHNxbGVuO1xuICBvdXRbM10gPSBhWzNdIC8gc3FsZW47XG4gIG91dFs0XSA9IC1hWzRdIC8gc3FsZW47XG4gIG91dFs1XSA9IC1hWzVdIC8gc3FsZW47XG4gIG91dFs2XSA9IC1hWzZdIC8gc3FsZW47XG4gIG91dFs3XSA9IGFbN10gLyBzcWxlbjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIGEgZHVhbCBxdWF0XG4gKiBJZiB0aGUgZHVhbCBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQsIHRoaXMgZnVuY3Rpb24gaXMgZmFzdGVyIHRoYW4gcXVhdDIuaW52ZXJzZSBhbmQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LlxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmp1Z2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gLWFbNF07XG4gIG91dFs1XSA9IC1hWzVdO1xuICBvdXRbNl0gPSAtYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgZHVhbCBxdWF0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIGR1YWwgcXVhdCB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBsZW5ndGggPSBxdWF0Lmxlbmd0aDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Mi5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSBkdWFsIHF1YXRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0IHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzcXVhcmVkTGVuZ3RoID0gcXVhdC5zcXVhcmVkTGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQyLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcbiAqIE5vcm1hbGl6ZSBhIGR1YWwgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIGR1YWwgcXVhdGVybmlvbiB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgbWFnbml0dWRlID0gc3F1YXJlZExlbmd0aChhKTtcblxuICBpZiAobWFnbml0dWRlID4gMCkge1xuICAgIG1hZ25pdHVkZSA9IE1hdGguc3FydChtYWduaXR1ZGUpO1xuICAgIHZhciBhMCA9IGFbMF0gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGExID0gYVsxXSAvIG1hZ25pdHVkZTtcbiAgICB2YXIgYTIgPSBhWzJdIC8gbWFnbml0dWRlO1xuICAgIHZhciBhMyA9IGFbM10gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGIwID0gYVs0XTtcbiAgICB2YXIgYjEgPSBhWzVdO1xuICAgIHZhciBiMiA9IGFbNl07XG4gICAgdmFyIGIzID0gYVs3XTtcbiAgICB2YXIgYV9kb3RfYiA9IGEwICogYjAgKyBhMSAqIGIxICsgYTIgKiBiMiArIGEzICogYjM7XG4gICAgb3V0WzBdID0gYTA7XG4gICAgb3V0WzFdID0gYTE7XG4gICAgb3V0WzJdID0gYTI7XG4gICAgb3V0WzNdID0gYTM7XG4gICAgb3V0WzRdID0gKGIwIC0gYTAgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgICBvdXRbNV0gPSAoYjEgLSBhMSAqIGFfZG90X2IpIC8gbWFnbml0dWRlO1xuICAgIG91dFs2XSA9IChiMiAtIGEyICogYV9kb3RfYikgLyBtYWduaXR1ZGU7XG4gICAgb3V0WzddID0gKGIzIC0gYTMgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkdWFsIHF1YXRlbmlvblxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBkdWFsIHF1YXRlcm5pb24gdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGR1YWwgcXVhdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJxdWF0MihcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIiwgXCIgKyBhWzRdICsgXCIsIFwiICsgYVs1XSArIFwiLCBcIiArIGFbNl0gKyBcIiwgXCIgKyBhWzddICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGR1YWwgcXVhdGVybmlvbnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZmlyc3QgZHVhbCBxdWF0ZXJuaW9uLlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgZHVhbCBxdWF0ZXJuaW9uLlxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIGR1YWwgcXVhdGVybmlvbnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdICYmIGFbNl0gPT09IGJbNl0gJiYgYVs3XSA9PT0gYls3XTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZHVhbCBxdWF0ZXJuaW9ucyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBkdWFsIHF1YXQuXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGIgdGhlIHNlY29uZCBkdWFsIHF1YXQuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgZHVhbCBxdWF0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XSxcbiAgICAgIGE2ID0gYVs2XSxcbiAgICAgIGE3ID0gYVs3XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXSxcbiAgICAgIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XSxcbiAgICAgIGI2ID0gYls2XSxcbiAgICAgIGI3ID0gYls3XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE2KSwgTWF0aC5hYnMoYjYpKSAmJiBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNyksIE1hdGguYWJzKGI3KSk7XG59IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcbiAqIDIgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbW9kdWxlIHZlYzJcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzJcbiAqXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKHgsIHkpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSkge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2VpbFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGZsb29yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtaW4ob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byByb3VuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2NhbGVzIGEgdmVjMiBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjMidzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHk7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHkpO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHk7XG59XG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xuICogTm90ZSB0aGF0IHRoZSBjcm9zcyBwcm9kdWN0IG11c3QgYnkgZGVmaW5pdGlvbiBwcm9kdWNlIGEgM0QgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCBhLCBiKSB7XG4gIHZhciB6ID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTtcbiAgb3V0WzBdID0gb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgb3V0WzBdID0gTWF0aC5jb3MocikgKiBzY2FsZTtcbiAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDIob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyZChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0M1xuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzNdICogeSArIG1bNl07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs0XSAqIHkgKyBtWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQ0XG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcwJ1xuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bMTJdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZSBhIDJEIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgdmVjMiBwb2ludCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIGIsIHJhZCkge1xuICAvL1RyYW5zbGF0ZSBwb2ludCB0byB0aGUgb3JpZ2luXG4gIHZhciBwMCA9IGFbMF0gLSBiWzBdLFxuICAgICAgcDEgPSBhWzFdIC0gYlsxXSxcbiAgICAgIHNpbkMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgY29zQyA9IE1hdGguY29zKHJhZCk7IC8vcGVyZm9ybSByb3RhdGlvbiBhbmQgdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSBwMCAqIGNvc0MgLSBwMSAqIHNpbkMgKyBiWzBdO1xuICBvdXRbMV0gPSBwMCAqIHNpbkMgKyBwMSAqIGNvc0MgKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDJEIHZlY3RvcnNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFuZ2xlKGEsIGIpIHtcbiAgdmFyIHgxID0gYVswXSxcbiAgICAgIHkxID0gYVsxXSxcbiAgICAgIHgyID0gYlswXSxcbiAgICAgIHkyID0gYlsxXSxcbiAgICAgIC8vIG1hZyBpcyB0aGUgcHJvZHVjdCBvZiB0aGUgbWFnbml0dWRlcyBvZiBhIGFuZCBiXG4gIG1hZyA9IE1hdGguc3FydCh4MSAqIHgxICsgeTEgKiB5MSkgKiBNYXRoLnNxcnQoeDIgKiB4MiArIHkyICogeTIpLFxuICAgICAgLy8gbWFnICYmLi4gc2hvcnQgY2lyY3VpdHMgaWYgbWFnID09IDBcbiAgY29zaW5lID0gbWFnICYmICh4MSAqIHgyICsgeTEgKiB5MikgLyBtYWc7IC8vIE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSBjbGFtcHMgdGhlIGNvc2luZSBiZXR3ZWVuIC0xIGFuZCAxXG5cbiAgcmV0dXJuIE1hdGguYWNvcyhNYXRoLm1pbihNYXRoLm1heChjb3NpbmUsIC0xKSwgMSkpO1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHplcm9cbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzIoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiKVwiO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGV4YWN0bHkgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSk7XG59XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMycy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMyLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjMnMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMjtcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBlYXJjdXQ7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gZWFyY3V0O1xuXG5mdW5jdGlvbiBlYXJjdXQoZGF0YSwgaG9sZUluZGljZXMsIGRpbSkge1xuXG4gICAgZGltID0gZGltIHx8IDI7XG5cbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXG4gICAgICAgIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoLFxuICAgICAgICBvdXRlck5vZGUgPSBsaW5rZWRMaXN0KGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUpLFxuICAgICAgICB0cmlhbmdsZXMgPSBbXTtcblxuICAgIGlmICghb3V0ZXJOb2RlIHx8IG91dGVyTm9kZS5uZXh0ID09PSBvdXRlck5vZGUucHJldikgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgaW52U2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgICAgIGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuICAgIH1cblxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHJldHVybiB0cmlhbmdsZXM7XG59XG5cbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xuICAgIHZhciBpLCBsYXN0O1xuXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9XG5cbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xuICAgICAgICByZW1vdmVOb2RlKGxhc3QpO1xuICAgICAgICBsYXN0ID0gbGFzdC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0O1xufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0O1xuXG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgYWdhaW47XG4gICAgZG8ge1xuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICBwID0gZW5kID0gcC5wcmV2O1xuICAgICAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgYnJlYWs7XG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChhZ2FpbiB8fCBwICE9PSBlbmQpO1xuXG4gICAgcmV0dXJuIGVuZDtcbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcykge1xuICAgIGlmICghZWFyKSByZXR1cm47XG5cbiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG4gICAgaWYgKCFwYXNzICYmIGludlNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHZhciBzdG9wID0gZWFyLFxuICAgICAgICBwcmV2LCBuZXh0O1xuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xuICAgICAgICBwcmV2ID0gZWFyLnByZXY7XG4gICAgICAgIG5leHQgPSBlYXIubmV4dDtcblxuICAgICAgICBpZiAoaW52U2l6ZSA/IGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSkgOiBpc0VhcihlYXIpKSB7XG4gICAgICAgICAgICAvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGVhci5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKG5leHQuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIHJlbW92ZU5vZGUoZWFyKTtcblxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGV4IGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMik7XG5cbiAgICAgICAgICAgIC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcbiAgICB2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gZWFyLnByZXYpIHtcbiAgICAgICAgaWYgKHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcbiAgICB2YXIgbWluVFggPSBhLnggPCBiLnggPyAoYS54IDwgYy54ID8gYS54IDogYy54KSA6IChiLnggPCBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtaW5UWSA9IGEueSA8IGIueSA/IChhLnkgPCBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA8IGMueSA/IGIueSA6IGMueSksXG4gICAgICAgIG1heFRYID0gYS54ID4gYi54ID8gKGEueCA+IGMueCA/IGEueCA6IGMueCkgOiAoYi54ID4gYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWF4VFkgPSBhLnkgPiBiLnkgPyAoYS55ID4gYy55ID8gYS55IDogYy55KSA6IChiLnkgPiBjLnkgPyBiLnkgOiBjLnkpO1xuXG4gICAgLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcbiAgICB2YXIgbWluWiA9IHpPcmRlcihtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUpLFxuICAgICAgICBtYXhaID0gek9yZGVyKG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG5cbiAgICB2YXIgcCA9IGVhci5wcmV2WixcbiAgICAgICAgbiA9IGVhci5uZXh0WjtcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGJvdGggZGlyZWN0aW9uc1xuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuXG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGluY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChuICYmIG4ueiA8PSBtYXhaKSB7XG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGZpbHRlclBvaW50cyhwKTtcbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG4gICAgdmFyIGEgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBiID0gYS5uZXh0Lm5leHQ7XG4gICAgICAgIHdoaWxlIChiICE9PSBhLnByZXYpIHtcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBzcGxpdFBvbHlnb24oYSwgYik7XG5cbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuICAgICAgICAgICAgICAgIGEgPSBmaWx0ZXJQb2ludHMoYSwgYS5uZXh0KTtcbiAgICAgICAgICAgICAgICBjID0gZmlsdGVyUG9pbnRzKGMsIGMubmV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiID0gYi5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhLm5leHQ7XG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHtcbiAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7XG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XG4gICAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNvcnQoY29tcGFyZVgpO1xuXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTtcbiAgICAgICAgb3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRlck5vZGU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKGEsIGIpIHtcbiAgICByZXR1cm4gYS54IC0gYi54O1xufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgdmFyIGJyaWRnZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XG4gICAgaWYgKCFicmlkZ2UpIHtcbiAgICAgICAgcmV0dXJuIG91dGVyTm9kZTtcbiAgICB9XG5cbiAgICB2YXIgYnJpZGdlUmV2ZXJzZSA9IHNwbGl0UG9seWdvbihicmlkZ2UsIGhvbGUpO1xuXG4gICAgLy8gZmlsdGVyIGNvbGxpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG4gICAgdmFyIGZpbHRlcmVkQnJpZGdlID0gZmlsdGVyUG9pbnRzKGJyaWRnZSwgYnJpZGdlLm5leHQpO1xuICAgIGZpbHRlclBvaW50cyhicmlkZ2VSZXZlcnNlLCBicmlkZ2VSZXZlcnNlLm5leHQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgaW5wdXQgbm9kZSB3YXMgcmVtb3ZlZCBieSB0aGUgZmlsdGVyaW5nXG4gICAgcmV0dXJuIG91dGVyTm9kZSA9PT0gYnJpZGdlID8gZmlsdGVyZWRCcmlkZ2UgOiBvdXRlck5vZGU7XG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIHZhciBwID0gb3V0ZXJOb2RlLFxuICAgICAgICBoeCA9IGhvbGUueCxcbiAgICAgICAgaHkgPSBob2xlLnksXG4gICAgICAgIHF4ID0gLUluZmluaXR5LFxuICAgICAgICBtO1xuXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBkbyB7XG4gICAgICAgIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkgJiYgcC5uZXh0LnkgIT09IHAueSkge1xuICAgICAgICAgICAgdmFyIHggPSBwLnggKyAoaHkgLSBwLnkpICogKHAubmV4dC54IC0gcC54KSAvIChwLm5leHQueSAtIHAueSk7XG4gICAgICAgICAgICBpZiAoeCA8PSBoeCAmJiB4ID4gcXgpIHtcbiAgICAgICAgICAgICAgICBxeCA9IHg7XG4gICAgICAgICAgICAgICAgaWYgKHggPT09IGh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC55KSByZXR1cm4gcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLm5leHQueSkgcmV0dXJuIHAubmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IG91dGVyTm9kZSk7XG5cbiAgICBpZiAoIW0pIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGh4ID09PSBxeCkgcmV0dXJuIG07IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxlZnRtb3N0IGVuZHBvaW50XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuICAgIHZhciBzdG9wID0gbSxcbiAgICAgICAgbXggPSBtLngsXG4gICAgICAgIG15ID0gbS55LFxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcbiAgICAgICAgdGFuO1xuXG4gICAgcCA9IG07XG5cbiAgICBkbyB7XG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcbiAgICAgICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkpKSB7XG5cbiAgICAgICAgICAgIHRhbiA9IE1hdGguYWJzKGh5IC0gcC55KSAvIChoeCAtIHAueCk7IC8vIHRhbmdlbnRpYWxcblxuICAgICAgICAgICAgaWYgKGxvY2FsbHlJbnNpZGUocCwgaG9sZSkgJiZcbiAgICAgICAgICAgICAgICAodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiAocC54ID4gbS54IHx8IChwLnggPT09IG0ueCAmJiBzZWN0b3JDb250YWluc1NlY3RvcihtLCBwKSkpKSkpIHtcbiAgICAgICAgICAgICAgICBtID0gcDtcbiAgICAgICAgICAgICAgICB0YW5NaW4gPSB0YW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0b3ApO1xuXG4gICAgcmV0dXJuIG07XG59XG5cbi8vIHdoZXRoZXIgc2VjdG9yIGluIHZlcnRleCBtIGNvbnRhaW5zIHNlY3RvciBpbiB2ZXJ0ZXggcCBpbiB0aGUgc2FtZSBjb29yZGluYXRlc1xuZnVuY3Rpb24gc2VjdG9yQ29udGFpbnNTZWN0b3IobSwgcCkge1xuICAgIHJldHVybiBhcmVhKG0ucHJldiwgbSwgcC5wcmV2KSA8IDAgJiYgYXJlYShwLm5leHQsIG0sIG0ubmV4dCkgPCAwO1xufVxuXG4vLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG5mdW5jdGlvbiBpbmRleEN1cnZlKHN0YXJ0LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnogPT09IG51bGwpIHAueiA9IHpPcmRlcihwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgIHAucHJldlogPSBwLnByZXY7XG4gICAgICAgIHAubmV4dFogPSBwLm5leHQ7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcC5wcmV2Wi5uZXh0WiA9IG51bGw7XG4gICAgcC5wcmV2WiA9IG51bGw7XG5cbiAgICBzb3J0TGlua2VkKHApO1xufVxuXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxuLy8gaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9hbGdvcml0aG1zL2xpc3Rzb3J0Lmh0bWxcbmZ1bmN0aW9uIHNvcnRMaW5rZWQobGlzdCkge1xuICAgIHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSxcbiAgICAgICAgaW5TaXplID0gMTtcblxuICAgIGRvIHtcbiAgICAgICAgcCA9IGxpc3Q7XG4gICAgICAgIGxpc3QgPSBudWxsO1xuICAgICAgICB0YWlsID0gbnVsbDtcbiAgICAgICAgbnVtTWVyZ2VzID0gMDtcblxuICAgICAgICB3aGlsZSAocCkge1xuICAgICAgICAgICAgbnVtTWVyZ2VzKys7XG4gICAgICAgICAgICBxID0gcDtcbiAgICAgICAgICAgIHBTaXplID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpblNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIHBTaXplKys7XG4gICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgaWYgKCFxKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xuXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSAhPT0gMCAmJiAocVNpemUgPT09IDAgfHwgIXEgfHwgcC56IDw9IHEueikpIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHA7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBwU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFpbCkgdGFpbC5uZXh0WiA9IGU7XG4gICAgICAgICAgICAgICAgZWxzZSBsaXN0ID0gZTtcblxuICAgICAgICAgICAgICAgIGUucHJldlogPSB0YWlsO1xuICAgICAgICAgICAgICAgIHRhaWwgPSBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwID0gcTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWwubmV4dFogPSBudWxsO1xuICAgICAgICBpblNpemUgKj0gMjtcblxuICAgIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpO1xuXG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIHotb3JkZXIgb2YgYSBwb2ludCBnaXZlbiBjb29yZHMgYW5kIGludmVyc2Ugb2YgdGhlIGxvbmdlciBzaWRlIG9mIGRhdGEgYmJveFxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIGludlNpemUpIHtcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG4gICAgeCA9IDMyNzY3ICogKHggLSBtaW5YKSAqIGludlNpemU7XG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAqIGludlNpemU7XG5cbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54IHx8IChwLnggPT09IGxlZnRtb3N0LnggJiYgcC55IDwgbGVmdG1vc3QueSkpIGxlZnRtb3N0ID0gcDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gbGVmdG1vc3Q7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpIHtcbiAgICByZXR1cm4gKGN4IC0gcHgpICogKGF5IC0gcHkpIC0gKGF4IC0gcHgpICogKGN5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGF4IC0gcHgpICogKGJ5IC0gcHkpIC0gKGJ4IC0gcHgpICogKGF5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGJ4IC0gcHgpICogKGN5IC0gcHkpIC0gKGN4IC0gcHgpICogKGJ5IC0gcHkpID49IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKGEsIGIpIHtcbiAgICByZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICFpbnRlcnNlY3RzUG9seWdvbihhLCBiKSAmJiAvLyBkb25lcyd0IGludGVyc2VjdCBvdGhlciBlZGdlc1xuICAgICAgICAgICAobG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKSAmJiAvLyBsb2NhbGx5IHZpc2libGVcbiAgICAgICAgICAgIChhcmVhKGEucHJldiwgYSwgYi5wcmV2KSB8fCBhcmVhKGEsIGIucHJldiwgYikpIHx8IC8vIGRvZXMgbm90IGNyZWF0ZSBvcHBvc2l0ZS1mYWNpbmcgc2VjdG9yc1xuICAgICAgICAgICAgZXF1YWxzKGEsIGIpICYmIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpID4gMCAmJiBhcmVhKGIucHJldiwgYiwgYi5uZXh0KSA+IDApOyAvLyBzcGVjaWFsIHplcm8tbGVuZ3RoIGNhc2Vcbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7XG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikge1xuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcbiAgICB2YXIgbzEgPSBzaWduKGFyZWEocDEsIHExLCBwMikpO1xuICAgIHZhciBvMiA9IHNpZ24oYXJlYShwMSwgcTEsIHEyKSk7XG4gICAgdmFyIG8zID0gc2lnbihhcmVhKHAyLCBxMiwgcDEpKTtcbiAgICB2YXIgbzQgPSBzaWduKGFyZWEocDIsIHEyLCBxMSkpO1xuXG4gICAgaWYgKG8xICE9PSBvMiAmJiBvMyAhPT0gbzQpIHJldHVybiB0cnVlOyAvLyBnZW5lcmFsIGNhc2VcblxuICAgIGlmIChvMSA9PT0gMCAmJiBvblNlZ21lbnQocDEsIHAyLCBxMSkpIHJldHVybiB0cnVlOyAvLyBwMSwgcTEgYW5kIHAyIGFyZSBjb2xsaW5lYXIgYW5kIHAyIGxpZXMgb24gcDFxMVxuICAgIGlmIChvMiA9PT0gMCAmJiBvblNlZ21lbnQocDEsIHEyLCBxMSkpIHJldHVybiB0cnVlOyAvLyBwMSwgcTEgYW5kIHEyIGFyZSBjb2xsaW5lYXIgYW5kIHEyIGxpZXMgb24gcDFxMVxuICAgIGlmIChvMyA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHAxLCBxMikpIHJldHVybiB0cnVlOyAvLyBwMiwgcTIgYW5kIHAxIGFyZSBjb2xsaW5lYXIgYW5kIHAxIGxpZXMgb24gcDJxMlxuICAgIGlmIChvNCA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHExLCBxMikpIHJldHVybiB0cnVlOyAvLyBwMiwgcTIgYW5kIHExIGFyZSBjb2xsaW5lYXIgYW5kIHExIGxpZXMgb24gcDJxMlxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBmb3IgY29sbGluZWFyIHBvaW50cyBwLCBxLCByLCBjaGVjayBpZiBwb2ludCBxIGxpZXMgb24gc2VnbWVudCBwclxuZnVuY3Rpb24gb25TZWdtZW50KHAsIHEsIHIpIHtcbiAgICByZXR1cm4gcS54IDw9IE1hdGgubWF4KHAueCwgci54KSAmJiBxLnggPj0gTWF0aC5taW4ocC54LCByLngpICYmIHEueSA8PSBNYXRoLm1heChwLnksIHIueSkgJiYgcS55ID49IE1hdGgubWluKHAueSwgci55KTtcbn1cblxuZnVuY3Rpb24gc2lnbihudW0pIHtcbiAgICByZXR1cm4gbnVtID4gMCA/IDEgOiBudW0gPCAwID8gLTEgOiAwO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xuZnVuY3Rpb24gaW50ZXJzZWN0c1BvbHlnb24oYSwgYikge1xuICAgIHZhciBwID0gYTtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLmkgIT09IGEuaSAmJiBwLm5leHQuaSAhPT0gYS5pICYmIHAuaSAhPT0gYi5pICYmIHAubmV4dC5pICE9PSBiLmkgJiZcbiAgICAgICAgICAgICAgICBpbnRlcnNlY3RzKHAsIHAubmV4dCwgYSwgYikpIHJldHVybiB0cnVlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoYSwgYikge1xuICAgIHJldHVybiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA8IDAgP1xuICAgICAgICBhcmVhKGEsIGIsIGEubmV4dCkgPj0gMCAmJiBhcmVhKGEsIGEucHJldiwgYikgPj0gMCA6XG4gICAgICAgIGFyZWEoYSwgYiwgYS5wcmV2KSA8IDAgfHwgYXJlYShhLCBhLm5leHQsIGIpIDwgMDtcbn1cblxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoYSwgYikge1xuICAgIHZhciBwID0gYSxcbiAgICAgICAgaW5zaWRlID0gZmFsc2UsXG4gICAgICAgIHB4ID0gKGEueCArIGIueCkgLyAyLFxuICAgICAgICBweSA9IChhLnkgKyBiLnkpIC8gMjtcbiAgICBkbyB7XG4gICAgICAgIGlmICgoKHAueSA+IHB5KSAhPT0gKHAubmV4dC55ID4gcHkpKSAmJiBwLm5leHQueSAhPT0gcC55ICYmXG4gICAgICAgICAgICAgICAgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gaW5zaWRlO1xufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XG4gICAgdmFyIGEyID0gbmV3IE5vZGUoYS5pLCBhLngsIGEueSksXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXG4gICAgICAgIGFuID0gYS5uZXh0LFxuICAgICAgICBicCA9IGIucHJldjtcblxuICAgIGEubmV4dCA9IGI7XG4gICAgYi5wcmV2ID0gYTtcblxuICAgIGEyLm5leHQgPSBhbjtcbiAgICBhbi5wcmV2ID0gYTI7XG5cbiAgICBiMi5uZXh0ID0gYTI7XG4gICAgYTIucHJldiA9IGIyO1xuXG4gICAgYnAubmV4dCA9IGIyO1xuICAgIGIyLnByZXYgPSBicDtcblxuICAgIHJldHVybiBiMjtcbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XG5cbiAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgcC5wcmV2ID0gcDtcbiAgICAgICAgcC5uZXh0ID0gcDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xuICAgICAgICBsYXN0Lm5leHQgPSBwO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xufVxuXG5mdW5jdGlvbiBOb2RlKGksIHgsIHkpIHtcbiAgICAvLyB2ZXJ0ZXggaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcbiAgICB0aGlzLmkgPSBpO1xuXG4gICAgLy8gdmVydGV4IGNvb3JkaW5hdGVzXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGV4IG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG4gICAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuXG4gICAgLy8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuICAgIHRoaXMueiA9IG51bGw7XG5cbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCBub2RlcyBpbiB6LW9yZGVyXG4gICAgdGhpcy5wcmV2WiA9IG51bGw7XG4gICAgdGhpcy5uZXh0WiA9IG51bGw7XG5cbiAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxuICAgIHRoaXMuc3RlaW5lciA9IGZhbHNlO1xufVxuXG4vLyByZXR1cm4gYSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9seWdvbiBhcmVhIGFuZCBpdHMgdHJpYW5ndWxhdGlvbiBhcmVhO1xuLy8gdXNlZCB0byB2ZXJpZnkgY29ycmVjdG5lc3Mgb2YgdHJpYW5ndWxhdGlvblxuZWFyY3V0LmRldmlhdGlvbiA9IGZ1bmN0aW9uIChkYXRhLCBob2xlSW5kaWNlcywgZGltLCB0cmlhbmdsZXMpIHtcbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGg7XG4gICAgdmFyIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXG4gICAgdmFyIHBvbHlnb25BcmVhID0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCAwLCBvdXRlckxlbiwgZGltKSk7XG4gICAgaWYgKGhhc0hvbGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgICAgICB2YXIgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHBvbHlnb25BcmVhIC09IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJpYW5nbGVzQXJlYSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB2YXIgYSA9IHRyaWFuZ2xlc1tpXSAqIGRpbTtcbiAgICAgICAgdmFyIGIgPSB0cmlhbmdsZXNbaSArIDFdICogZGltO1xuICAgICAgICB2YXIgYyA9IHRyaWFuZ2xlc1tpICsgMl0gKiBkaW07XG4gICAgICAgIHRyaWFuZ2xlc0FyZWEgKz0gTWF0aC5hYnMoXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbY10pICogKGRhdGFbYiArIDFdIC0gZGF0YVthICsgMV0pIC1cbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtiXSkgKiAoZGF0YVtjICsgMV0gLSBkYXRhW2EgKyAxXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBwb2x5Z29uQXJlYSA9PT0gMCAmJiB0cmlhbmdsZXNBcmVhID09PSAwID8gMCA6XG4gICAgICAgIE1hdGguYWJzKCh0cmlhbmdsZXNBcmVhIC0gcG9seWdvbkFyZWEpIC8gcG9seWdvbkFyZWEpO1xufTtcblxuZnVuY3Rpb24gc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltKSB7XG4gICAgICAgIHN1bSArPSAoZGF0YVtqXSAtIGRhdGFbaV0pICogKGRhdGFbaSArIDFdICsgZGF0YVtqICsgMV0pO1xuICAgICAgICBqID0gaTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cblxuLy8gdHVybiBhIHBvbHlnb24gaW4gYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBmb3JtIChlLmcuIGFzIGluIEdlb0pTT04pIGludG8gYSBmb3JtIEVhcmN1dCBhY2NlcHRzXG5lYXJjdXQuZmxhdHRlbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGRpbSA9IGRhdGFbMF1bMF0ubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSB7dmVydGljZXM6IFtdLCBob2xlczogW10sIGRpbWVuc2lvbnM6IGRpbX0sXG4gICAgICAgIGhvbGVJbmRleCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGRpbTsgZCsrKSByZXN1bHQudmVydGljZXMucHVzaChkYXRhW2ldW2pdW2RdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGhvbGVJbmRleCArPSBkYXRhW2kgLSAxXS5sZW5ndGg7XG4gICAgICAgICAgICByZXN1bHQuaG9sZXMucHVzaChob2xlSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnIsIGssIGxlZnQsIHJpZ2h0LCBjb21wYXJlKSB7XG4gICAgcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbGVmdCB8fCAwLCByaWdodCB8fCAoYXJyLmxlbmd0aCAtIDEpLCBjb21wYXJlIHx8IGRlZmF1bHRDb21wYXJlKTtcbn1cblxuZnVuY3Rpb24gcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbGVmdCwgcmlnaHQsIGNvbXBhcmUpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgdmFyIG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgdmFyIG0gPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICB2YXIgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgdmFyIHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgICAgICAgdmFyIHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKG0gLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdmFyIG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgdmFyIG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBxdWlja3NlbGVjdFN0ZXAoYXJyLCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdCA9IGFycltrXTtcbiAgICAgICAgdmFyIGkgPSBsZWZ0O1xuICAgICAgICB2YXIgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXAoYXJyLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyW3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFyciwgbGVmdCwgcmlnaHQpO1xuXG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgc3dhcChhcnIsIGksIGopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyW2ldLCB0KSA8IDApIGkrKztcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlKGFycltqXSwgdCkgPiAwKSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tcGFyZShhcnJbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFyciwgbGVmdCwgaik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgc3dhcChhcnIsIGosIHJpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICAgICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCBpLCBqKSB7XG4gICAgdmFyIHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUZlYXR1cmU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVGZWF0dXJlKHBiZiwgZW5kLCBleHRlbnQsIGtleXMsIHZhbHVlcykge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMucHJvcGVydGllcyA9IHt9O1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMudHlwZSA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2dlb21ldHJ5ID0gLTE7XG4gICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZEZlYXR1cmUsIHRoaXMsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGZWF0dXJlKHRhZywgZmVhdHVyZSwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PSAxKSBmZWF0dXJlLmlkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMikgcmVhZFRhZyhwYmYsIGZlYXR1cmUpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAzKSBmZWF0dXJlLnR5cGUgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSA0KSBmZWF0dXJlLl9nZW9tZXRyeSA9IHBiZi5wb3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWcocGJmLCBmZWF0dXJlKSB7XG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIGtleSA9IGZlYXR1cmUuX2tleXNbcGJmLnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICB2YWx1ZSA9IGZlYXR1cmUuX3ZhbHVlc1twYmYucmVhZFZhcmludCgpXTtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG59XG5cblZlY3RvclRpbGVGZWF0dXJlLnR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgbGluZXMgPSBbXSxcbiAgICAgICAgbGluZTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmIChsZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcblxuICAgICAgICAgICAgaWYgKGNtZCA9PT0gMSkgeyAvLyBtb3ZlVG9cbiAgICAgICAgICAgICAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmUucHVzaChuZXcgUG9pbnQoeCwgeSkpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY21kID09PSA3KSB7XG5cbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwbmlrLXZlY3Rvci10aWxlL2lzc3Vlcy85MFxuICAgICAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICAgICAgICBsaW5lLnB1c2gobGluZVswXS5jbG9uZSgpKTsgLy8gY2xvc2VQb2x5Z29uXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG5cbiAgICByZXR1cm4gbGluZXM7XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUuYmJveCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHgxID0gSW5maW5pdHksXG4gICAgICAgIHgyID0gLUluZmluaXR5LFxuICAgICAgICB5MSA9IEluZmluaXR5LFxuICAgICAgICB5MiA9IC1JbmZpbml0eTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmIChsZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIGlmICh4IDwgeDEpIHgxID0geDtcbiAgICAgICAgICAgIGlmICh4ID4geDIpIHgyID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgeTEpIHkxID0geTtcbiAgICAgICAgICAgIGlmICh5ID4geTIpIHkyID0geTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCAhPT0gNykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXTtcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLmV4dGVudCAqIE1hdGgucG93KDIsIHopLFxuICAgICAgICB4MCA9IHRoaXMuZXh0ZW50ICogeCxcbiAgICAgICAgeTAgPSB0aGlzLmV4dGVudCAqIHksXG4gICAgICAgIGNvb3JkcyA9IHRoaXMubG9hZEdlb21ldHJ5KCksXG4gICAgICAgIHR5cGUgPSBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdLFxuICAgICAgICBpLCBqO1xuXG4gICAgZnVuY3Rpb24gcHJvamVjdChsaW5lKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHAgPSBsaW5lW2pdLCB5MiA9IDE4MCAtIChwLnkgKyB5MCkgKiAzNjAgLyBzaXplO1xuICAgICAgICAgICAgbGluZVtqXSA9IFtcbiAgICAgICAgICAgICAgICAocC54ICsgeDApICogMzYwIC8gc2l6ZSAtIDE4MCxcbiAgICAgICAgICAgICAgICAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTBcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgICAgdmFyIHBvaW50cyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwb2ludHNbaV0gPSBjb29yZHNbaV1bMF07XG4gICAgICAgIH1cbiAgICAgICAgY29vcmRzID0gcG9pbnRzO1xuICAgICAgICBwcm9qZWN0KGNvb3Jkcyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAyOlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwcm9qZWN0KGNvb3Jkc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDM6XG4gICAgICAgIGNvb3JkcyA9IGNsYXNzaWZ5UmluZ3MoY29vcmRzKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvb3Jkc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHByb2plY3QoY29vcmRzW2ldW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29vcmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9ICdNdWx0aScgKyB0eXBlO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIHR5cGU6IFwiRmVhdHVyZVwiLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZHNcbiAgICAgICAgfSxcbiAgICAgICAgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzXG4gICAgfTtcblxuICAgIGlmICgnaWQnIGluIHRoaXMpIHtcbiAgICAgICAgcmVzdWx0LmlkID0gdGhpcy5pZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gY2xhc3NpZmllcyBhbiBhcnJheSBvZiByaW5ncyBpbnRvIHBvbHlnb25zIHdpdGggb3V0ZXIgcmluZ3MgYW5kIGhvbGVzXG5cbmZ1bmN0aW9uIGNsYXNzaWZ5UmluZ3MocmluZ3MpIHtcbiAgICB2YXIgbGVuID0gcmluZ3MubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiA8PSAxKSByZXR1cm4gW3JpbmdzXTtcblxuICAgIHZhciBwb2x5Z29ucyA9IFtdLFxuICAgICAgICBwb2x5Z29uLFxuICAgICAgICBjY3c7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBhcmVhID0gc2lnbmVkQXJlYShyaW5nc1tpXSk7XG4gICAgICAgIGlmIChhcmVhID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoY2N3ID09PSB1bmRlZmluZWQpIGNjdyA9IGFyZWEgPCAwO1xuXG4gICAgICAgIGlmIChjY3cgPT09IGFyZWEgPCAwKSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgICAgICAgICAgIHBvbHlnb24gPSBbcmluZ3NbaV1dO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb2x5Z29uLnB1c2gocmluZ3NbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuXG4gICAgcmV0dXJuIHBvbHlnb25zO1xufVxuXG5mdW5jdGlvbiBzaWduZWRBcmVhKHJpbmcpIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxLCBwMSwgcDI7IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICAgICAgcDEgPSByaW5nW2ldO1xuICAgICAgICBwMiA9IHJpbmdbal07XG4gICAgICAgIHN1bSArPSAocDIueCAtIHAxLngpICogKHAxLnkgKyBwMi55KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVMYXllcjtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUxheWVyKHBiZiwgZW5kKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy52ZXJzaW9uID0gMTtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gNDA5NjtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9mZWF0dXJlcyA9IFtdO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZExheWVyLCB0aGlzLCBlbmQpO1xuXG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRMYXllcih0YWcsIGxheWVyLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxNSkgbGF5ZXIudmVyc2lvbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAxKSBsYXllci5uYW1lID0gcGJmLnJlYWRTdHJpbmcoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGxheWVyLmV4dGVudCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBsYXllci5fZmVhdHVyZXMucHVzaChwYmYucG9zKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDMpIGxheWVyLl9rZXlzLnB1c2gocGJmLnJlYWRTdHJpbmcoKSk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBsYXllci5fdmFsdWVzLnB1c2gocmVhZFZhbHVlTWVzc2FnZShwYmYpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlTWVzc2FnZShwYmYpIHtcbiAgICB2YXIgdmFsdWUgPSBudWxsLFxuICAgICAgICBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciB0YWcgPSBwYmYucmVhZFZhcmludCgpID4+IDM7XG5cbiAgICAgICAgdmFsdWUgPSB0YWcgPT09IDEgPyBwYmYucmVhZFN0cmluZygpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMiA/IHBiZi5yZWFkRmxvYXQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDMgPyBwYmYucmVhZERvdWJsZSgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNCA/IHBiZi5yZWFkVmFyaW50NjQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDUgPyBwYmYucmVhZFZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNiA/IHBiZi5yZWFkU1ZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNyA/IHBiZi5yZWFkQm9vbGVhbigpIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJldHVybiBmZWF0dXJlIGBpYCBmcm9tIHRoaXMgbGF5ZXIgYXMgYSBgVmVjdG9yVGlsZUZlYXR1cmVgXG5WZWN0b3JUaWxlTGF5ZXIucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbihpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2ZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgdGhpcy5fcGJmLnBvcyA9IHRoaXMuX2ZlYXR1cmVzW2ldO1xuXG4gICAgdmFyIGVuZCA9IHRoaXMuX3BiZi5yZWFkVmFyaW50KCkgKyB0aGlzLl9wYmYucG9zO1xuICAgIHJldHVybiBuZXcgVmVjdG9yVGlsZUZlYXR1cmUodGhpcy5fcGJmLCBlbmQsIHRoaXMuZXh0ZW50LCB0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWxheWVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZShwYmYsIGVuZCkge1xuICAgIHRoaXMubGF5ZXJzID0gcGJmLnJlYWRGaWVsZHMocmVhZFRpbGUsIHt9LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkVGlsZSh0YWcsIGxheWVycywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgbGF5ZXIgPSBuZXcgVmVjdG9yVGlsZUxheWVyKHBiZiwgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MpO1xuICAgICAgICBpZiAobGF5ZXIubGVuZ3RoKSBsYXllcnNbbGF5ZXIubmFtZV0gPSBsYXllcjtcbiAgICB9XG59XG5cbiIsIm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMnKTtcbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG5mdW5jdGlvbiBQYmYoYnVmKSB7XG4gICAgdGhpcy5idWYgPSBBcnJheUJ1ZmZlci5pc1ZpZXcgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGJ1ZikgPyBidWYgOiBuZXcgVWludDhBcnJheShidWYgfHwgMCk7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMudHlwZSA9IDA7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ1Zi5sZW5ndGg7XG59XG5cblBiZi5WYXJpbnQgID0gMDsgLy8gdmFyaW50OiBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuUGJmLkZpeGVkNjQgPSAxOyAvLyA2NC1iaXQ6IGRvdWJsZSwgZml4ZWQ2NCwgc2ZpeGVkNjRcblBiZi5CeXRlcyAgID0gMjsgLy8gbGVuZ3RoLWRlbGltaXRlZDogc3RyaW5nLCBieXRlcywgZW1iZWRkZWQgbWVzc2FnZXMsIHBhY2tlZCByZXBlYXRlZCBmaWVsZHNcblBiZi5GaXhlZDMyID0gNTsgLy8gMzItYml0OiBmbG9hdCwgZml4ZWQzMiwgc2ZpeGVkMzJcblxudmFyIFNISUZUX0xFRlRfMzIgPSAoMSA8PCAxNikgKiAoMSA8PCAxNiksXG4gICAgU0hJRlRfUklHSFRfMzIgPSAxIC8gU0hJRlRfTEVGVF8zMjtcblxuLy8gVGhyZXNob2xkIGNob3NlbiBiYXNlZCBvbiBib3RoIGJlbmNobWFya2luZyBhbmQga25vd2xlZGdlIGFib3V0IGJyb3dzZXIgc3RyaW5nXG4vLyBkYXRhIHN0cnVjdHVyZXMgKHdoaWNoIGN1cnJlbnRseSBzd2l0Y2ggc3RydWN0dXJlIHR5cGVzIGF0IDEyIGJ5dGVzIG9yIG1vcmUpXG52YXIgVEVYVF9ERUNPREVSX01JTl9MRU5HVEggPSAxMjtcbnZhciB1dGY4VGV4dERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IG5ldyBUZXh0RGVjb2RlcigndXRmOCcpO1xuXG5QYmYucHJvdG90eXBlID0ge1xuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0LCBlbmQpIHtcbiAgICAgICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICAgIHRhZyA9IHZhbCA+PiAzLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA9PT0gc3RhcnRQb3MpIHRoaXMuc2tpcCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgICB9LFxuXG4gICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZFVJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZEludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIDY0LWJpdCBpbnQgaGFuZGxpbmcgaXMgYmFzZWQgb24gZ2l0aHViLmNvbS9kcHcvbm9kZS1idWZmZXItbW9yZS1pbnRzIChNSVQtbGljZW5zZWQpXG5cbiAgICByZWFkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcykgKyByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zKSArIHJlYWRJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSBpZWVlNzU0LnJlYWQodGhpcy5idWYsIHRoaXMucG9zLCB0cnVlLCAyMywgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gaWVlZTc1NC5yZWFkKHRoaXMuYnVmLCB0aGlzLnBvcywgdHJ1ZSwgNTIsIDgpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkVmFyaW50OiBmdW5jdGlvbihpc1NpZ25lZCkge1xuICAgICAgICB2YXIgYnVmID0gdGhpcy5idWYsXG4gICAgICAgICAgICB2YWwsIGI7XG5cbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICA9ICBiICYgMHg3ZjsgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsIHw9IChiICYgMHg3ZikgPDwgNzsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsIHw9IChiICYgMHg3ZikgPDwgMTQ7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsIHw9IChiICYgMHg3ZikgPDwgMjE7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvc107ICAgdmFsIHw9IChiICYgMHgwZikgPDwgMjg7XG5cbiAgICAgICAgcmV0dXJuIHJlYWRWYXJpbnRSZW1haW5kZXIodmFsLCBpc1NpZ25lZCwgdGhpcyk7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ2NDogZnVuY3Rpb24oKSB7IC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdjIuMC4xXG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRWYXJpbnQodHJ1ZSk7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3M7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG5cbiAgICAgICAgaWYgKGVuZCAtIHBvcyA+PSBURVhUX0RFQ09ERVJfTUlOX0xFTkdUSCAmJiB1dGY4VGV4dERlY29kZXIpIHtcbiAgICAgICAgICAgIC8vIGxvbmdlciBzdHJpbmdzIGFyZSBmYXN0IHdpdGggdGhlIGJ1aWx0LWluIGJyb3dzZXIgVGV4dERlY29kZXIgQVBJXG4gICAgICAgICAgICByZXR1cm4gcmVhZFV0ZjhUZXh0RGVjb2Rlcih0aGlzLmJ1ZiwgcG9zLCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNob3J0IHN0cmluZ3MgYXJlIGZhc3Qgd2l0aCBvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gICAgICAgIHJldHVybiByZWFkVXRmOCh0aGlzLmJ1ZiwgcG9zLCBlbmQpO1xuICAgIH0sXG5cbiAgICByZWFkQnl0ZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyxcbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9LFxuXG4gICAgLy8gdmVyYm9zZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczsgZG9lc24ndCBhZmZlY3QgZ3ppcHBlZCBzaXplXG5cbiAgICByZWFkUGFja2VkVmFyaW50OiBmdW5jdGlvbihhcnIsIGlzU2lnbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFZhcmludChpc1NpZ25lZCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFZhcmludChpc1NpZ25lZCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNWYXJpbnQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBQYmYuQnl0ZXMpIHJldHVybiBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkQm9vbGVhbjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZERvdWJsZTogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQzMjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkNjQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBQYmYuQnl0ZXMpIHJldHVybiBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBQYmYuQnl0ZXMpIHJldHVybiBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuXG4gICAgc2tpcDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHZhciB0eXBlID0gdmFsICYgMHg3O1xuICAgICAgICBpZiAodHlwZSA9PT0gUGJmLlZhcmludCkgd2hpbGUgKHRoaXMuYnVmW3RoaXMucG9zKytdID4gMHg3Zikge31cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkJ5dGVzKSB0aGlzLnBvcyA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3M7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDMyKSB0aGlzLnBvcyArPSA0O1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQ2NCkgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1VuaW1wbGVtZW50ZWQgdHlwZTogJyArIHR5cGUpO1xuICAgIH0sXG5cbiAgICAvLyA9PT0gV1JJVElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgd3JpdGVUYWc6IGZ1bmN0aW9uKHRhZywgdHlwZSkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KCh0YWcgPDwgMykgfCB0eXBlKTtcbiAgICB9LFxuXG4gICAgcmVhbGxvYzogZnVuY3Rpb24obWluKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8fCAxNjtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoIDwgdGhpcy5wb3MgKyBtaW4pIGxlbmd0aCAqPSAyO1xuXG4gICAgICAgIGlmIChsZW5ndGggIT09IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICAgICAgICAgIGJ1Zi5zZXQodGhpcy5idWYpO1xuICAgICAgICAgICAgdGhpcy5idWYgPSBidWY7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMucG9zO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Zi5zdWJhcnJheSgwLCB0aGlzLmxlbmd0aCk7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQzMjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIE1hdGguZmxvb3IodmFsICogU0hJRlRfUklHSFRfMzIpLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZVNGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCB2YWwgJiAtMSwgdGhpcy5wb3MpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCBNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsIHx8IDA7XG5cbiAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZmZmZiB8fCB2YWwgPCAwKSB7XG4gICAgICAgICAgICB3cml0ZUJpZ1ZhcmludCh2YWwsIHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuXG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gICAgICAgICAgIHZhbCAmIDB4N2YgIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7IGlmICh2YWwgPD0gMHg3ZikgcmV0dXJuO1xuICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+Pj0gNykgJiAweDdmKSB8ICh2YWwgPiAweDdmID8gMHg4MCA6IDApOyBpZiAodmFsIDw9IDB4N2YpIHJldHVybjtcbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj49IDcpICYgMHg3ZikgfCAodmFsID4gMHg3ZiA/IDB4ODAgOiAwKTsgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gICAodmFsID4+PiA3KSAmIDB4N2Y7XG4gICAgfSxcblxuICAgIHdyaXRlU1ZhcmludDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQodmFsIDwgMCA/IC12YWwgKiAyIC0gMSA6IHZhbCAqIDIpO1xuICAgIH0sXG5cbiAgICB3cml0ZUJvb2xlYW46IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odmFsKSk7XG4gICAgfSxcblxuICAgIHdyaXRlU3RyaW5nOiBmdW5jdGlvbihzdHIpIHtcbiAgICAgICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhzdHIubGVuZ3RoICogNCk7XG5cbiAgICAgICAgdGhpcy5wb3MrKzsgLy8gcmVzZXJ2ZSAxIGJ5dGUgZm9yIHNob3J0IHN0cmluZyBsZW5ndGhcblxuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgLy8gd3JpdGUgdGhlIHN0cmluZyBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdGhpcy5wb3MgPSB3cml0ZVV0ZjgodGhpcy5idWYsIHN0ciwgdGhpcy5wb3MpO1xuICAgICAgICB2YXIgbGVuID0gdGhpcy5wb3MgLSBzdGFydFBvcztcblxuICAgICAgICBpZiAobGVuID49IDB4ODApIG1ha2VSb29tRm9yRXh0cmFMZW5ndGgoc3RhcnRQb3MsIGxlbiwgdGhpcyk7XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICBpZWVlNzU0LndyaXRlKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zLCB0cnVlLCAyMywgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICBpZWVlNzU0LndyaXRlKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zLCB0cnVlLCA1MiwgOCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlQnl0ZXM6IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAgICAgICB2YXIgbGVuID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnJlYWxsb2MobGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgdGhpcy5idWZbdGhpcy5wb3MrK10gPSBidWZmZXJbaV07XG4gICAgfSxcblxuICAgIHdyaXRlUmF3TWVzc2FnZTogZnVuY3Rpb24oZm4sIG9iaikge1xuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgbWVzc2FnZSBsZW5ndGhcblxuICAgICAgICAvLyB3cml0ZSB0aGUgbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGZuKG9iaiwgdGhpcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIGlmIChsZW4gPj0gMHg4MCkgbWFrZVJvb21Gb3JFeHRyYUxlbmd0aChzdGFydFBvcywgbGVuLCB0aGlzKTtcblxuICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgbWVzc2FnZSBsZW5ndGggaW4gdGhlIHJlc2VydmVkIHBsYWNlIGFuZCByZXN0b3JlIHRoZSBwb3NpdGlvblxuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zIC0gMTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgfSxcblxuICAgIHdyaXRlTWVzc2FnZTogZnVuY3Rpb24odGFnLCBmbiwgb2JqKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlUmF3TWVzc2FnZShmbiwgb2JqKTtcbiAgICB9LFxuXG4gICAgd3JpdGVQYWNrZWRWYXJpbnQ6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRWYXJpbnQsIGFycik7ICAgfSxcbiAgICB3cml0ZVBhY2tlZFNWYXJpbnQ6ICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkQm9vbGVhbiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRGbG9hdDogICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGbG9hdCwgYXJyKTsgICAgfSxcbiAgICB3cml0ZVBhY2tlZERvdWJsZTogICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQzMiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQzMiwgYXJyKTsgfSxcbiAgICB3cml0ZVBhY2tlZEZpeGVkNjQ6ICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkNjQsIGFycik7IH0sXG5cbiAgICB3cml0ZUJ5dGVzRmllbGQ6IGZ1bmN0aW9uKHRhZywgYnVmZmVyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlQnl0ZXMoYnVmZmVyKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkMzIodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkNjQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVNWYXJpbnQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU3RyaW5nRmllbGQ6IGZ1bmN0aW9uKHRhZywgc3RyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKHN0cik7XG4gICAgfSxcbiAgICB3cml0ZUZsb2F0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGbG9hdCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVEb3VibGVGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZURvdWJsZSh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVCb29sZWFuRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnRGaWVsZCh0YWcsIEJvb2xlYW4odmFsKSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gcmVhZFZhcmludFJlbWFpbmRlcihsLCBzLCBwKSB7XG4gICAgdmFyIGJ1ZiA9IHAuYnVmLFxuICAgICAgICBoLCBiO1xuXG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCAgPSAoYiAmIDB4NzApID4+IDQ7ICBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHg3ZikgPDwgMzsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDdmKSA8PCAxMDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4N2YpIDw8IDE3OyBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHg3ZikgPDwgMjQ7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDAxKSA8PCAzMTsgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrZWRFbmQocGJmKSB7XG4gICAgcmV0dXJuIHBiZi50eXBlID09PSBQYmYuQnl0ZXMgP1xuICAgICAgICBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyA6IHBiZi5wb3MgKyAxO1xufVxuXG5mdW5jdGlvbiB0b051bShsb3csIGhpZ2gsIGlzU2lnbmVkKSB7XG4gICAgaWYgKGlzU2lnbmVkKSB7XG4gICAgICAgIHJldHVybiBoaWdoICogMHgxMDAwMDAwMDAgKyAobG93ID4+PiAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKChoaWdoID4+PiAwKSAqIDB4MTAwMDAwMDAwKSArIChsb3cgPj4+IDApO1xufVxuXG5mdW5jdGlvbiB3cml0ZUJpZ1ZhcmludCh2YWwsIHBiZikge1xuICAgIHZhciBsb3csIGhpZ2g7XG5cbiAgICBpZiAodmFsID49IDApIHtcbiAgICAgICAgbG93ICA9ICh2YWwgJSAweDEwMDAwMDAwMCkgfCAwO1xuICAgICAgICBoaWdoID0gKHZhbCAvIDB4MTAwMDAwMDAwKSB8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG93ICA9IH4oLXZhbCAlIDB4MTAwMDAwMDAwKTtcbiAgICAgICAgaGlnaCA9IH4oLXZhbCAvIDB4MTAwMDAwMDAwKTtcblxuICAgICAgICBpZiAobG93IF4gMHhmZmZmZmZmZikge1xuICAgICAgICAgICAgbG93ID0gKGxvdyArIDEpIHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvdyA9IDA7XG4gICAgICAgICAgICBoaWdoID0gKGhpZ2ggKyAxKSB8IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsID49IDB4MTAwMDAwMDAwMDAwMDAwMDAgfHwgdmFsIDwgLTB4MTAwMDAwMDAwMDAwMDAwMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXZlbiB2YXJpbnQgZG9lc25cXCd0IGZpdCBpbnRvIDEwIGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgcGJmLnJlYWxsb2MoMTApO1xuXG4gICAgd3JpdGVCaWdWYXJpbnRMb3cobG93LCBoaWdoLCBwYmYpO1xuICAgIHdyaXRlQmlnVmFyaW50SGlnaChoaWdoLCBwYmYpO1xufVxuXG5mdW5jdGlvbiB3cml0ZUJpZ1ZhcmludExvdyhsb3csIGhpZ2gsIHBiZikge1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvc10gICA9IGxvdyAmIDB4N2Y7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50SGlnaChoaWdoLCBwYmYpIHtcbiAgICB2YXIgbHNiID0gKGhpZ2ggJiAweDA3KSA8PCA0O1xuXG4gICAgcGJmLmJ1ZltwYmYucG9zKytdIHw9IGxzYiAgICAgICAgIHwgKChoaWdoID4+Pj0gMykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2YgfCAoKGhpZ2ggPj4+PSA3KSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2Y7XG59XG5cbmZ1bmN0aW9uIG1ha2VSb29tRm9yRXh0cmFMZW5ndGgoc3RhcnRQb3MsIGxlbiwgcGJmKSB7XG4gICAgdmFyIGV4dHJhTGVuID1cbiAgICAgICAgbGVuIDw9IDB4M2ZmZiA/IDEgOlxuICAgICAgICBsZW4gPD0gMHgxZmZmZmYgPyAyIDpcbiAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDMgOiBNYXRoLmZsb29yKE1hdGgubG9nKGxlbikgLyAoTWF0aC5MTjIgKiA3KSk7XG5cbiAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgcGJmLnJlYWxsb2MoZXh0cmFMZW4pO1xuICAgIGZvciAodmFyIGkgPSBwYmYucG9zIC0gMTsgaSA+PSBzdGFydFBvczsgaS0tKSBwYmYuYnVmW2kgKyBleHRyYUxlbl0gPSBwYmYuYnVmW2ldO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG5cbi8vIEJ1ZmZlciBjb2RlIGJlbG93IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIsIE1JVC1saWNlbnNlZFxuXG5mdW5jdGlvbiByZWFkVUludDMyKGJ1ZiwgcG9zKSB7XG4gICAgcmV0dXJuICgoYnVmW3Bvc10pIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAxXSA8PCA4KSB8XG4gICAgICAgIChidWZbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgIChidWZbcG9zICsgM10gKiAweDEwMDAwMDApO1xufVxuXG5mdW5jdGlvbiB3cml0ZUludDMyKGJ1ZiwgdmFsLCBwb3MpIHtcbiAgICBidWZbcG9zXSA9IHZhbDtcbiAgICBidWZbcG9zICsgMV0gPSAodmFsID4+PiA4KTtcbiAgICBidWZbcG9zICsgMl0gPSAodmFsID4+PiAxNik7XG4gICAgYnVmW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xufVxuXG5mdW5jdGlvbiByZWFkSW50MzIoYnVmLCBwb3MpIHtcbiAgICByZXR1cm4gKChidWZbcG9zXSkgfFxuICAgICAgICAoYnVmW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAyXSA8PCAxNikpICtcbiAgICAgICAgKGJ1Zltwb3MgKyAzXSA8PCAyNCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRVdGY4KGJ1ZiwgcG9zLCBlbmQpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIGkgPSBwb3M7XG5cbiAgICB3aGlsZSAoaSA8IGVuZCkge1xuICAgICAgICB2YXIgYjAgPSBidWZbaV07XG4gICAgICAgIHZhciBjID0gbnVsbDsgLy8gY29kZXBvaW50XG4gICAgICAgIHZhciBieXRlc1BlclNlcXVlbmNlID1cbiAgICAgICAgICAgIGIwID4gMHhFRiA/IDQgOlxuICAgICAgICAgICAgYjAgPiAweERGID8gMyA6XG4gICAgICAgICAgICBiMCA+IDB4QkYgPyAyIDogMTtcblxuICAgICAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPiBlbmQpIGJyZWFrO1xuXG4gICAgICAgIHZhciBiMSwgYjIsIGIzO1xuXG4gICAgICAgIGlmIChieXRlc1BlclNlcXVlbmNlID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoYjAgPCAweDgwKSB7XG4gICAgICAgICAgICAgICAgYyA9IGIwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDIpIHtcbiAgICAgICAgICAgIGIxID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICAgIGMgPSAoYjAgJiAweDFGKSA8PCAweDYgfCAoYjEgJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChieXRlc1BlclNlcXVlbmNlID09PSAzKSB7XG4gICAgICAgICAgICBiMSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICBiMiA9IGJ1ZltpICsgMl07XG4gICAgICAgICAgICBpZiAoKGIxICYgMHhDMCkgPT09IDB4ODAgJiYgKGIyICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gKGIwICYgMHhGKSA8PCAweEMgfCAoYjEgJiAweDNGKSA8PCAweDYgfCAoYjIgJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDdGRiB8fCAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChieXRlc1BlclNlcXVlbmNlID09PSA0KSB7XG4gICAgICAgICAgICBiMSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICBiMiA9IGJ1ZltpICsgMl07XG4gICAgICAgICAgICBiMyA9IGJ1ZltpICsgM107XG4gICAgICAgICAgICBpZiAoKGIxICYgMHhDMCkgPT09IDB4ODAgJiYgKGIyICYgMHhDMCkgPT09IDB4ODAgJiYgKGIzICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gKGIwICYgMHhGKSA8PCAweDEyIHwgKGIxICYgMHgzRikgPDwgMHhDIHwgKGIyICYgMHgzRikgPDwgMHg2IHwgKGIzICYgMHgzRik7XG4gICAgICAgICAgICAgICAgaWYgKGMgPD0gMHhGRkZGIHx8IGMgPj0gMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGMgPSAweEZGRkQ7XG4gICAgICAgICAgICBieXRlc1BlclNlcXVlbmNlID0gMTtcblxuICAgICAgICB9IGVsc2UgaWYgKGMgPiAweEZGRkYpIHtcbiAgICAgICAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuICAgICAgICAgICAgYyA9IDB4REMwMCB8IGMgJiAweDNGRjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gcmVhZFV0ZjhUZXh0RGVjb2RlcihidWYsIHBvcywgZW5kKSB7XG4gICAgcmV0dXJuIHV0ZjhUZXh0RGVjb2Rlci5kZWNvZGUoYnVmLnN1YmFycmF5KHBvcywgZW5kKSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlVXRmOChidWYsIHN0ciwgcG9zKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOyAvLyBjb2RlIHBvaW50XG5cbiAgICAgICAgaWYgKGMgPiAweEQ3RkYgJiYgYyA8IDB4RTAwMCkge1xuICAgICAgICAgICAgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA8IDB4REMwMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhFRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkY7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJEO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gYztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA+IDB4REJGRiB8fCAoaSArIDEgPT09IHN0ci5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkY7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRDtcbiAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDYgfCAweEMwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHhDIHwgMHhFMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDEyIHwgMHhGMDtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHhDICYgMHgzRiB8IDB4ODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4NiAmIDB4M0YgfCAweDgwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgJiAweDNGIHwgMHg4MDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcG9zO1xufVxuIixudWxsLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBvdHBhY2soYm94ZXMpIHtcblxuICAgIC8vIGNhbGN1bGF0ZSB0b3RhbCBib3ggYXJlYSBhbmQgbWF4aW11bSBib3ggd2lkdGhcbiAgICBsZXQgYXJlYSA9IDA7XG4gICAgbGV0IG1heFdpZHRoID0gMDtcblxuICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICAgIGFyZWEgKz0gYm94LncgKiBib3guaDtcbiAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgYm94LncpO1xuICAgIH1cblxuICAgIC8vIHNvcnQgdGhlIGJveGVzIGZvciBpbnNlcnRpb24gYnkgaGVpZ2h0LCBkZXNjZW5kaW5nXG4gICAgYm94ZXMuc29ydCgoYSwgYikgPT4gYi5oIC0gYS5oKTtcblxuICAgIC8vIGFpbSBmb3IgYSBzcXVhcmlzaCByZXN1bHRpbmcgY29udGFpbmVyLFxuICAgIC8vIHNsaWdodGx5IGFkanVzdGVkIGZvciBzdWItMTAwJSBzcGFjZSB1dGlsaXphdGlvblxuICAgIGNvbnN0IHN0YXJ0V2lkdGggPSBNYXRoLm1heChNYXRoLmNlaWwoTWF0aC5zcXJ0KGFyZWEgLyAwLjk1KSksIG1heFdpZHRoKTtcblxuICAgIC8vIHN0YXJ0IHdpdGggYSBzaW5nbGUgZW1wdHkgc3BhY2UsIHVuYm91bmRlZCBhdCB0aGUgYm90dG9tXG4gICAgY29uc3Qgc3BhY2VzID0gW3t4OiAwLCB5OiAwLCB3OiBzdGFydFdpZHRoLCBoOiBJbmZpbml0eX1dO1xuXG4gICAgbGV0IHdpZHRoID0gMDtcbiAgICBsZXQgaGVpZ2h0ID0gMDtcblxuICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICAgIC8vIGxvb2sgdGhyb3VnaCBzcGFjZXMgYmFja3dhcmRzIHNvIHRoYXQgd2UgY2hlY2sgc21hbGxlciBzcGFjZXMgZmlyc3RcbiAgICAgICAgZm9yIChsZXQgaSA9IHNwYWNlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3Qgc3BhY2UgPSBzcGFjZXNbaV07XG5cbiAgICAgICAgICAgIC8vIGxvb2sgZm9yIGVtcHR5IHNwYWNlcyB0aGF0IGNhbiBhY2NvbW1vZGF0ZSB0aGUgY3VycmVudCBib3hcbiAgICAgICAgICAgIGlmIChib3gudyA+IHNwYWNlLncgfHwgYm94LmggPiBzcGFjZS5oKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gZm91bmQgdGhlIHNwYWNlOyBhZGQgdGhlIGJveCB0byBpdHMgdG9wLWxlZnQgY29ybmVyXG4gICAgICAgICAgICAvLyB8LS0tLS0tLXwtLS0tLS0tfFxuICAgICAgICAgICAgLy8gfCAgYm94ICB8ICAgICAgIHxcbiAgICAgICAgICAgIC8vIHxfX19fX19ffCAgICAgICB8XG4gICAgICAgICAgICAvLyB8ICAgICAgICAgc3BhY2UgfFxuICAgICAgICAgICAgLy8gfF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgIGJveC54ID0gc3BhY2UueDtcbiAgICAgICAgICAgIGJveC55ID0gc3BhY2UueTtcblxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBib3gueSArIGJveC5oKTtcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGJveC54ICsgYm94LncpO1xuXG4gICAgICAgICAgICBpZiAoYm94LncgPT09IHNwYWNlLncgJiYgYm94LmggPT09IHNwYWNlLmgpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBtYXRjaGVzIHRoZSBib3ggZXhhY3RseTsgcmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IHNwYWNlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IHNwYWNlcy5sZW5ndGgpIHNwYWNlc1tpXSA9IGxhc3Q7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm94LmggPT09IHNwYWNlLmgpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBtYXRjaGVzIHRoZSBib3ggaGVpZ2h0OyB1cGRhdGUgaXQgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICAvLyB8LS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18XG4gICAgICAgICAgICAgICAgLy8gfCAgYm94ICB8IHVwZGF0ZWQgc3BhY2UgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19ffF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICBzcGFjZS54ICs9IGJveC53O1xuICAgICAgICAgICAgICAgIHNwYWNlLncgLT0gYm94Lnc7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm94LncgPT09IHNwYWNlLncpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBtYXRjaGVzIHRoZSBib3ggd2lkdGg7IHVwZGF0ZSBpdCBhY2NvcmRpbmdseVxuICAgICAgICAgICAgICAgIC8vIHwtLS0tLS0tLS0tLS0tLS18XG4gICAgICAgICAgICAgICAgLy8gfCAgICAgIGJveCAgICAgIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIC8vIHwgdXBkYXRlZCBzcGFjZSB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICBzcGFjZS55ICs9IGJveC5oO1xuICAgICAgICAgICAgICAgIHNwYWNlLmggLT0gYm94Lmg7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBib3ggc3BsaXRzIHRoZSBzcGFjZSBpbnRvIHR3byBzcGFjZXNcbiAgICAgICAgICAgICAgICAvLyB8LS0tLS0tLXwtLS0tLS0tLS0tLXxcbiAgICAgICAgICAgICAgICAvLyB8ICBib3ggIHwgbmV3IHNwYWNlIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX3xfX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICAvLyB8IHVwZGF0ZWQgc3BhY2UgICAgIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICBzcGFjZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHg6IHNwYWNlLnggKyBib3gudyxcbiAgICAgICAgICAgICAgICAgICAgeTogc3BhY2UueSxcbiAgICAgICAgICAgICAgICAgICAgdzogc3BhY2UudyAtIGJveC53LFxuICAgICAgICAgICAgICAgICAgICBoOiBib3guaFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNwYWNlLnkgKz0gYm94Lmg7XG4gICAgICAgICAgICAgICAgc3BhY2UuaCAtPSBib3guaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdzogd2lkdGgsIC8vIGNvbnRhaW5lciB3aWR0aFxuICAgICAgICBoOiBoZWlnaHQsIC8vIGNvbnRhaW5lciBoZWlnaHRcbiAgICAgICAgZmlsbDogKGFyZWEgLyAod2lkdGggKiBoZWlnaHQpKSB8fCAwIC8vIHNwYWNlIHV0aWxpemF0aW9uXG4gICAgfTtcbn1cbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlueVF1ZXVlIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhID0gW10sIGNvbXBhcmUgPSBkZWZhdWx0Q29tcGFyZSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9ICh0aGlzLmxlbmd0aCA+PiAxKSAtIDE7IGkgPj0gMDsgaS0tKSB0aGlzLl9kb3duKGkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChpdGVtKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgICB0aGlzLl91cCh0aGlzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIHBvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuZGF0YVswXTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gdGhpcy5kYXRhLnBvcCgpO1xuICAgICAgICB0aGlzLmxlbmd0aC0tO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVswXSA9IGJvdHRvbTtcbiAgICAgICAgICAgIHRoaXMuX2Rvd24oMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9wO1xuICAgIH1cblxuICAgIHBlZWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbMF07XG4gICAgfVxuXG4gICAgX3VwKHBvcykge1xuICAgICAgICBjb25zdCB7ZGF0YSwgY29tcGFyZX0gPSB0aGlzO1xuICAgICAgICBjb25zdCBpdGVtID0gZGF0YVtwb3NdO1xuXG4gICAgICAgIHdoaWxlIChwb3MgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSAocG9zIC0gMSkgPj4gMTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkYXRhW3BhcmVudF07XG4gICAgICAgICAgICBpZiAoY29tcGFyZShpdGVtLCBjdXJyZW50KSA+PSAwKSBicmVhaztcbiAgICAgICAgICAgIGRhdGFbcG9zXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICBwb3MgPSBwYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW3Bvc10gPSBpdGVtO1xuICAgIH1cblxuICAgIF9kb3duKHBvcykge1xuICAgICAgICBjb25zdCB7ZGF0YSwgY29tcGFyZX0gPSB0aGlzO1xuICAgICAgICBjb25zdCBoYWxmTGVuZ3RoID0gdGhpcy5sZW5ndGggPj4gMTtcbiAgICAgICAgY29uc3QgaXRlbSA9IGRhdGFbcG9zXTtcblxuICAgICAgICB3aGlsZSAocG9zIDwgaGFsZkxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGxlZnQgPSAocG9zIDw8IDEpICsgMTtcbiAgICAgICAgICAgIGxldCBiZXN0ID0gZGF0YVtsZWZ0XTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gbGVmdCArIDE7XG5cbiAgICAgICAgICAgIGlmIChyaWdodCA8IHRoaXMubGVuZ3RoICYmIGNvbXBhcmUoZGF0YVtyaWdodF0sIGJlc3QpIDwgMCkge1xuICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodDtcbiAgICAgICAgICAgICAgICBiZXN0ID0gZGF0YVtyaWdodF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29tcGFyZShiZXN0LCBpdGVtKSA+PSAwKSBicmVhaztcblxuICAgICAgICAgICAgZGF0YVtwb3NdID0gYmVzdDtcbiAgICAgICAgICAgIHBvcyA9IGxlZnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW3Bvc10gPSBpdGVtO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsImV4cG9ydCB7IGdldFVSTCwgZ2V0VGlsZUJCb3gsIGdldE1lcmNDb29yZHMgfTtcblxuXG4vKipcbiAqIGdldFVSTFxuICpcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgYmFzZVVybCAgQmFzZSB1cmwgb2YgdGhlIFdNUyBzZXJ2ZXJcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgbGF5ZXIgICAgTGF5ZXIgbmFtZVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB4ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICAgICAgICBUaWxlIHpvb21cbiAqIEBwYXJhbSAgICB7T2JqZWN0fSAgW29wdGlvbnNdXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLmZvcm1hdD0naW1hZ2UvcG5nJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMuc2VydmljZT0nV01TJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMudmVyc2lvbj0nMS4xLjEnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5yZXF1ZXN0PSdHZXRNYXAnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5zcnM9J0VQU0c6Mzg1NyddXG4gKiBAcGFyYW0gICAge051bWJlcn0gIFtvcHRpb25zLndpZHRoPScyNTYnXVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICBbb3B0aW9ucy5oZWlnaHQ9JzI1NiddXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIHVybFxuICogQGV4YW1wbGVcbiAqIHZhciBiYXNlVXJsID0gJ2h0dHA6Ly9nZW9kYXRhLnN0YXRlLm5qLnVzL2ltYWdlcnl3bXMvTmF0dXJhbDIwMTUnO1xuICogdmFyIGxheWVyID0gJ05hdHVyYWwyMDE1JztcbiAqIHZhciB1cmwgPSB3aG9vdHMuZ2V0VVJMKGJhc2VVcmwsIGxheWVyLCAxNTQzMDgsIDE5NzE2NywgMTkpO1xuICovXG5mdW5jdGlvbiBnZXRVUkwoYmFzZVVybCwgbGF5ZXIsIHgsIHksIHosIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciB1cmwgPSBiYXNlVXJsICsgJz8nICsgW1xuICAgICAgICAnYmJveD0nICAgICsgZ2V0VGlsZUJCb3goeCwgeSwgeiksXG4gICAgICAgICdmb3JtYXQ9JyAgKyAob3B0aW9ucy5mb3JtYXQgfHwgJ2ltYWdlL3BuZycpLFxuICAgICAgICAnc2VydmljZT0nICsgKG9wdGlvbnMuc2VydmljZSB8fCAnV01TJyksXG4gICAgICAgICd2ZXJzaW9uPScgKyAob3B0aW9ucy52ZXJzaW9uIHx8ICcxLjEuMScpLFxuICAgICAgICAncmVxdWVzdD0nICsgKG9wdGlvbnMucmVxdWVzdCB8fCAnR2V0TWFwJyksXG4gICAgICAgICdzcnM9JyAgICAgKyAob3B0aW9ucy5zcnMgfHwgJ0VQU0c6Mzg1NycpLFxuICAgICAgICAnd2lkdGg9JyAgICsgKG9wdGlvbnMud2lkdGggfHwgMjU2KSxcbiAgICAgICAgJ2hlaWdodD0nICArIChvcHRpb25zLmhlaWdodCB8fCAyNTYpLFxuICAgICAgICAnbGF5ZXJzPScgICsgbGF5ZXJcbiAgICBdLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiB1cmw7XG59XG5cblxuLyoqXG4gKiBnZXRUaWxlQkJveFxuICpcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeCAgVGlsZSBjb29yZGluYXRlIHhcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeSAgVGlsZSBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIFN0cmluZyBvZiB0aGUgYm91bmRpbmcgYm94XG4gKi9cbmZ1bmN0aW9uIGdldFRpbGVCQm94KHgsIHksIHopIHtcbiAgICAvLyBmb3IgR29vZ2xlL09TTSB0aWxlIHNjaGVtZSB3ZSBuZWVkIHRvIGFsdGVyIHRoZSB5XG4gICAgeSA9IChNYXRoLnBvdygyLCB6KSAtIHkgLSAxKTtcblxuICAgIHZhciBtaW4gPSBnZXRNZXJjQ29vcmRzKHggKiAyNTYsIHkgKiAyNTYsIHopLFxuICAgICAgICBtYXggPSBnZXRNZXJjQ29vcmRzKCh4ICsgMSkgKiAyNTYsICh5ICsgMSkgKiAyNTYsIHopO1xuXG4gICAgcmV0dXJuIG1pblswXSArICcsJyArIG1pblsxXSArICcsJyArIG1heFswXSArICcsJyArIG1heFsxXTtcbn1cblxuXG4vKipcbiAqIGdldE1lcmNDb29yZHNcbiAqXG4gKiBAcGFyYW0gICAge051bWJlcn0gIHggIFBpeGVsIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICBQaXhlbCBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge0FycmF5fSAgIFt4LCB5XVxuICovXG5mdW5jdGlvbiBnZXRNZXJjQ29vcmRzKHgsIHksIHopIHtcbiAgICB2YXIgcmVzb2x1dGlvbiA9ICgyICogTWF0aC5QSSAqIDYzNzgxMzcgLyAyNTYpIC8gTWF0aC5wb3coMiwgeiksXG4gICAgICAgIG1lcmNfeCA9ICh4ICogcmVzb2x1dGlvbiAtIDIgKiBNYXRoLlBJICAqIDYzNzgxMzcgLyAyLjApLFxuICAgICAgICBtZXJjX3kgPSAoeSAqIHJlc29sdXRpb24gLSAyICogTWF0aC5QSSAgKiA2Mzc4MTM3IC8gMi4wKTtcblxuICAgIHJldHVybiBbbWVyY194LCBtZXJjX3ldO1xufVxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCJcbm1vZHVsZS5leHBvcnRzID0gcmV3aW5kO1xuXG5mdW5jdGlvbiByZXdpbmQoZ2osIG91dGVyKSB7XG4gICAgdmFyIHR5cGUgPSBnaiAmJiBnai50eXBlLCBpO1xuXG4gICAgaWYgKHR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdqLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSByZXdpbmQoZ2ouZmVhdHVyZXNbaV0sIG91dGVyKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdqLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHJld2luZChnai5nZW9tZXRyaWVzW2ldLCBvdXRlcik7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICByZXdpbmQoZ2ouZ2VvbWV0cnksIG91dGVyKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIHJld2luZFJpbmdzKGdqLmNvb3JkaW5hdGVzLCBvdXRlcik7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnai5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgcmV3aW5kUmluZ3MoZ2ouY29vcmRpbmF0ZXNbaV0sIG91dGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2o7XG59XG5cbmZ1bmN0aW9uIHJld2luZFJpbmdzKHJpbmdzLCBvdXRlcikge1xuICAgIGlmIChyaW5ncy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIHJld2luZFJpbmcocmluZ3NbMF0sIG91dGVyKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJld2luZFJpbmcocmluZ3NbaV0sICFvdXRlcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZXdpbmRSaW5nKHJpbmcsIGRpcikge1xuICAgIHZhciBhcmVhID0gMCwgZXJyID0gMDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIHZhciBrID0gKHJpbmdbaV1bMF0gLSByaW5nW2pdWzBdKSAqIChyaW5nW2pdWzFdICsgcmluZ1tpXVsxXSk7XG4gICAgICAgIHZhciBtID0gYXJlYSArIGs7XG4gICAgICAgIGVyciArPSBNYXRoLmFicyhhcmVhKSA+PSBNYXRoLmFicyhrKSA/IGFyZWEgLSBtICsgayA6IGsgLSBtICsgYXJlYTtcbiAgICAgICAgYXJlYSA9IG07XG4gICAgfVxuICAgIGlmIChhcmVhICsgZXJyID49IDAgIT09ICEhZGlyKSByaW5nLnJldmVyc2UoKTtcbn1cbiIsbnVsbCwiJ3VzZSBzdHJpY3QnXG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKVxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnQG1hcGJveC92ZWN0b3ItdGlsZScpLlZlY3RvclRpbGVGZWF0dXJlXG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldyYXBwZXJcblxuLy8gY29uZm9ybSB0byB2ZWN0b3J0aWxlIGFwaVxuZnVuY3Rpb24gR2VvSlNPTldyYXBwZXIgKGZlYXR1cmVzLCBvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzXG4gIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoXG59XG5cbkdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24gKGkpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLmZlYXR1cmVzW2ldLCB0aGlzLm9wdGlvbnMuZXh0ZW50KVxufVxuXG5mdW5jdGlvbiBGZWF0dXJlV3JhcHBlciAoZmVhdHVyZSwgZXh0ZW50KSB7XG4gIHRoaXMuaWQgPSB0eXBlb2YgZmVhdHVyZS5pZCA9PT0gJ251bWJlcicgPyBmZWF0dXJlLmlkIDogdW5kZWZpbmVkXG4gIHRoaXMudHlwZSA9IGZlYXR1cmUudHlwZVxuICB0aGlzLnJhd0dlb21ldHJ5ID0gZmVhdHVyZS50eXBlID09PSAxID8gW2ZlYXR1cmUuZ2VvbWV0cnldIDogZmVhdHVyZS5nZW9tZXRyeVxuICB0aGlzLnByb3BlcnRpZXMgPSBmZWF0dXJlLnRhZ3NcbiAgdGhpcy5leHRlbnQgPSBleHRlbnQgfHwgNDA5NlxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmluZ3MgPSB0aGlzLnJhd0dlb21ldHJ5XG4gIHRoaXMuZ2VvbWV0cnkgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG4gICAgdmFyIG5ld1JpbmcgPSBbXVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChyaW5nW2pdWzBdLCByaW5nW2pdWzFdKSlcbiAgICB9XG4gICAgdGhpcy5nZW9tZXRyeS5wdXNoKG5ld1JpbmcpXG4gIH1cbiAgcmV0dXJuIHRoaXMuZ2VvbWV0cnlcbn1cblxuRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5nZW9tZXRyeSkgdGhpcy5sb2FkR2VvbWV0cnkoKVxuXG4gIHZhciByaW5ncyA9IHRoaXMuZ2VvbWV0cnlcbiAgdmFyIHgxID0gSW5maW5pdHlcbiAgdmFyIHgyID0gLUluZmluaXR5XG4gIHZhciB5MSA9IEluZmluaXR5XG4gIHZhciB5MiA9IC1JbmZpbml0eVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBjb29yZCA9IHJpbmdbal1cblxuICAgICAgeDEgPSBNYXRoLm1pbih4MSwgY29vcmQueClcbiAgICAgIHgyID0gTWF0aC5tYXgoeDIsIGNvb3JkLngpXG4gICAgICB5MSA9IE1hdGgubWluKHkxLCBjb29yZC55KVxuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY29vcmQueSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXVxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUudG9HZW9KU09OID0gVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTlxuIiwidmFyIFBiZiA9IHJlcXVpcmUoJ3BiZicpXG52YXIgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2xpYi9nZW9qc29uX3dyYXBwZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb21WZWN0b3JUaWxlSnNcbm1vZHVsZS5leHBvcnRzLmZyb21WZWN0b3JUaWxlSnMgPSBmcm9tVmVjdG9yVGlsZUpzXG5tb2R1bGUuZXhwb3J0cy5mcm9tR2VvanNvblZ0ID0gZnJvbUdlb2pzb25WdFxubW9kdWxlLmV4cG9ydHMuR2VvSlNPTldyYXBwZXIgPSBHZW9KU09OV3JhcHBlclxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZlY3Rvci10aWxlLWpzLWNyZWF0ZWQgdGlsZSB0byBwYmZcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGlsZVxuICogQHJldHVybiB7QnVmZmVyfSB1bmNvbXByZXNzZWQsIHBiZi1zZXJpYWxpemVkIHRpbGUgZGF0YVxuICovXG5mdW5jdGlvbiBmcm9tVmVjdG9yVGlsZUpzICh0aWxlKSB7XG4gIHZhciBvdXQgPSBuZXcgUGJmKClcbiAgd3JpdGVUaWxlKHRpbGUsIG91dClcbiAgcmV0dXJuIG91dC5maW5pc2goKVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgYSBnZW9qc29uLXZ0LWNyZWF0ZWQgdGlsZSB0byBwYmYuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGxheWVycyAtIEFuIG9iamVjdCBtYXBwaW5nIGxheWVyIG5hbWVzIHRvIGdlb2pzb24tdnQtY3JlYXRlZCB2ZWN0b3IgdGlsZSBvYmplY3RzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIHZlY3Rvci10aWxlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBhbmQgZXh0ZW50IHRoYXQgd2VyZSB1c2VkIHRvIGNyZWF0ZSBgbGF5ZXJzYC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52ZXJzaW9uPTFdIC0gVmVyc2lvbiBvZiB2ZWN0b3ItdGlsZSBzcGVjIHVzZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5leHRlbnQ9NDA5Nl0gLSBFeHRlbnQgb2YgdGhlIHZlY3RvciB0aWxlXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IHVuY29tcHJlc3NlZCwgcGJmLXNlcmlhbGl6ZWQgdGlsZSBkYXRhXG4gKi9cbmZ1bmN0aW9uIGZyb21HZW9qc29uVnQgKGxheWVycywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgbCA9IHt9XG4gIGZvciAodmFyIGsgaW4gbGF5ZXJzKSB7XG4gICAgbFtrXSA9IG5ldyBHZW9KU09OV3JhcHBlcihsYXllcnNba10uZmVhdHVyZXMsIG9wdGlvbnMpXG4gICAgbFtrXS5uYW1lID0ga1xuICAgIGxba10udmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvblxuICAgIGxba10uZXh0ZW50ID0gb3B0aW9ucy5leHRlbnRcbiAgfVxuICByZXR1cm4gZnJvbVZlY3RvclRpbGVKcyh7IGxheWVyczogbCB9KVxufVxuXG5mdW5jdGlvbiB3cml0ZVRpbGUgKHRpbGUsIHBiZikge1xuICBmb3IgKHZhciBrZXkgaW4gdGlsZS5sYXllcnMpIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDMsIHdyaXRlTGF5ZXIsIHRpbGUubGF5ZXJzW2tleV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVMYXllciAobGF5ZXIsIHBiZikge1xuICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxNSwgbGF5ZXIudmVyc2lvbiB8fCAxKVxuICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCBsYXllci5uYW1lIHx8ICcnKVxuICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCBsYXllci5leHRlbnQgfHwgNDA5NilcblxuICB2YXIgaVxuICB2YXIgY29udGV4dCA9IHtcbiAgICBrZXlzOiBbXSxcbiAgICB2YWx1ZXM6IFtdLFxuICAgIGtleWNhY2hlOiB7fSxcbiAgICB2YWx1ZWNhY2hlOiB7fVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29udGV4dC5mZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShpKVxuICAgIHBiZi53cml0ZU1lc3NhZ2UoMiwgd3JpdGVGZWF0dXJlLCBjb250ZXh0KVxuICB9XG5cbiAgdmFyIGtleXMgPSBjb250ZXh0LmtleXNcbiAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgzLCBrZXlzW2ldKVxuICB9XG5cbiAgdmFyIHZhbHVlcyA9IGNvbnRleHQudmFsdWVzXG4gIGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDQsIHdyaXRlVmFsdWUsIHZhbHVlc1tpXSlcbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUZlYXR1cmUgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuXG4gIGlmIChmZWF0dXJlLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxLCBmZWF0dXJlLmlkKVxuICB9XG5cbiAgcGJmLndyaXRlTWVzc2FnZSgyLCB3cml0ZVByb3BlcnRpZXMsIGNvbnRleHQpXG4gIHBiZi53cml0ZVZhcmludEZpZWxkKDMsIGZlYXR1cmUudHlwZSlcbiAgcGJmLndyaXRlTWVzc2FnZSg0LCB3cml0ZUdlb21ldHJ5LCBmZWF0dXJlKVxufVxuXG5mdW5jdGlvbiB3cml0ZVByb3BlcnRpZXMgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuICB2YXIga2V5cyA9IGNvbnRleHQua2V5c1xuICB2YXIgdmFsdWVzID0gY29udGV4dC52YWx1ZXNcbiAgdmFyIGtleWNhY2hlID0gY29udGV4dC5rZXljYWNoZVxuICB2YXIgdmFsdWVjYWNoZSA9IGNvbnRleHQudmFsdWVjYWNoZVxuXG4gIGZvciAodmFyIGtleSBpbiBmZWF0dXJlLnByb3BlcnRpZXMpIHtcbiAgICB2YXIgdmFsdWUgPSBmZWF0dXJlLnByb3BlcnRpZXNba2V5XVxuXG4gICAgdmFyIGtleUluZGV4ID0ga2V5Y2FjaGVba2V5XVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgY29udGludWUgLy8gZG9uJ3QgZW5jb2RlIG51bGwgdmFsdWUgcHJvcGVydGllc1xuXG4gICAgaWYgKHR5cGVvZiBrZXlJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGtleXMucHVzaChrZXkpXG4gICAgICBrZXlJbmRleCA9IGtleXMubGVuZ3RoIC0gMVxuICAgICAga2V5Y2FjaGVba2V5XSA9IGtleUluZGV4XG4gICAgfVxuICAgIHBiZi53cml0ZVZhcmludChrZXlJbmRleClcblxuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdib29sZWFuJyAmJiB0eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICB9XG4gICAgdmFyIHZhbHVlS2V5ID0gdHlwZSArICc6JyArIHZhbHVlXG4gICAgdmFyIHZhbHVlSW5kZXggPSB2YWx1ZWNhY2hlW3ZhbHVlS2V5XVxuICAgIGlmICh0eXBlb2YgdmFsdWVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKVxuICAgICAgdmFsdWVJbmRleCA9IHZhbHVlcy5sZW5ndGggLSAxXG4gICAgICB2YWx1ZWNhY2hlW3ZhbHVlS2V5XSA9IHZhbHVlSW5kZXhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KHZhbHVlSW5kZXgpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWFuZCAoY21kLCBsZW5ndGgpIHtcbiAgcmV0dXJuIChsZW5ndGggPDwgMykgKyAoY21kICYgMHg3KVxufVxuXG5mdW5jdGlvbiB6aWd6YWcgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAxKSBeIChudW0gPj4gMzEpXG59XG5cbmZ1bmN0aW9uIHdyaXRlR2VvbWV0cnkgKGZlYXR1cmUsIHBiZikge1xuICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmxvYWRHZW9tZXRyeSgpXG4gIHZhciB0eXBlID0gZmVhdHVyZS50eXBlXG4gIHZhciB4ID0gMFxuICB2YXIgeSA9IDBcbiAgdmFyIHJpbmdzID0gZ2VvbWV0cnkubGVuZ3RoXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3M7IHIrKykge1xuICAgIHZhciByaW5nID0gZ2VvbWV0cnlbcl1cbiAgICB2YXIgY291bnQgPSAxXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgIGNvdW50ID0gcmluZy5sZW5ndGhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMSwgY291bnQpKSAvLyBtb3ZldG9cbiAgICAvLyBkbyBub3Qgd3JpdGUgcG9seWdvbiBjbG9zaW5nIHBhdGggYXMgbGluZXRvXG4gICAgdmFyIGxpbmVDb3VudCA9IHR5cGUgPT09IDMgPyByaW5nLmxlbmd0aCAtIDEgOiByaW5nLmxlbmd0aFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHtcbiAgICAgIGlmIChpID09PSAxICYmIHR5cGUgIT09IDEpIHtcbiAgICAgICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMiwgbGluZUNvdW50IC0gMSkpIC8vIGxpbmV0b1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gcmluZ1tpXS54IC0geFxuICAgICAgdmFyIGR5ID0gcmluZ1tpXS55IC0geVxuICAgICAgcGJmLndyaXRlVmFyaW50KHppZ3phZyhkeCkpXG4gICAgICBwYmYud3JpdGVWYXJpbnQoemlnemFnKGR5KSlcbiAgICAgIHggKz0gZHhcbiAgICAgIHkgKz0gZHlcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IDMpIHtcbiAgICAgIHBiZi53cml0ZVZhcmludChjb21tYW5kKDcsIDEpKSAvLyBjbG9zZXBhdGhcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVWYWx1ZSAodmFsdWUsIHBiZikge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCB2YWx1ZSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICBwYmYud3JpdGVCb29sZWFuRmllbGQoNywgdmFsdWUpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodmFsdWUgJSAxICE9PSAwKSB7XG4gICAgICBwYmYud3JpdGVEb3VibGVGaWVsZCgzLCB2YWx1ZSlcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgcGJmLndyaXRlU1ZhcmludEZpZWxkKDYsIHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgcmlnaHQsIGRlcHRoKSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA8PSBub2RlU2l6ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbSA9IChsZWZ0ICsgcmlnaHQpID4+IDE7XG5cbiAgICBzZWxlY3QoaWRzLCBjb29yZHMsIG0sIGxlZnQsIHJpZ2h0LCBkZXB0aCAlIDIpO1xuXG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgbSAtIDEsIGRlcHRoICsgMSk7XG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbSArIDEsIHJpZ2h0LCBkZXB0aCArIDEpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3QoaWRzLCBjb29yZHMsIGssIGxlZnQsIHJpZ2h0LCBpbmMpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICAgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHNlbGVjdChpZHMsIGNvb3JkcywgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGluYyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ID0gY29vcmRzWzIgKiBrICsgaW5jXTtcbiAgICAgICAgbGV0IGkgPSBsZWZ0O1xuICAgICAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvb3Jkc1syICogcmlnaHQgKyBpbmNdID4gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb29yZHNbMiAqIGkgKyBpbmNdIDwgdCkgaSsrO1xuICAgICAgICAgICAgd2hpbGUgKGNvb3Jkc1syICogaiArIGluY10gPiB0KSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29vcmRzWzIgKiBsZWZ0ICsgaW5jXSA9PT0gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwSXRlbShpZHMsIGNvb3JkcywgaSwgaikge1xuICAgIHN3YXAoaWRzLCBpLCBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGksIDIgKiBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGkgKyAxLCAyICogaiArIDEpO1xufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIGNvbnN0IHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShpZHMsIGNvb3JkcywgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgbm9kZVNpemUpIHtcbiAgICBjb25zdCBzdGFjayA9IFswLCBpZHMubGVuZ3RoIC0gMSwgMF07XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHgsIHk7XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGF4aXMgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbm9kZVNpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgICAgICB4ID0gY29vcmRzWzIgKiBpXTtcbiAgICAgICAgICAgICAgICB5ID0gY29vcmRzWzIgKiBpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKHggPj0gbWluWCAmJiB4IDw9IG1heFggJiYgeSA+PSBtaW5ZICYmIHkgPD0gbWF4WSkgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmICh4ID49IG1pblggJiYgeCA8PSBtYXhYICYmIHkgPj0gbWluWSAmJiB5IDw9IG1heFkpIHJlc3VsdC5wdXNoKGlkc1ttXSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEF4aXMgPSAoYXhpcyArIDEpICUgMjtcblxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IG1pblggPD0geCA6IG1pblkgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBtYXhYID49IHggOiBtYXhZID49IHkpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSArIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChyaWdodCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdpdGhpbihpZHMsIGNvb3JkcywgcXgsIHF5LCByLCBub2RlU2l6ZSkge1xuICAgIGNvbnN0IHN0YWNrID0gWzAsIGlkcy5sZW5ndGggLSAxLCAwXTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCByMiA9IHIgKiByO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBheGlzID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG5vZGVTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNxRGlzdChjb29yZHNbMiAqIGldLCBjb29yZHNbMiAqIGkgKyAxXSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICBjb25zdCB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgY29uc3QgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmIChzcURpc3QoeCwgeSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW21dKTtcblxuICAgICAgICBjb25zdCBuZXh0QXhpcyA9IChheGlzICsgMSkgJSAyO1xuXG4gICAgICAgIGlmIChheGlzID09PSAwID8gcXggLSByIDw9IHggOiBxeSAtIHIgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBxeCArIHIgPj0geCA6IHF5ICsgciA+PSB5KSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG0gKyAxKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gocmlnaHQpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzcURpc3QoYXgsIGF5LCBieCwgYnkpIHtcbiAgICBjb25zdCBkeCA9IGF4IC0gYng7XG4gICAgY29uc3QgZHkgPSBheSAtIGJ5O1xuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cbiIsIlxuaW1wb3J0IHNvcnQgZnJvbSAnLi9zb3J0JztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcbmltcG9ydCB3aXRoaW4gZnJvbSAnLi93aXRoaW4nO1xuXG5jb25zdCBkZWZhdWx0R2V0WCA9IHAgPT4gcFswXTtcbmNvbnN0IGRlZmF1bHRHZXRZID0gcCA9PiBwWzFdO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBLREJ1c2gge1xuICAgIGNvbnN0cnVjdG9yKHBvaW50cywgZ2V0WCA9IGRlZmF1bHRHZXRYLCBnZXRZID0gZGVmYXVsdEdldFksIG5vZGVTaXplID0gNjQsIEFycmF5VHlwZSA9IEZsb2F0NjRBcnJheSkge1xuICAgICAgICB0aGlzLm5vZGVTaXplID0gbm9kZVNpemU7XG4gICAgICAgIHRoaXMucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgICAgIGNvbnN0IEluZGV4QXJyYXlUeXBlID0gcG9pbnRzLmxlbmd0aCA8IDY1NTM2ID8gVWludDE2QXJyYXkgOiBVaW50MzJBcnJheTtcblxuICAgICAgICBjb25zdCBpZHMgPSB0aGlzLmlkcyA9IG5ldyBJbmRleEFycmF5VHlwZShwb2ludHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHMgPSBuZXcgQXJyYXlUeXBlKHBvaW50cy5sZW5ndGggKiAyKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWRzW2ldID0gaTtcbiAgICAgICAgICAgIGNvb3Jkc1syICogaV0gPSBnZXRYKHBvaW50c1tpXSk7XG4gICAgICAgICAgICBjb29yZHNbMiAqIGkgKyAxXSA9IGdldFkocG9pbnRzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvcnQoaWRzLCBjb29yZHMsIG5vZGVTaXplLCAwLCBpZHMubGVuZ3RoIC0gMSwgMCk7XG4gICAgfVxuXG4gICAgcmFuZ2UobWluWCwgbWluWSwgbWF4WCwgbWF4WSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UodGhpcy5pZHMsIHRoaXMuY29vcmRzLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB0aGlzLm5vZGVTaXplKTtcbiAgICB9XG5cbiAgICB3aXRoaW4oeCwgeSwgcikge1xuICAgICAgICByZXR1cm4gd2l0aGluKHRoaXMuaWRzLCB0aGlzLmNvb3JkcywgeCwgeSwgciwgdGhpcy5ub2RlU2l6ZSk7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgS0RCdXNoIGZyb20gJ2tkYnVzaCc7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIG1pblpvb206IDAsICAgLy8gbWluIHpvb20gdG8gZ2VuZXJhdGUgY2x1c3RlcnMgb25cbiAgICBtYXhab29tOiAxNiwgIC8vIG1heCB6b29tIGxldmVsIHRvIGNsdXN0ZXIgdGhlIHBvaW50cyBvblxuICAgIG1pblBvaW50czogMiwgLy8gbWluaW11bSBwb2ludHMgdG8gZm9ybSBhIGNsdXN0ZXJcbiAgICByYWRpdXM6IDQwLCAgIC8vIGNsdXN0ZXIgcmFkaXVzIGluIHBpeGVsc1xuICAgIGV4dGVudDogNTEyLCAgLy8gdGlsZSBleHRlbnQgKHJhZGl1cyBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIGl0KVxuICAgIG5vZGVTaXplOiA2NCwgLy8gc2l6ZSBvZiB0aGUgS0QtdHJlZSBsZWFmIG5vZGUsIGFmZmVjdHMgcGVyZm9ybWFuY2VcbiAgICBsb2c6IGZhbHNlLCAgIC8vIHdoZXRoZXIgdG8gbG9nIHRpbWluZyBpbmZvXG5cbiAgICAvLyB3aGV0aGVyIHRvIGdlbmVyYXRlIG51bWVyaWMgaWRzIGZvciBpbnB1dCBmZWF0dXJlcyAoaW4gdmVjdG9yIHRpbGVzKVxuICAgIGdlbmVyYXRlSWQ6IGZhbHNlLFxuXG4gICAgLy8gYSByZWR1Y2UgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIGN1c3RvbSBjbHVzdGVyIHByb3BlcnRpZXNcbiAgICByZWR1Y2U6IG51bGwsIC8vIChhY2N1bXVsYXRlZCwgcHJvcHMpID0+IHsgYWNjdW11bGF0ZWQuc3VtICs9IHByb3BzLnN1bTsgfVxuXG4gICAgLy8gcHJvcGVydGllcyB0byB1c2UgZm9yIGluZGl2aWR1YWwgcG9pbnRzIHdoZW4gcnVubmluZyB0aGUgcmVkdWNlclxuICAgIG1hcDogcHJvcHMgPT4gcHJvcHMgLy8gcHJvcHMgPT4gKHtzdW06IHByb3BzLm15X3ZhbHVlfSlcbn07XG5cbmNvbnN0IGZyb3VuZCA9IE1hdGguZnJvdW5kIHx8ICh0bXAgPT4gKCh4KSA9PiB7IHRtcFswXSA9ICt4OyByZXR1cm4gdG1wWzBdOyB9KSkobmV3IEZsb2F0MzJBcnJheSgxKSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1cGVyY2x1c3RlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZShkZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnRyZWVzID0gbmV3IEFycmF5KHRoaXMub3B0aW9ucy5tYXhab29tICsgMSk7XG4gICAgfVxuXG4gICAgbG9hZChwb2ludHMpIHtcbiAgICAgICAgY29uc3Qge2xvZywgbWluWm9vbSwgbWF4Wm9vbSwgbm9kZVNpemV9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIGlmIChsb2cpIGNvbnNvbGUudGltZSgndG90YWwgdGltZScpO1xuXG4gICAgICAgIGNvbnN0IHRpbWVySWQgPSBgcHJlcGFyZSAkeyAgcG9pbnRzLmxlbmd0aCAgfSBwb2ludHNgO1xuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWUodGltZXJJZCk7XG5cbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG5cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBjbHVzdGVyIG9iamVjdCBmb3IgZWFjaCBwb2ludCBhbmQgaW5kZXggaW5wdXQgcG9pbnRzIGludG8gYSBLRC10cmVlXG4gICAgICAgIGxldCBjbHVzdGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFwb2ludHNbaV0uZ2VvbWV0cnkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2x1c3RlcnMucHVzaChjcmVhdGVQb2ludENsdXN0ZXIocG9pbnRzW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmVlc1ttYXhab29tICsgMV0gPSBuZXcgS0RCdXNoKGNsdXN0ZXJzLCBnZXRYLCBnZXRZLCBub2RlU2l6ZSwgRmxvYXQzMkFycmF5KTtcblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQodGltZXJJZCk7XG5cbiAgICAgICAgLy8gY2x1c3RlciBwb2ludHMgb24gbWF4IHpvb20sIHRoZW4gY2x1c3RlciB0aGUgcmVzdWx0cyBvbiBwcmV2aW91cyB6b29tLCBldGMuO1xuICAgICAgICAvLyByZXN1bHRzIGluIGEgY2x1c3RlciBoaWVyYXJjaHkgYWNyb3NzIHpvb20gbGV2ZWxzXG4gICAgICAgIGZvciAobGV0IHogPSBtYXhab29tOyB6ID49IG1pblpvb207IHotLSkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gK0RhdGUubm93KCk7XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBzZXQgb2YgY2x1c3RlcnMgZm9yIHRoZSB6b29tIGFuZCBpbmRleCB0aGVtIHdpdGggYSBLRC10cmVlXG4gICAgICAgICAgICBjbHVzdGVycyA9IHRoaXMuX2NsdXN0ZXIoY2x1c3RlcnMsIHopO1xuICAgICAgICAgICAgdGhpcy50cmVlc1t6XSA9IG5ldyBLREJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIG5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xuXG4gICAgICAgICAgICBpZiAobG9nKSBjb25zb2xlLmxvZygneiVkOiAlZCBjbHVzdGVycyBpbiAlZG1zJywgeiwgY2x1c3RlcnMubGVuZ3RoLCArRGF0ZS5ub3coKSAtIG5vdyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQoJ3RvdGFsIHRpbWUnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXRDbHVzdGVycyhiYm94LCB6b29tKSB7XG4gICAgICAgIGxldCBtaW5MbmcgPSAoKGJib3hbMF0gKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MDtcbiAgICAgICAgY29uc3QgbWluTGF0ID0gTWF0aC5tYXgoLTkwLCBNYXRoLm1pbig5MCwgYmJveFsxXSkpO1xuICAgICAgICBsZXQgbWF4TG5nID0gYmJveFsyXSA9PT0gMTgwID8gMTgwIDogKChiYm94WzJdICsgMTgwKSAlIDM2MCArIDM2MCkgJSAzNjAgLSAxODA7XG4gICAgICAgIGNvbnN0IG1heExhdCA9IE1hdGgubWF4KC05MCwgTWF0aC5taW4oOTAsIGJib3hbM10pKTtcblxuICAgICAgICBpZiAoYmJveFsyXSAtIGJib3hbMF0gPj0gMzYwKSB7XG4gICAgICAgICAgICBtaW5MbmcgPSAtMTgwO1xuICAgICAgICAgICAgbWF4TG5nID0gMTgwO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbkxuZyA+IG1heExuZykge1xuICAgICAgICAgICAgY29uc3QgZWFzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoW21pbkxuZywgbWluTGF0LCAxODAsIG1heExhdF0sIHpvb20pO1xuICAgICAgICAgICAgY29uc3Qgd2VzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoWy0xODAsIG1pbkxhdCwgbWF4TG5nLCBtYXhMYXRdLCB6b29tKTtcbiAgICAgICAgICAgIHJldHVybiBlYXN0ZXJuSGVtLmNvbmNhdCh3ZXN0ZXJuSGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnRyZWVzW3RoaXMuX2xpbWl0Wm9vbSh6b29tKV07XG4gICAgICAgIGNvbnN0IGlkcyA9IHRyZWUucmFuZ2UobG5nWChtaW5MbmcpLCBsYXRZKG1heExhdCksIGxuZ1gobWF4TG5nKSwgbGF0WShtaW5MYXQpKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0cmVlLnBvaW50c1tpZF07XG4gICAgICAgICAgICBjbHVzdGVycy5wdXNoKGMubnVtUG9pbnRzID8gZ2V0Q2x1c3RlckpTT04oYykgOiB0aGlzLnBvaW50c1tjLmluZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xuICAgIH1cblxuICAgIGdldENoaWxkcmVuKGNsdXN0ZXJJZCkge1xuICAgICAgICBjb25zdCBvcmlnaW5JZCA9IHRoaXMuX2dldE9yaWdpbklkKGNsdXN0ZXJJZCk7XG4gICAgICAgIGNvbnN0IG9yaWdpblpvb20gPSB0aGlzLl9nZXRPcmlnaW5ab29tKGNsdXN0ZXJJZCk7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gJ05vIGNsdXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLic7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRyZWVzW29yaWdpblpvb21dO1xuICAgICAgICBpZiAoIWluZGV4KSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IGluZGV4LnBvaW50c1tvcmlnaW5JZF07XG4gICAgICAgIGlmICghb3JpZ2luKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLm9wdGlvbnMucmFkaXVzIC8gKHRoaXMub3B0aW9ucy5leHRlbnQgKiBNYXRoLnBvdygyLCBvcmlnaW5ab29tIC0gMSkpO1xuICAgICAgICBjb25zdCBpZHMgPSBpbmRleC53aXRoaW4ob3JpZ2luLngsIG9yaWdpbi55LCByKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbmRleC5wb2ludHNbaWRdO1xuICAgICAgICAgICAgaWYgKGMucGFyZW50SWQgPT09IGNsdXN0ZXJJZCkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYy5udW1Qb2ludHMgPyBnZXRDbHVzdGVySlNPTihjKSA6IHRoaXMucG9pbnRzW2MuaW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cblxuICAgIGdldExlYXZlcyhjbHVzdGVySWQsIGxpbWl0LCBvZmZzZXQpIHtcbiAgICAgICAgbGltaXQgPSBsaW1pdCB8fCAxMDtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgICAgY29uc3QgbGVhdmVzID0gW107XG4gICAgICAgIHRoaXMuX2FwcGVuZExlYXZlcyhsZWF2ZXMsIGNsdXN0ZXJJZCwgbGltaXQsIG9mZnNldCwgMCk7XG5cbiAgICAgICAgcmV0dXJuIGxlYXZlcztcbiAgICB9XG5cbiAgICBnZXRUaWxlKHosIHgsIHkpIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKHopXTtcbiAgICAgICAgY29uc3QgejIgPSBNYXRoLnBvdygyLCB6KTtcbiAgICAgICAgY29uc3Qge2V4dGVudCwgcmFkaXVzfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgcCA9IHJhZGl1cyAvIGV4dGVudDtcbiAgICAgICAgY29uc3QgdG9wID0gKHkgLSBwKSAvIHoyO1xuICAgICAgICBjb25zdCBib3R0b20gPSAoeSArIDEgKyBwKSAvIHoyO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSB7XG4gICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoXG4gICAgICAgICAgICB0cmVlLnJhbmdlKCh4IC0gcCkgLyB6MiwgdG9wLCAoeCArIDEgKyBwKSAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgdHJlZS5wb2ludHMsIHgsIHksIHoyLCB0aWxlKTtcblxuICAgICAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKFxuICAgICAgICAgICAgICAgIHRyZWUucmFuZ2UoMSAtIHAgLyB6MiwgdG9wLCAxLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCB6MiwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID09PSB6MiAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICB0cmVlLnJhbmdlKDAsIHRvcCwgcCAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCAtMSwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGUuZmVhdHVyZXMubGVuZ3RoID8gdGlsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20oY2x1c3RlcklkKSB7XG4gICAgICAgIGxldCBleHBhbnNpb25ab29tID0gdGhpcy5fZ2V0T3JpZ2luWm9vbShjbHVzdGVySWQpIC0gMTtcbiAgICAgICAgd2hpbGUgKGV4cGFuc2lvblpvb20gPD0gdGhpcy5vcHRpb25zLm1heFpvb20pIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihjbHVzdGVySWQpO1xuICAgICAgICAgICAgZXhwYW5zaW9uWm9vbSsrO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCAhPT0gMSkgYnJlYWs7XG4gICAgICAgICAgICBjbHVzdGVySWQgPSBjaGlsZHJlblswXS5wcm9wZXJ0aWVzLmNsdXN0ZXJfaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cGFuc2lvblpvb207XG4gICAgfVxuXG4gICAgX2FwcGVuZExlYXZlcyhyZXN1bHQsIGNsdXN0ZXJJZCwgbGltaXQsIG9mZnNldCwgc2tpcHBlZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oY2x1c3RlcklkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGNoaWxkLnByb3BlcnRpZXM7XG5cbiAgICAgICAgICAgIGlmIChwcm9wcyAmJiBwcm9wcy5jbHVzdGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQgKyBwcm9wcy5wb2ludF9jb3VudCA8PSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgd2hvbGUgY2x1c3RlclxuICAgICAgICAgICAgICAgICAgICBza2lwcGVkICs9IHByb3BzLnBvaW50X2NvdW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVudGVyIHRoZSBjbHVzdGVyXG4gICAgICAgICAgICAgICAgICAgIHNraXBwZWQgPSB0aGlzLl9hcHBlbmRMZWF2ZXMocmVzdWx0LCBwcm9wcy5jbHVzdGVyX2lkLCBsaW1pdCwgb2Zmc2V0LCBza2lwcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpdCB0aGUgY2x1c3RlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2tpcHBlZCA8IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgYSBzaW5nbGUgcG9pbnRcbiAgICAgICAgICAgICAgICBza2lwcGVkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNpbmdsZSBwb2ludFxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSBsaW1pdCkgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2tpcHBlZDtcbiAgICB9XG5cbiAgICBfYWRkVGlsZUZlYXR1cmVzKGlkcywgcG9pbnRzLCB4LCB5LCB6MiwgdGlsZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaWRzKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgaXNDbHVzdGVyID0gYy5udW1Qb2ludHM7XG5cbiAgICAgICAgICAgIGxldCB0YWdzLCBweCwgcHk7XG4gICAgICAgICAgICBpZiAoaXNDbHVzdGVyKSB7XG4gICAgICAgICAgICAgICAgdGFncyA9IGdldENsdXN0ZXJQcm9wZXJ0aWVzKGMpO1xuICAgICAgICAgICAgICAgIHB4ID0gYy54O1xuICAgICAgICAgICAgICAgIHB5ID0gYy55O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gdGhpcy5wb2ludHNbYy5pbmRleF07XG4gICAgICAgICAgICAgICAgdGFncyA9IHAucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICBweCA9IGxuZ1gocC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSk7XG4gICAgICAgICAgICAgICAgcHkgPSBsYXRZKHAuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IFtbXG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChweCAqIHoyIC0geCkpLFxuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHRoaXMub3B0aW9ucy5leHRlbnQgKiAocHkgKiB6MiAtIHkpKVxuICAgICAgICAgICAgICAgIF1dLFxuICAgICAgICAgICAgICAgIHRhZ3NcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIGFzc2lnbiBpZFxuICAgICAgICAgICAgbGV0IGlkO1xuICAgICAgICAgICAgaWYgKGlzQ2x1c3Rlcikge1xuICAgICAgICAgICAgICAgIGlkID0gYy5pZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmdlbmVyYXRlSWQpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbGx5IGdlbmVyYXRlIGlkXG4gICAgICAgICAgICAgICAgaWQgPSBjLmluZGV4O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBvaW50c1tjLmluZGV4XS5pZCkge1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgaWQgaWYgYWxyZWFkeSBhc3NpZ25lZFxuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5wb2ludHNbYy5pbmRleF0uaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSBmLmlkID0gaWQ7XG5cbiAgICAgICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaChmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9saW1pdFpvb20oeikge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5vcHRpb25zLm1pblpvb20sIE1hdGgubWluKCt6LCB0aGlzLm9wdGlvbnMubWF4Wm9vbSArIDEpKTtcbiAgICB9XG5cbiAgICBfY2x1c3Rlcihwb2ludHMsIHpvb20pIHtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgY29uc3Qge3JhZGl1cywgZXh0ZW50LCByZWR1Y2UsIG1pblBvaW50c30gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHIgPSByYWRpdXMgLyAoZXh0ZW50ICogTWF0aC5wb3coMiwgem9vbSkpO1xuXG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBlYWNoIHBvaW50XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSB2aXNpdGVkIHRoZSBwb2ludCBhdCB0aGlzIHpvb20gbGV2ZWwsIHNraXAgaXRcbiAgICAgICAgICAgIGlmIChwLnpvb20gPD0gem9vbSkgY29udGludWU7XG4gICAgICAgICAgICBwLnpvb20gPSB6b29tO1xuXG4gICAgICAgICAgICAvLyBmaW5kIGFsbCBuZWFyYnkgcG9pbnRzXG4gICAgICAgICAgICBjb25zdCB0cmVlID0gdGhpcy50cmVlc1t6b29tICsgMV07XG4gICAgICAgICAgICBjb25zdCBuZWlnaGJvcklkcyA9IHRyZWUud2l0aGluKHAueCwgcC55LCByKTtcblxuICAgICAgICAgICAgY29uc3QgbnVtUG9pbnRzT3JpZ2luID0gcC5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgIGxldCBudW1Qb2ludHMgPSBudW1Qb2ludHNPcmlnaW47XG5cbiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcG9pbnRzIGluIGEgcG90ZW50aWFsIGNsdXN0ZXJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmVpZ2hib3JJZCBvZiBuZWlnaGJvcklkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IG5laWdoYm9ycyB0aGF0IGFyZSBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICAgICAgICAgIGlmIChiLnpvb20gPiB6b29tKSBudW1Qb2ludHMgKz0gYi5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2VyZSBuZWlnaGJvcnMgdG8gbWVyZ2UsIGFuZCB0aGVyZSBhcmUgZW5vdWdoIHBvaW50cyB0byBmb3JtIGEgY2x1c3RlclxuICAgICAgICAgICAgaWYgKG51bVBvaW50cyA+IG51bVBvaW50c09yaWdpbiAmJiBudW1Qb2ludHMgPj0gbWluUG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHd4ID0gcC54ICogbnVtUG9pbnRzT3JpZ2luO1xuICAgICAgICAgICAgICAgIGxldCB3eSA9IHAueSAqIG51bVBvaW50c09yaWdpbjtcblxuICAgICAgICAgICAgICAgIGxldCBjbHVzdGVyUHJvcGVydGllcyA9IHJlZHVjZSAmJiBudW1Qb2ludHNPcmlnaW4gPiAxID8gdGhpcy5fbWFwKHAsIHRydWUpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIGVuY29kZSBib3RoIHpvb20gYW5kIHBvaW50IGluZGV4IG9uIHdoaWNoIHRoZSBjbHVzdGVyIG9yaWdpbmF0ZWQgLS0gb2Zmc2V0IGJ5IHRvdGFsIGxlbmd0aCBvZiBmZWF0dXJlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gKGkgPDwgNSkgKyAoem9vbSArIDEpICsgdGhpcy5wb2ludHMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuZWlnaGJvcklkIG9mIG5laWdoYm9ySWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYi56b29tIDw9IHpvb20pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tOyAvLyBzYXZlIHRoZSB6b29tIChzbyBpdCBkb2Vzbid0IGdldCBwcm9jZXNzZWQgdHdpY2UpXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtUG9pbnRzMiA9IGIubnVtUG9pbnRzIHx8IDE7XG4gICAgICAgICAgICAgICAgICAgIHd4ICs9IGIueCAqIG51bVBvaW50czI7IC8vIGFjY3VtdWxhdGUgY29vcmRpbmF0ZXMgZm9yIGNhbGN1bGF0aW5nIHdlaWdodGVkIGNlbnRlclxuICAgICAgICAgICAgICAgICAgICB3eSArPSBiLnkgKiBudW1Qb2ludHMyO1xuXG4gICAgICAgICAgICAgICAgICAgIGIucGFyZW50SWQgPSBpZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVkdWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsdXN0ZXJQcm9wZXJ0aWVzKSBjbHVzdGVyUHJvcGVydGllcyA9IHRoaXMuX21hcChwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZShjbHVzdGVyUHJvcGVydGllcywgdGhpcy5fbWFwKGIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHAucGFyZW50SWQgPSBpZDtcbiAgICAgICAgICAgICAgICBjbHVzdGVycy5wdXNoKGNyZWF0ZUNsdXN0ZXIod3ggLyBudW1Qb2ludHMsIHd5IC8gbnVtUG9pbnRzLCBpZCwgbnVtUG9pbnRzLCBjbHVzdGVyUHJvcGVydGllcykpO1xuXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBsZWZ0IHBvaW50cyBhcyB1bmNsdXN0ZXJlZFxuICAgICAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2gocCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobnVtUG9pbnRzID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5laWdoYm9ySWQgb2YgbmVpZ2hib3JJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLnpvb20gPD0gem9vbSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnMucHVzaChiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbHVzdGVycztcbiAgICB9XG5cbiAgICAvLyBnZXQgaW5kZXggb2YgdGhlIHBvaW50IGZyb20gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxuICAgIF9nZXRPcmlnaW5JZChjbHVzdGVySWQpIHtcbiAgICAgICAgcmV0dXJuIChjbHVzdGVySWQgLSB0aGlzLnBvaW50cy5sZW5ndGgpID4+IDU7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHpvb20gb2YgdGhlIHBvaW50IGZyb20gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxuICAgIF9nZXRPcmlnaW5ab29tKGNsdXN0ZXJJZCkge1xuICAgICAgICByZXR1cm4gKGNsdXN0ZXJJZCAtIHRoaXMucG9pbnRzLmxlbmd0aCkgJSAzMjtcbiAgICB9XG5cbiAgICBfbWFwKHBvaW50LCBjbG9uZSkge1xuICAgICAgICBpZiAocG9pbnQubnVtUG9pbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvbmUgPyBleHRlbmQoe30sIHBvaW50LnByb3BlcnRpZXMpIDogcG9pbnQucHJvcGVydGllcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMucG9pbnRzW3BvaW50LmluZGV4XS5wcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm9wdGlvbnMubWFwKG9yaWdpbmFsKTtcbiAgICAgICAgcmV0dXJuIGNsb25lICYmIHJlc3VsdCA9PT0gb3JpZ2luYWwgPyBleHRlbmQoe30sIHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDbHVzdGVyKHgsIHksIGlkLCBudW1Qb2ludHMsIHByb3BlcnRpZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBmcm91bmQoeCksIC8vIHdlaWdodGVkIGNsdXN0ZXIgY2VudGVyOyByb3VuZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBGbG9hdDMyQXJyYXkgaW5kZXhcbiAgICAgICAgeTogZnJvdW5kKHkpLFxuICAgICAgICB6b29tOiBJbmZpbml0eSwgLy8gdGhlIGxhc3Qgem9vbSB0aGUgY2x1c3RlciB3YXMgcHJvY2Vzc2VkIGF0XG4gICAgICAgIGlkLCAvLyBlbmNvZGVzIGluZGV4IG9mIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY2x1c3RlciBhbmQgaXRzIHpvb20gbGV2ZWxcbiAgICAgICAgcGFyZW50SWQ6IC0xLCAvLyBwYXJlbnQgY2x1c3RlciBpZFxuICAgICAgICBudW1Qb2ludHMsXG4gICAgICAgIHByb3BlcnRpZXNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQb2ludENsdXN0ZXIocCwgaWQpIHtcbiAgICBjb25zdCBbeCwgeV0gPSBwLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGZyb3VuZChsbmdYKHgpKSwgLy8gcHJvamVjdGVkIHBvaW50IGNvb3JkaW5hdGVzXG4gICAgICAgIHk6IGZyb3VuZChsYXRZKHkpKSxcbiAgICAgICAgem9vbTogSW5maW5pdHksIC8vIHRoZSBsYXN0IHpvb20gdGhlIHBvaW50IHdhcyBwcm9jZXNzZWQgYXRcbiAgICAgICAgaW5kZXg6IGlkLCAvLyBpbmRleCBvZiB0aGUgc291cmNlIGZlYXR1cmUgaW4gdGhlIG9yaWdpbmFsIGlucHV0IGFycmF5LFxuICAgICAgICBwYXJlbnRJZDogLTEgLy8gcGFyZW50IGNsdXN0ZXIgaWRcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbHVzdGVySlNPTihjbHVzdGVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICBpZDogY2x1c3Rlci5pZCxcbiAgICAgICAgcHJvcGVydGllczogZ2V0Q2x1c3RlclByb3BlcnRpZXMoY2x1c3RlciksXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFt4TG5nKGNsdXN0ZXIueCksIHlMYXQoY2x1c3Rlci55KV1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldENsdXN0ZXJQcm9wZXJ0aWVzKGNsdXN0ZXIpIHtcbiAgICBjb25zdCBjb3VudCA9IGNsdXN0ZXIubnVtUG9pbnRzO1xuICAgIGNvbnN0IGFiYnJldiA9XG4gICAgICAgIGNvdW50ID49IDEwMDAwID8gYCR7TWF0aC5yb3VuZChjb3VudCAvIDEwMDApICB9a2AgOlxuICAgICAgICBjb3VudCA+PSAxMDAwID8gYCR7TWF0aC5yb3VuZChjb3VudCAvIDEwMCkgLyAxMCAgfWtgIDogY291bnQ7XG4gICAgcmV0dXJuIGV4dGVuZChleHRlbmQoe30sIGNsdXN0ZXIucHJvcGVydGllcyksIHtcbiAgICAgICAgY2x1c3RlcjogdHJ1ZSxcbiAgICAgICAgY2x1c3Rlcl9pZDogY2x1c3Rlci5pZCxcbiAgICAgICAgcG9pbnRfY291bnQ6IGNvdW50LFxuICAgICAgICBwb2ludF9jb3VudF9hYmJyZXZpYXRlZDogYWJicmV2XG4gICAgfSk7XG59XG5cbi8vIGxvbmdpdHVkZS9sYXRpdHVkZSB0byBzcGhlcmljYWwgbWVyY2F0b3IgaW4gWzAuLjFdIHJhbmdlXG5mdW5jdGlvbiBsbmdYKGxuZykge1xuICAgIHJldHVybiBsbmcgLyAzNjAgKyAwLjU7XG59XG5mdW5jdGlvbiBsYXRZKGxhdCkge1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGxhdCAqIE1hdGguUEkgLyAxODApO1xuICAgIGNvbnN0IHkgPSAoMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJKTtcbiAgICByZXR1cm4geSA8IDAgPyAwIDogeSA+IDEgPyAxIDogeTtcbn1cblxuLy8gc3BoZXJpY2FsIG1lcmNhdG9yIHRvIGxvbmdpdHVkZS9sYXRpdHVkZVxuZnVuY3Rpb24geExuZyh4KSB7XG4gICAgcmV0dXJuICh4IC0gMC41KSAqIDM2MDtcbn1cbmZ1bmN0aW9uIHlMYXQoeSkge1xuICAgIGNvbnN0IHkyID0gKDE4MCAtIHkgKiAzNjApICogTWF0aC5QSSAvIDE4MDtcbiAgICByZXR1cm4gMzYwICogTWF0aC5hdGFuKE1hdGguZXhwKHkyKSkgLyBNYXRoLlBJIC0gOTA7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHNyYykgZGVzdFtpZF0gPSBzcmNbaWRdO1xuICAgIHJldHVybiBkZXN0O1xufVxuXG5mdW5jdGlvbiBnZXRYKHApIHtcbiAgICByZXR1cm4gcC54O1xufVxuZnVuY3Rpb24gZ2V0WShwKSB7XG4gICAgcmV0dXJuIHAueTtcbn1cbiIsIlxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgbGFzdCwgc3FUb2xlcmFuY2UpIHtcbiAgICB2YXIgbWF4U3FEaXN0ID0gc3FUb2xlcmFuY2U7XG4gICAgdmFyIG1pZCA9IChsYXN0IC0gZmlyc3QpID4+IDE7XG4gICAgdmFyIG1pblBvc1RvTWlkID0gbGFzdCAtIGZpcnN0O1xuICAgIHZhciBpbmRleDtcblxuICAgIHZhciBheCA9IGNvb3Jkc1tmaXJzdF07XG4gICAgdmFyIGF5ID0gY29vcmRzW2ZpcnN0ICsgMV07XG4gICAgdmFyIGJ4ID0gY29vcmRzW2xhc3RdO1xuICAgIHZhciBieSA9IGNvb3Jkc1tsYXN0ICsgMV07XG5cbiAgICBmb3IgKHZhciBpID0gZmlyc3QgKyAzOyBpIDwgbGFzdDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBkID0gZ2V0U3FTZWdEaXN0KGNvb3Jkc1tpXSwgY29vcmRzW2kgKyAxXSwgYXgsIGF5LCBieCwgYnkpO1xuXG4gICAgICAgIGlmIChkID4gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICBtYXhTcURpc3QgPSBkO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZCA9PT0gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICAvLyBhIHdvcmthcm91bmQgdG8gZW5zdXJlIHdlIGNob29zZSBhIHBpdm90IGNsb3NlIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGxpc3QsXG4gICAgICAgICAgICAvLyByZWR1Y2luZyByZWN1cnNpb24gZGVwdGgsIGZvciBjZXJ0YWluIGRlZ2VuZXJhdGUgaW5wdXRzXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2dlb2pzb24tdnQvaXNzdWVzLzEwNFxuICAgICAgICAgICAgdmFyIHBvc1RvTWlkID0gTWF0aC5hYnMoaSAtIG1pZCk7XG4gICAgICAgICAgICBpZiAocG9zVG9NaWQgPCBtaW5Qb3NUb01pZCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtaW5Qb3NUb01pZCA9IHBvc1RvTWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1heFNxRGlzdCA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgIGlmIChpbmRleCAtIGZpcnN0ID4gMykgc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgaW5kZXgsIHNxVG9sZXJhbmNlKTtcbiAgICAgICAgY29vcmRzW2luZGV4ICsgMl0gPSBtYXhTcURpc3Q7XG4gICAgICAgIGlmIChsYXN0IC0gaW5kZXggPiAzKSBzaW1wbGlmeShjb29yZHMsIGluZGV4LCBsYXN0LCBzcVRvbGVyYW5jZSk7XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHB4LCBweSwgeCwgeSwgYngsIGJ5KSB7XG5cbiAgICB2YXIgZHggPSBieCAtIHg7XG4gICAgdmFyIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUZlYXR1cmUoaWQsIHR5cGUsIGdlb20sIHRhZ3MpIHtcbiAgICB2YXIgZmVhdHVyZSA9IHtcbiAgICAgICAgaWQ6IHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogaWQsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGdlb21ldHJ5OiBnZW9tLFxuICAgICAgICB0YWdzOiB0YWdzLFxuICAgICAgICBtaW5YOiBJbmZpbml0eSxcbiAgICAgICAgbWluWTogSW5maW5pdHksXG4gICAgICAgIG1heFg6IC1JbmZpbml0eSxcbiAgICAgICAgbWF4WTogLUluZmluaXR5XG4gICAgfTtcbiAgICBjYWxjQkJveChmZWF0dXJlKTtcbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuZnVuY3Rpb24gY2FsY0JCb3goZmVhdHVyZSkge1xuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeTtcbiAgICB2YXIgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50JyB8fCB0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb20pO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjYWxjTGluZUJCb3goZmVhdHVyZSwgZ2VvbVtpXSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ2VvbVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNhbGNMaW5lQkJveChmZWF0dXJlLCBnZW9tW2ldW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb20pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgZmVhdHVyZS5taW5YID0gTWF0aC5taW4oZmVhdHVyZS5taW5YLCBnZW9tW2ldKTtcbiAgICAgICAgZmVhdHVyZS5taW5ZID0gTWF0aC5taW4oZmVhdHVyZS5taW5ZLCBnZW9tW2kgKyAxXSk7XG4gICAgICAgIGZlYXR1cmUubWF4WCA9IE1hdGgubWF4KGZlYXR1cmUubWF4WCwgZ2VvbVtpXSk7XG4gICAgICAgIGZlYXR1cmUubWF4WSA9IE1hdGgubWF4KGZlYXR1cmUubWF4WSwgZ2VvbVtpICsgMV0pO1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0IHNpbXBsaWZ5IGZyb20gJy4vc2ltcGxpZnknO1xuaW1wb3J0IGNyZWF0ZUZlYXR1cmUgZnJvbSAnLi9mZWF0dXJlJztcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YS5mZWF0dXJlc1tpXSwgb3B0aW9ucywgaSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEsIG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZ2VvanNvbiwgb3B0aW9ucywgaW5kZXgpIHtcbiAgICBpZiAoIWdlb2pzb24uZ2VvbWV0cnkpIHJldHVybjtcblxuICAgIHZhciBjb29yZHMgPSBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHZhciB0eXBlID0gZ2VvanNvbi5nZW9tZXRyeS50eXBlO1xuICAgIHZhciB0b2xlcmFuY2UgPSBNYXRoLnBvdyhvcHRpb25zLnRvbGVyYW5jZSAvICgoMSA8PCBvcHRpb25zLm1heFpvb20pICogb3B0aW9ucy5leHRlbnQpLCAyKTtcbiAgICB2YXIgZ2VvbWV0cnkgPSBbXTtcbiAgICB2YXIgaWQgPSBnZW9qc29uLmlkO1xuICAgIGlmIChvcHRpb25zLnByb21vdGVJZCkge1xuICAgICAgICBpZCA9IGdlb2pzb24ucHJvcGVydGllc1tvcHRpb25zLnByb21vdGVJZF07XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmdlbmVyYXRlSWQpIHtcbiAgICAgICAgaWQgPSBpbmRleCB8fCAwO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBjb252ZXJ0UG9pbnQoY29vcmRzLCBnZW9tZXRyeSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydFBvaW50KGNvb3Jkc1tpXSwgZ2VvbWV0cnkpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBjb252ZXJ0TGluZShjb29yZHMsIGdlb21ldHJ5LCB0b2xlcmFuY2UsIGZhbHNlKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubGluZU1ldHJpY3MpIHtcbiAgICAgICAgICAgIC8vIGV4cGxvZGUgaW50byBsaW5lc3RyaW5ncyB0byBiZSBhYmxlIHRvIHRyYWNrIG1ldHJpY3NcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnZlcnRMaW5lKGNvb3Jkc1tpXSwgZ2VvbWV0cnksIHRvbGVyYW5jZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZShpZCwgJ0xpbmVTdHJpbmcnLCBnZW9tZXRyeSwgZ2VvanNvbi5wcm9wZXJ0aWVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb252ZXJ0TGluZXMoY29vcmRzLCBnZW9tZXRyeSwgdG9sZXJhbmNlLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnZlcnRMaW5lcyhjb29yZHMsIGdlb21ldHJ5LCB0b2xlcmFuY2UsIHRydWUpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9seWdvbiA9IFtdO1xuICAgICAgICAgICAgY29udmVydExpbmVzKGNvb3Jkc1tpXSwgcG9seWdvbiwgdG9sZXJhbmNlLCB0cnVlKTtcbiAgICAgICAgICAgIGdlb21ldHJ5LnB1c2gocG9seWdvbik7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmdlb21ldHJ5Lmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9qc29uLmdlb21ldHJ5Lmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZ2VvanNvbi5wcm9wZXJ0aWVzXG4gICAgICAgICAgICB9LCBvcHRpb25zLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC4nKTtcbiAgICB9XG5cbiAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZUZlYXR1cmUoaWQsIHR5cGUsIGdlb21ldHJ5LCBnZW9qc29uLnByb3BlcnRpZXMpKTtcbn1cblxuZnVuY3Rpb24gY29udmVydFBvaW50KGNvb3Jkcywgb3V0KSB7XG4gICAgb3V0LnB1c2gocHJvamVjdFgoY29vcmRzWzBdKSk7XG4gICAgb3V0LnB1c2gocHJvamVjdFkoY29vcmRzWzFdKSk7XG4gICAgb3V0LnB1c2goMCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRMaW5lKHJpbmcsIG91dCwgdG9sZXJhbmNlLCBpc1BvbHlnb24pIHtcbiAgICB2YXIgeDAsIHkwO1xuICAgIHZhciBzaXplID0gMDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgeCA9IHByb2plY3RYKHJpbmdbal1bMF0pO1xuICAgICAgICB2YXIgeSA9IHByb2plY3RZKHJpbmdbal1bMV0pO1xuXG4gICAgICAgIG91dC5wdXNoKHgpO1xuICAgICAgICBvdXQucHVzaCh5KTtcbiAgICAgICAgb3V0LnB1c2goMCk7XG5cbiAgICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgICAgICBpZiAoaXNQb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSAoeDAgKiB5IC0geCAqIHkwKSAvIDI7IC8vIGFyZWFcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSBNYXRoLnNxcnQoTWF0aC5wb3coeCAtIHgwLCAyKSArIE1hdGgucG93KHkgLSB5MCwgMikpOyAvLyBsZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB4MCA9IHg7XG4gICAgICAgIHkwID0geTtcbiAgICB9XG5cbiAgICB2YXIgbGFzdCA9IG91dC5sZW5ndGggLSAzO1xuICAgIG91dFsyXSA9IDE7XG4gICAgc2ltcGxpZnkob3V0LCAwLCBsYXN0LCB0b2xlcmFuY2UpO1xuICAgIG91dFtsYXN0ICsgMl0gPSAxO1xuXG4gICAgb3V0LnNpemUgPSBNYXRoLmFicyhzaXplKTtcbiAgICBvdXQuc3RhcnQgPSAwO1xuICAgIG91dC5lbmQgPSBvdXQuc2l6ZTtcbn1cblxuZnVuY3Rpb24gY29udmVydExpbmVzKHJpbmdzLCBvdXQsIHRvbGVyYW5jZSwgaXNQb2x5Z29uKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZ2VvbSA9IFtdO1xuICAgICAgICBjb252ZXJ0TGluZShyaW5nc1tpXSwgZ2VvbSwgdG9sZXJhbmNlLCBpc1BvbHlnb24pO1xuICAgICAgICBvdXQucHVzaChnZW9tKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHByb2plY3RYKHgpIHtcbiAgICByZXR1cm4geCAvIDM2MCArIDAuNTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFkoeSkge1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbih5ICogTWF0aC5QSSAvIDE4MCk7XG4gICAgdmFyIHkyID0gMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJO1xuICAgIHJldHVybiB5MiA8IDAgPyAwIDogeTIgPiAxID8gMSA6IHkyO1xufVxuIiwiXG5pbXBvcnQgY3JlYXRlRmVhdHVyZSBmcm9tICcuL2ZlYXR1cmUnO1xuXG4vKiBjbGlwIGZlYXR1cmVzIGJldHdlZW4gdHdvIGF4aXMtcGFyYWxsZWwgbGluZXM6XG4gKiAgICAgfCAgICAgICAgfFxuICogIF9fX3xfX18gICAgIHwgICAgIC9cbiAqIC8gICB8ICAgXFxfX19ffF9fX18vXG4gKiAgICAgfCAgICAgICAgfFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsaXAoZmVhdHVyZXMsIHNjYWxlLCBrMSwgazIsIGF4aXMsIG1pbkFsbCwgbWF4QWxsLCBvcHRpb25zKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDwgazIpIHJldHVybiBmZWF0dXJlczsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICBlbHNlIGlmIChtYXhBbGwgPCBrMSB8fCBtaW5BbGwgPj0gazIpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldO1xuICAgICAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgICB2YXIgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICB2YXIgbWluID0gYXhpcyA9PT0gMCA/IGZlYXR1cmUubWluWCA6IGZlYXR1cmUubWluWTtcbiAgICAgICAgdmFyIG1heCA9IGF4aXMgPT09IDAgPyBmZWF0dXJlLm1heFggOiBmZWF0dXJlLm1heFk7XG5cbiAgICAgICAgaWYgKG1pbiA+PSBrMSAmJiBtYXggPCBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF4IDwgazEgfHwgbWluID49IGsyKSB7IC8vIHRyaXZpYWwgcmVqZWN0XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXdHZW9tZXRyeSA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgY2xpcFBvaW50cyhnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcyk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIGNsaXBMaW5lKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzLCBmYWxzZSwgb3B0aW9ucy5saW5lTWV0cmljcyk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgY2xpcExpbmVzKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzLCBmYWxzZSk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgIGNsaXBMaW5lcyhnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcywgdHJ1ZSk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBnZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBwb2x5Z29uID0gW107XG4gICAgICAgICAgICAgICAgY2xpcExpbmVzKGdlb21ldHJ5W2pdLCBwb2x5Z29uLCBrMSwgazIsIGF4aXMsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdHZW9tZXRyeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbmVNZXRyaWNzICYmIHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuZXdHZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjbGlwcGVkLnB1c2goY3JlYXRlRmVhdHVyZShmZWF0dXJlLmlkLCB0eXBlLCBuZXdHZW9tZXRyeVtqXSwgZmVhdHVyZS50YWdzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0dlb21ldHJ5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ0xpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeSA9IG5ld0dlb21ldHJ5WzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gbmV3R2VvbWV0cnkubGVuZ3RoID09PSAzID8gJ1BvaW50JyA6ICdNdWx0aVBvaW50JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5pZCwgdHlwZSwgbmV3R2VvbWV0cnksIGZlYXR1cmUudGFncykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWQubGVuZ3RoID8gY2xpcHBlZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNsaXBQb2ludHMoZ2VvbSwgbmV3R2VvbSwgazEsIGsyLCBheGlzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gZ2VvbVtpICsgYXhpc107XG5cbiAgICAgICAgaWYgKGEgPj0gazEgJiYgYSA8PSBrMikge1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKGdlb21baSArIDFdKTtcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChnZW9tW2kgKyAyXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNsaXBMaW5lKGdlb20sIG5ld0dlb20sIGsxLCBrMiwgYXhpcywgaXNQb2x5Z29uLCB0cmFja01ldHJpY3MpIHtcblxuICAgIHZhciBzbGljZSA9IG5ld1NsaWNlKGdlb20pO1xuICAgIHZhciBpbnRlcnNlY3QgPSBheGlzID09PSAwID8gaW50ZXJzZWN0WCA6IGludGVyc2VjdFk7XG4gICAgdmFyIGxlbiA9IGdlb20uc3RhcnQ7XG4gICAgdmFyIHNlZ0xlbiwgdDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGggLSAzOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGF4ID0gZ2VvbVtpXTtcbiAgICAgICAgdmFyIGF5ID0gZ2VvbVtpICsgMV07XG4gICAgICAgIHZhciBheiA9IGdlb21baSArIDJdO1xuICAgICAgICB2YXIgYnggPSBnZW9tW2kgKyAzXTtcbiAgICAgICAgdmFyIGJ5ID0gZ2VvbVtpICsgNF07XG4gICAgICAgIHZhciBhID0gYXhpcyA9PT0gMCA/IGF4IDogYXk7XG4gICAgICAgIHZhciBiID0gYXhpcyA9PT0gMCA/IGJ4IDogYnk7XG4gICAgICAgIHZhciBleGl0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzZWdMZW4gPSBNYXRoLnNxcnQoTWF0aC5wb3coYXggLSBieCwgMikgKyBNYXRoLnBvdyhheSAtIGJ5LCAyKSk7XG5cbiAgICAgICAgaWYgKGEgPCBrMSkge1xuICAgICAgICAgICAgLy8gLS0tfC0tPiAgfCAobGluZSBlbnRlcnMgdGhlIGNsaXAgcmVnaW9uIGZyb20gdGhlIGxlZnQpXG4gICAgICAgICAgICBpZiAoYiA+IGsxKSB7XG4gICAgICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsxKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5zdGFydCA9IGxlbiArIHNlZ0xlbiAqIHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYSA+IGsyKSB7XG4gICAgICAgICAgICAvLyB8ICA8LS18LS0tIChsaW5lIGVudGVycyB0aGUgY2xpcCByZWdpb24gZnJvbSB0aGUgcmlnaHQpXG4gICAgICAgICAgICBpZiAoYiA8IGsyKSB7XG4gICAgICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsyKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5zdGFydCA9IGxlbiArIHNlZ0xlbiAqIHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGRQb2ludChzbGljZSwgYXgsIGF5LCBheik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPCBrMSAmJiBhID49IGsxKSB7XG4gICAgICAgICAgICAvLyA8LS18LS0tICB8IG9yIDwtLXwtLS0tLXwtLS0gKGxpbmUgZXhpdHMgdGhlIGNsaXAgcmVnaW9uIG9uIHRoZSBsZWZ0KVxuICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsxKTtcbiAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPiBrMiAmJiBhIDw9IGsyKSB7XG4gICAgICAgICAgICAvLyB8ICAtLS18LS0+IG9yIC0tLXwtLS0tLXwtLT4gKGxpbmUgZXhpdHMgdGhlIGNsaXAgcmVnaW9uIG9uIHRoZSByaWdodClcbiAgICAgICAgICAgIHQgPSBpbnRlcnNlY3Qoc2xpY2UsIGF4LCBheSwgYngsIGJ5LCBrMik7XG4gICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1BvbHlnb24gJiYgZXhpdGVkKSB7XG4gICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5lbmQgPSBsZW4gKyBzZWdMZW4gKiB0O1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKHNsaWNlKTtcbiAgICAgICAgICAgIHNsaWNlID0gbmV3U2xpY2UoZ2VvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBsZW4gKz0gc2VnTGVuO1xuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgbGFzdCBwb2ludFxuICAgIHZhciBsYXN0ID0gZ2VvbS5sZW5ndGggLSAzO1xuICAgIGF4ID0gZ2VvbVtsYXN0XTtcbiAgICBheSA9IGdlb21bbGFzdCArIDFdO1xuICAgIGF6ID0gZ2VvbVtsYXN0ICsgMl07XG4gICAgYSA9IGF4aXMgPT09IDAgPyBheCA6IGF5O1xuICAgIGlmIChhID49IGsxICYmIGEgPD0gazIpIGFkZFBvaW50KHNsaWNlLCBheCwgYXksIGF6KTtcblxuICAgIC8vIGNsb3NlIHRoZSBwb2x5Z29uIGlmIGl0cyBlbmRwb2ludHMgYXJlIG5vdCB0aGUgc2FtZSBhZnRlciBjbGlwcGluZ1xuICAgIGxhc3QgPSBzbGljZS5sZW5ndGggLSAzO1xuICAgIGlmIChpc1BvbHlnb24gJiYgbGFzdCA+PSAzICYmIChzbGljZVtsYXN0XSAhPT0gc2xpY2VbMF0gfHwgc2xpY2VbbGFzdCArIDFdICE9PSBzbGljZVsxXSkpIHtcbiAgICAgICAgYWRkUG9pbnQoc2xpY2UsIHNsaWNlWzBdLCBzbGljZVsxXSwgc2xpY2VbMl0pO1xuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgZmluYWwgc2xpY2VcbiAgICBpZiAoc2xpY2UubGVuZ3RoKSB7XG4gICAgICAgIG5ld0dlb20ucHVzaChzbGljZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBuZXdTbGljZShsaW5lKSB7XG4gICAgdmFyIHNsaWNlID0gW107XG4gICAgc2xpY2Uuc2l6ZSA9IGxpbmUuc2l6ZTtcbiAgICBzbGljZS5zdGFydCA9IGxpbmUuc3RhcnQ7XG4gICAgc2xpY2UuZW5kID0gbGluZS5lbmQ7XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuXG5mdW5jdGlvbiBjbGlwTGluZXMoZ2VvbSwgbmV3R2VvbSwgazEsIGsyLCBheGlzLCBpc1BvbHlnb24pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2xpcExpbmUoZ2VvbVtpXSwgbmV3R2VvbSwgazEsIGsyLCBheGlzLCBpc1BvbHlnb24sIGZhbHNlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZFBvaW50KG91dCwgeCwgeSwgeikge1xuICAgIG91dC5wdXNoKHgpO1xuICAgIG91dC5wdXNoKHkpO1xuICAgIG91dC5wdXNoKHopO1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RYKG91dCwgYXgsIGF5LCBieCwgYnksIHgpIHtcbiAgICB2YXIgdCA9ICh4IC0gYXgpIC8gKGJ4IC0gYXgpO1xuICAgIG91dC5wdXNoKHgpO1xuICAgIG91dC5wdXNoKGF5ICsgKGJ5IC0gYXkpICogdCk7XG4gICAgb3V0LnB1c2goMSk7XG4gICAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFkob3V0LCBheCwgYXksIGJ4LCBieSwgeSkge1xuICAgIHZhciB0ID0gKHkgLSBheSkgLyAoYnkgLSBheSk7XG4gICAgb3V0LnB1c2goYXggKyAoYnggLSBheCkgKiB0KTtcbiAgICBvdXQucHVzaCh5KTtcbiAgICBvdXQucHVzaCgxKTtcbiAgICByZXR1cm4gdDtcbn1cbiIsIlxuaW1wb3J0IGNsaXAgZnJvbSAnLi9jbGlwJztcbmltcG9ydCBjcmVhdGVGZWF0dXJlIGZyb20gJy4vZmVhdHVyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgYnVmZmVyID0gb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudDtcbiAgICB2YXIgbWVyZ2VkID0gZmVhdHVyZXM7XG4gICAgdmFyIGxlZnQgID0gY2xpcChmZWF0dXJlcywgMSwgLTEgLSBidWZmZXIsIGJ1ZmZlciwgICAgIDAsIC0xLCAyLCBvcHRpb25zKTsgLy8gbGVmdCB3b3JsZCBjb3B5XG4gICAgdmFyIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgMSwgIDEgLSBidWZmZXIsIDIgKyBidWZmZXIsIDAsIC0xLCAyLCBvcHRpb25zKTsgLy8gcmlnaHQgd29ybGQgY29weVxuXG4gICAgaWYgKGxlZnQgfHwgcmlnaHQpIHtcbiAgICAgICAgbWVyZ2VkID0gY2xpcChmZWF0dXJlcywgMSwgLWJ1ZmZlciwgMSArIGJ1ZmZlciwgMCwgLTEsIDIsIG9wdGlvbnMpIHx8IFtdOyAvLyBjZW50ZXIgd29ybGQgY29weVxuXG4gICAgICAgIGlmIChsZWZ0KSBtZXJnZWQgPSBzaGlmdEZlYXR1cmVDb29yZHMobGVmdCwgMSkuY29uY2F0KG1lcmdlZCk7IC8vIG1lcmdlIGxlZnQgaW50byBjZW50ZXJcbiAgICAgICAgaWYgKHJpZ2h0KSBtZXJnZWQgPSBtZXJnZWQuY29uY2F0KHNoaWZ0RmVhdHVyZUNvb3JkcyhyaWdodCwgLTEpKTsgLy8gbWVyZ2UgcmlnaHQgaW50byBjZW50ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBzaGlmdEZlYXR1cmVDb29yZHMoZmVhdHVyZXMsIG9mZnNldCkge1xuICAgIHZhciBuZXdGZWF0dXJlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICB2YXIgbmV3R2VvbWV0cnk7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnIHx8IHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5LCBvZmZzZXQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1BvbHlnb24gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGZlYXR1cmUuZ2VvbWV0cnlbal0ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UG9seWdvbi5wdXNoKHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnlbal1ba10sIG9mZnNldCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKG5ld1BvbHlnb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV3RmVhdHVyZXMucHVzaChjcmVhdGVGZWF0dXJlKGZlYXR1cmUuaWQsIHR5cGUsIG5ld0dlb21ldHJ5LCBmZWF0dXJlLnRhZ3MpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHBvaW50cywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld1BvaW50cyA9IFtdO1xuICAgIG5ld1BvaW50cy5zaXplID0gcG9pbnRzLnNpemU7XG5cbiAgICBpZiAocG9pbnRzLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3UG9pbnRzLnN0YXJ0ID0gcG9pbnRzLnN0YXJ0O1xuICAgICAgICBuZXdQb2ludHMuZW5kID0gcG9pbnRzLmVuZDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBuZXdQb2ludHMucHVzaChwb2ludHNbaV0gKyBvZmZzZXQsIHBvaW50c1tpICsgMV0sIHBvaW50c1tpICsgMl0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UG9pbnRzO1xufVxuIiwiXG4vLyBUcmFuc2Zvcm1zIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIGZlYXR1cmUgaW4gdGhlIGdpdmVuIHRpbGUgZnJvbVxuLy8gbWVyY2F0b3ItcHJvamVjdGVkIHNwYWNlIGludG8gKGV4dGVudCB4IGV4dGVudCkgdGlsZSBzcGFjZS5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUodGlsZSwgZXh0ZW50KSB7XG4gICAgaWYgKHRpbGUudHJhbnNmb3JtZWQpIHJldHVybiB0aWxlO1xuXG4gICAgdmFyIHoyID0gMSA8PCB0aWxlLnosXG4gICAgICAgIHR4ID0gdGlsZS54LFxuICAgICAgICB0eSA9IHRpbGUueSxcbiAgICAgICAgaSwgaiwgaztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gdGlsZS5mZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICBmZWF0dXJlLmdlb21ldHJ5ID0gW107XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaiArPSAyKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5nZW9tZXRyeS5wdXNoKHRyYW5zZm9ybVBvaW50KGdlb21bal0sIGdlb21baiArIDFdLCBleHRlbnQsIHoyLCB0eCwgdHkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZ2VvbVtqXS5sZW5ndGg7IGsgKz0gMikge1xuICAgICAgICAgICAgICAgICAgICByaW5nLnB1c2godHJhbnNmb3JtUG9pbnQoZ2VvbVtqXVtrXSwgZ2VvbVtqXVtrICsgMV0sIGV4dGVudCwgejIsIHR4LCB0eSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnB1c2gocmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aWxlLnRyYW5zZm9ybWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludCh4LCB5LCBleHRlbnQsIHoyLCB0eCwgdHkpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh4ICogejIgLSB0eCkpLFxuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh5ICogejIgLSB0eSkpXTtcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgeiwgdHgsIHR5LCBvcHRpb25zKSB7XG4gICAgdmFyIHRvbGVyYW5jZSA9IHogPT09IG9wdGlvbnMubWF4Wm9vbSA/IDAgOiBvcHRpb25zLnRvbGVyYW5jZSAvICgoMSA8PCB6KSAqIG9wdGlvbnMuZXh0ZW50KTtcbiAgICB2YXIgdGlsZSA9IHtcbiAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgICBudW1Qb2ludHM6IDAsXG4gICAgICAgIG51bVNpbXBsaWZpZWQ6IDAsXG4gICAgICAgIG51bUZlYXR1cmVzOiAwLFxuICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgIHg6IHR4LFxuICAgICAgICB5OiB0eSxcbiAgICAgICAgejogeixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW5YOiAyLFxuICAgICAgICBtaW5ZOiAxLFxuICAgICAgICBtYXhYOiAtMSxcbiAgICAgICAgbWF4WTogMFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aWxlLm51bUZlYXR1cmVzKys7XG4gICAgICAgIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIG1pblggPSBmZWF0dXJlc1tpXS5taW5YO1xuICAgICAgICB2YXIgbWluWSA9IGZlYXR1cmVzW2ldLm1pblk7XG4gICAgICAgIHZhciBtYXhYID0gZmVhdHVyZXNbaV0ubWF4WDtcbiAgICAgICAgdmFyIG1heFkgPSBmZWF0dXJlc1tpXS5tYXhZO1xuXG4gICAgICAgIGlmIChtaW5YIDwgdGlsZS5taW5YKSB0aWxlLm1pblggPSBtaW5YO1xuICAgICAgICBpZiAobWluWSA8IHRpbGUubWluWSkgdGlsZS5taW5ZID0gbWluWTtcbiAgICAgICAgaWYgKG1heFggPiB0aWxlLm1heFgpIHRpbGUubWF4WCA9IG1heFg7XG4gICAgICAgIGlmIChtYXhZID4gdGlsZS5tYXhZKSB0aWxlLm1heFkgPSBtYXhZO1xuICAgIH1cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlLCB0b2xlcmFuY2UsIG9wdGlvbnMpIHtcblxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdO1xuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baSArIDFdKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tLCB0aWxlLCB0b2xlcmFuY2UsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tW2ldLCB0aWxlLCB0b2xlcmFuY2UsIHR5cGUgPT09ICdQb2x5Z29uJywgaSA9PT0gMCk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcblxuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGdlb20ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHZhciBwb2x5Z29uID0gZ2VvbVtrXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBwb2x5Z29uW2ldLCB0aWxlLCB0b2xlcmFuY2UsIHRydWUsIGkgPT09IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsaWZpZWQubGVuZ3RoKSB7XG4gICAgICAgIHZhciB0YWdzID0gZmVhdHVyZS50YWdzIHx8IG51bGw7XG4gICAgICAgIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgJiYgb3B0aW9ucy5saW5lTWV0cmljcykge1xuICAgICAgICAgICAgdGFncyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZlYXR1cmUudGFncykgdGFnc1trZXldID0gZmVhdHVyZS50YWdzW2tleV07XG4gICAgICAgICAgICB0YWdzWydtYXBib3hfY2xpcF9zdGFydCddID0gZ2VvbS5zdGFydCAvIGdlb20uc2l6ZTtcbiAgICAgICAgICAgIHRhZ3NbJ21hcGJveF9jbGlwX2VuZCddID0gZ2VvbS5lbmQgLyBnZW9tLnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRpbGVGZWF0dXJlID0ge1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHNpbXBsaWZpZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpUG9seWdvbicgPyAzIDpcbiAgICAgICAgICAgICAgICB0eXBlID09PSAnTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgPyAyIDogMSxcbiAgICAgICAgICAgIHRhZ3M6IHRhZ3NcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZlYXR1cmUuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRpbGVGZWF0dXJlLmlkID0gZmVhdHVyZS5pZDtcbiAgICAgICAgfVxuICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2godGlsZUZlYXR1cmUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkTGluZShyZXN1bHQsIGdlb20sIHRpbGUsIHRvbGVyYW5jZSwgaXNQb2x5Z29uLCBpc091dGVyKSB7XG4gICAgdmFyIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlO1xuXG4gICAgaWYgKHRvbGVyYW5jZSA+IDAgJiYgKGdlb20uc2l6ZSA8IChpc1BvbHlnb24gPyBzcVRvbGVyYW5jZSA6IHRvbGVyYW5jZSkpKSB7XG4gICAgICAgIHRpbGUubnVtUG9pbnRzICs9IGdlb20ubGVuZ3RoIC8gMztcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByaW5nID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgaWYgKHRvbGVyYW5jZSA9PT0gMCB8fCBnZW9tW2kgKyAyXSA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgICAgIHJpbmcucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHJpbmcucHVzaChnZW9tW2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICB9XG5cbiAgICBpZiAoaXNQb2x5Z29uKSByZXdpbmQocmluZywgaXNPdXRlcik7XG5cbiAgICByZXN1bHQucHVzaChyaW5nKTtcbn1cblxuZnVuY3Rpb24gcmV3aW5kKHJpbmcsIGNsb2Nrd2lzZSkge1xuICAgIHZhciBhcmVhID0gMDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAyOyBpIDwgbGVuOyBqID0gaSwgaSArPSAyKSB7XG4gICAgICAgIGFyZWEgKz0gKHJpbmdbaV0gLSByaW5nW2pdKSAqIChyaW5nW2kgKyAxXSArIHJpbmdbaiArIDFdKTtcbiAgICB9XG4gICAgaWYgKGFyZWEgPiAwID09PSBjbG9ja3dpc2UpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmluZy5sZW5ndGg7IGkgPCBsZW4gLyAyOyBpICs9IDIpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcmluZ1tpXTtcbiAgICAgICAgICAgIHZhciB5ID0gcmluZ1tpICsgMV07XG4gICAgICAgICAgICByaW5nW2ldID0gcmluZ1tsZW4gLSAyIC0gaV07XG4gICAgICAgICAgICByaW5nW2kgKyAxXSA9IHJpbmdbbGVuIC0gMSAtIGldO1xuICAgICAgICAgICAgcmluZ1tsZW4gLSAyIC0gaV0gPSB4O1xuICAgICAgICAgICAgcmluZ1tsZW4gLSAxIC0gaV0gPSB5O1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgY29udmVydCBmcm9tICcuL2NvbnZlcnQnOyAgICAgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG5pbXBvcnQgY2xpcCBmcm9tICcuL2NsaXAnOyAgICAgICAgICAgLy8gc3RyaXBlIGNsaXBwaW5nIGFsZ29yaXRobVxuaW1wb3J0IHdyYXAgZnJvbSAnLi93cmFwJzsgICAgICAgICAgIC8vIGRhdGUgbGluZSBwcm9jZXNzaW5nXG5pbXBvcnQgdHJhbnNmb3JtIGZyb20gJy4vdHJhbnNmb3JtJzsgLy8gY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvblxuaW1wb3J0IGNyZWF0ZVRpbGUgZnJvbSAnLi90aWxlJzsgICAgIC8vIGZpbmFsIHNpbXBsaWZpZWQgdGlsZSBnZW5lcmF0aW9uXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlb2pzb252dChkYXRhLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIEdlb0pTT05WVChkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksIG9wdGlvbnMpO1xuXG4gICAgdmFyIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmIChkZWJ1ZykgY29uc29sZS50aW1lKCdwcmVwcm9jZXNzIGRhdGEnKTtcblxuICAgIGlmIChvcHRpb25zLm1heFpvb20gPCAwIHx8IG9wdGlvbnMubWF4Wm9vbSA+IDI0KSB0aHJvdyBuZXcgRXJyb3IoJ21heFpvb20gc2hvdWxkIGJlIGluIHRoZSAwLTI0IHJhbmdlJyk7XG4gICAgaWYgKG9wdGlvbnMucHJvbW90ZUlkICYmIG9wdGlvbnMuZ2VuZXJhdGVJZCkgdGhyb3cgbmV3IEVycm9yKCdwcm9tb3RlSWQgYW5kIGdlbmVyYXRlSWQgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuJyk7XG5cbiAgICB2YXIgZmVhdHVyZXMgPSBjb252ZXJ0KGRhdGEsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy50aWxlcyA9IHt9O1xuICAgIHRoaXMudGlsZUNvb3JkcyA9IFtdO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgncHJlcHJvY2VzcyBkYXRhJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpbmRleDogbWF4Wm9vbTogJWQsIG1heFBvaW50czogJWQnLCBvcHRpb25zLmluZGV4TWF4Wm9vbSwgb3B0aW9ucy5pbmRleE1heFBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZSgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHt9O1xuICAgICAgICB0aGlzLnRvdGFsID0gMDtcbiAgICB9XG5cbiAgICBmZWF0dXJlcyA9IHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMpO1xuXG4gICAgLy8gc3RhcnQgc2xpY2luZyBmcm9tIHRoZSB0b3AgdGlsZSBkb3duXG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgdGhpcy5zcGxpdFRpbGUoZmVhdHVyZXMsIDAsIDAsIDApO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIGNvbnNvbGUubG9nKCdmZWF0dXJlczogJWQsIHBvaW50czogJWQnLCB0aGlzLnRpbGVzWzBdLm51bUZlYXR1cmVzLCB0aGlzLnRpbGVzWzBdLm51bVBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3RpbGVzIGdlbmVyYXRlZDonLCB0aGlzLnRvdGFsLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSk7XG4gICAgfVxufVxuXG5HZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnMgPSB7XG4gICAgbWF4Wm9vbTogMTQsICAgICAgICAgICAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgaW5kZXhNYXhab29tOiA1LCAgICAgICAgLy8gbWF4IHpvb20gaW4gdGhlIHRpbGUgaW5kZXhcbiAgICBpbmRleE1heFBvaW50czogMTAwMDAwLCAvLyBtYXggbnVtYmVyIG9mIHBvaW50cyBwZXIgdGlsZSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIHRvbGVyYW5jZTogMywgICAgICAgICAgIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgZXh0ZW50OiA0MDk2LCAgICAgICAgICAgLy8gdGlsZSBleHRlbnRcbiAgICBidWZmZXI6IDY0LCAgICAgICAgICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcbiAgICBsaW5lTWV0cmljczogZmFsc2UsICAgICAvLyB3aGV0aGVyIHRvIGNhbGN1bGF0ZSBsaW5lIG1ldHJpY3NcbiAgICBwcm9tb3RlSWQ6IG51bGwsICAgICAgICAvLyBuYW1lIG9mIGEgZmVhdHVyZSBwcm9wZXJ0eSB0byBiZSBwcm9tb3RlZCB0byBmZWF0dXJlLmlkXG4gICAgZ2VuZXJhdGVJZDogZmFsc2UsICAgICAgLy8gd2hldGhlciB0byBnZW5lcmF0ZSBmZWF0dXJlIGlkcy4gQ2Fubm90IGJlIHVzZWQgd2l0aCBwcm9tb3RlSWRcbiAgICBkZWJ1ZzogMCAgICAgICAgICAgICAgICAvLyBsb2dnaW5nIGxldmVsICgwLCAxIG9yIDIpXG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLnNwbGl0VGlsZSA9IGZ1bmN0aW9uIChmZWF0dXJlcywgeiwgeCwgeSwgY3osIGN4LCBjeSkge1xuXG4gICAgdmFyIHN0YWNrID0gW2ZlYXR1cmVzLCB6LCB4LCB5XSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgLy8gYXZvaWQgcmVjdXJzaW9uIGJ5IHVzaW5nIGEgcHJvY2Vzc2luZyBxdWV1ZVxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgeSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB4ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHogPSBzdGFjay5wb3AoKTtcbiAgICAgICAgZmVhdHVyZXMgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICB2YXIgejIgPSAxIDw8IHosXG4gICAgICAgICAgICBpZCA9IHRvSUQoeiwgeCwgeSksXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF07XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHosIHgsIHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6IHosIHg6IHgsIHk6IHl9KTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2NyZWF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHNba2V5XSA9ICh0aGlzLnN0YXRzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xuICAgICAgICB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuXG4gICAgICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LXBhc3MgdGlsaW5nXG4gICAgICAgIGlmICghY3opIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgbWF4IHpvb20sIG9yIGlmIHRoZSB0aWxlIGlzIHRvbyBzaW1wbGVcbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLmluZGV4TWF4Wm9vbSB8fCB0aWxlLm51bVBvaW50cyA8PSBvcHRpb25zLmluZGV4TWF4UG9pbnRzKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBhIGRyaWxsZG93biB0byBhIHNwZWNpZmljIHRpbGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgYmFzZSB6b29tIG9yIG91ciB0YXJnZXQgdGlsZSB6b29tXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5tYXhab29tIHx8IHogPT09IGN6KSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgaXQncyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIHRhcmdldCB0aWxlXG4gICAgICAgICAgICB2YXIgbSA9IDEgPDwgKGN6IC0geik7XG4gICAgICAgICAgICBpZiAoeCAhPT0gTWF0aC5mbG9vcihjeCAvIG0pIHx8IHkgIT09IE1hdGguZmxvb3IoY3kgLyBtKSkgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBzbGljZSBmdXJ0aGVyIGRvd24sIG5vIG5lZWQgdG8ga2VlcCBzb3VyY2UgZ2VvbWV0cnlcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY2xpcHBpbmcnKTtcblxuICAgICAgICAvLyB2YWx1ZXMgd2UnbGwgdXNlIGZvciBjbGlwcGluZ1xuICAgICAgICB2YXIgazEgPSAwLjUgKiBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcbiAgICAgICAgICAgIGszID0gMC41ICsgazEsXG4gICAgICAgICAgICBrNCA9IDEgKyBrMSxcbiAgICAgICAgICAgIHRsLCBibCwgdHIsIGJyLCBsZWZ0LCByaWdodDtcblxuICAgICAgICB0bCA9IGJsID0gdHIgPSBiciA9IG51bGw7XG5cbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCAtIGsxLCB4ICsgazMsIDAsIHRpbGUubWluWCwgdGlsZS5tYXhYLCBvcHRpb25zKTtcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCArIGsyLCB4ICsgazQsIDAsIHRpbGUubWluWCwgdGlsZS5tYXhYLCBvcHRpb25zKTtcbiAgICAgICAgZmVhdHVyZXMgPSBudWxsO1xuXG4gICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICB0bCA9IGNsaXAobGVmdCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBibCA9IGNsaXAobGVmdCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBsZWZ0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgdHIgPSBjbGlwKHJpZ2h0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyID0gY2xpcChyaWdodCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByaWdodCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgc3RhY2sucHVzaCh0bCB8fCBbXSwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIpO1xuICAgICAgICBzdGFjay5wdXNoKGJsIHx8IFtdLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMiArIDEpO1xuICAgICAgICBzdGFjay5wdXNoKHRyIHx8IFtdLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XG4gICAgICAgIHN0YWNrLnB1c2goYnIgfHwgW10sIHogKyAxLCB4ICogMiArIDEsIHkgKiAyICsgMSk7XG4gICAgfVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5nZXRUaWxlID0gZnVuY3Rpb24gKHosIHgsIHkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZXh0ZW50ID0gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmICh6IDwgMCB8fCB6ID4gMjQpIHJldHVybiBudWxsO1xuXG4gICAgdmFyIHoyID0gMSA8PCB6O1xuICAgIHggPSAoKHggJSB6MikgKyB6MikgJSB6MjsgLy8gd3JhcCB0aWxlIHggY29vcmRpbmF0ZVxuXG4gICAgdmFyIGlkID0gdG9JRCh6LCB4LCB5KTtcbiAgICBpZiAodGhpcy50aWxlc1tpZF0pIHJldHVybiB0cmFuc2Zvcm0odGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcblxuICAgIHZhciB6MCA9IHosXG4gICAgICAgIHgwID0geCxcbiAgICAgICAgeTAgPSB5LFxuICAgICAgICBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXBhcmVudCAmJiB6MCA+IDApIHtcbiAgICAgICAgejAtLTtcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XG4gICAgICAgIHkwID0gTWF0aC5mbG9vcih5MCAvIDIpO1xuICAgICAgICBwYXJlbnQgPSB0aGlzLnRpbGVzW3RvSUQoejAsIHgwLCB5MCldO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQuc291cmNlKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIGlmIHdlIGZvdW5kIGEgcGFyZW50IHRpbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZ2VvbWV0cnksIHdlIGNhbiBkcmlsbCBkb3duIGZyb20gaXRcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkJywgejAsIHgwLCB5MCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICB0aGlzLnNwbGl0VGlsZShwYXJlbnQuc291cmNlLCB6MCwgeDAsIHkwLCB6LCB4LCB5KTtcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2RyaWxsaW5nIGRvd24nKTtcblxuICAgIHJldHVybiB0aGlzLnRpbGVzW2lkXSA/IHRyYW5zZm9ybSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KSA6IG51bGw7XG59O1xuXG5mdW5jdGlvbiB0b0lEKHosIHgsIHkpIHtcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsbnVsbCxudWxsLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuc3VwcG9ydGVkID0gaXNTdXBwb3J0ZWQ7XG5leHBvcnRzLm5vdFN1cHBvcnRlZFJlYXNvbiA9IG5vdFN1cHBvcnRlZFJlYXNvbjtcblxuLyoqXG4gKiBUZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBNYXBib3ggR0wgSlNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ9ZmFsc2VdIFJldHVybiBgZmFsc2VgXG4gKiAgIGlmIHRoZSBwZXJmb3JtYW5jZSBvZiBNYXBib3ggR0wgSlMgd291bGQgYmUgZHJhbWF0aWNhbGx5IHdvcnNlIHRoYW5cbiAqICAgZXhwZWN0ZWQgKGkuZS4gYSBzb2Z0d2FyZSByZW5kZXJlciBpcyB3b3VsZCBiZSB1c2VkKVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTdXBwb3J0ZWQob3B0aW9ucykge1xuICAgIHJldHVybiAhbm90U3VwcG9ydGVkUmVhc29uKG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBub3RTdXBwb3J0ZWRSZWFzb24ob3B0aW9ucykge1xuICAgIGlmICghaXNCcm93c2VyKCkpIHJldHVybiAnbm90IGEgYnJvd3Nlcic7XG4gICAgaWYgKCFpc0FycmF5U3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNlbnQgQXJyYXkgc3VwcG9ydCc7XG4gICAgaWYgKCFpc0Z1bmN0aW9uU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEZ1bmN0aW9uIHN1cHBvcnQnO1xuICAgIGlmICghaXNPYmplY3RTdXBwb3J0ZWQoKSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgT2JqZWN0IHN1cHBvcnQnO1xuICAgIGlmICghaXNKU09OU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEpTT04gc3VwcG9ydCc7XG4gICAgaWYgKCFpc1dvcmtlclN1cHBvcnRlZCgpKSByZXR1cm4gJ2luc3VmZmljaWVudCB3b3JrZXIgc3VwcG9ydCc7XG4gICAgaWYgKCFpc1VpbnQ4Q2xhbXBlZEFycmF5U3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IFVpbnQ4Q2xhbXBlZEFycmF5IHN1cHBvcnQnO1xuICAgIGlmICghaXNBcnJheUJ1ZmZlclN1cHBvcnRlZCgpKSByZXR1cm4gJ2luc3VmZmljaWVudCBBcnJheUJ1ZmZlciBzdXBwb3J0JztcbiAgICBpZiAoIWlzQ2FudmFzR2V0SW1hZ2VEYXRhU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IENhbnZhcy9nZXRJbWFnZURhdGEgc3VwcG9ydCc7XG4gICAgaWYgKCFpc1dlYkdMU3VwcG9ydGVkQ2FjaGVkKG9wdGlvbnMgJiYgb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgV2ViR0wgc3VwcG9ydCc7XG4gICAgaWYgKCFpc05vdElFKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEVDTUFTY3JpcHQgNiBzdXBwb3J0Jztcbn1cblxuZnVuY3Rpb24gaXNCcm93c2VyKCkge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5U3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICAgIEFycmF5LnByb3RvdHlwZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLm1hcCAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuc29tZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodCAmJlxuICAgICAgICBBcnJheS5pc0FycmF5XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvblN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdFN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBPYmplY3Qua2V5cyAmJlxuICAgICAgICBPYmplY3QuY3JlYXRlICYmXG4gICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJlxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyAmJlxuICAgICAgICBPYmplY3QuaXNTZWFsZWQgJiZcbiAgICAgICAgT2JqZWN0LmlzRnJvemVuICYmXG4gICAgICAgIE9iamVjdC5pc0V4dGVuc2libGUgJiZcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJlxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiZcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgJiZcbiAgICAgICAgT2JqZWN0LnNlYWwgJiZcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJlxuICAgICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnNcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc0pTT05TdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdKU09OJyBpbiB3aW5kb3cgJiYgJ3BhcnNlJyBpbiBKU09OICYmICdzdHJpbmdpZnknIGluIEpTT047XG59XG5cbmZ1bmN0aW9uIGlzV29ya2VyU3VwcG9ydGVkKCkge1xuICAgIGlmICghKCdXb3JrZXInIGluIHdpbmRvdyAmJiAnQmxvYicgaW4gd2luZG93ICYmICdVUkwnIGluIHdpbmRvdykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoWycnXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcbiAgICB2YXIgd29ya2VyVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgc3VwcG9ydGVkO1xuICAgIHZhciB3b3JrZXI7XG5cbiAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVSTCk7XG4gICAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAod29ya2VyKSB7XG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICB9XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh3b3JrZXJVUkwpO1xuXG4gICAgcmV0dXJuIHN1cHBvcnRlZDtcbn1cblxuLy8gSUUxMSBvbmx5IHN1cHBvcnRzIGBVaW50OENsYW1wZWRBcnJheWAgYXMgb2YgdmVyc2lvblxuLy8gW0tCMjkyOTQzN10oaHR0cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZW4tdXMva2IvMjkyOTQzNylcbmZ1bmN0aW9uIGlzVWludDhDbGFtcGVkQXJyYXlTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdVaW50OENsYW1wZWRBcnJheScgaW4gd2luZG93O1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQvaXNzdWVzLzE5XG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG59XG5cbi8vIFNvbWUgYnJvd3NlcnMgb3IgYnJvd3NlciBleHRlbnNpb25zIGJsb2NrIGFjY2VzcyB0byBjYW52YXMgZGF0YSB0byBwcmV2ZW50IGZpbmdlcnByaW50aW5nLlxuLy8gTWFwYm94IEdMIHVzZXMgdGhpcyBBUEkgdG8gbG9hZCBzcHJpdGVzIGFuZCBpbWFnZXMgaW4gZ2VuZXJhbC5cbmZ1bmN0aW9uIGlzQ2FudmFzR2V0SW1hZ2VEYXRhU3VwcG9ydGVkKCkge1xuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBpbWFnZURhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKTtcbiAgICByZXR1cm4gaW1hZ2VEYXRhICYmIGltYWdlRGF0YS53aWR0aCA9PT0gY2FudmFzLndpZHRoO1xufVxuXG52YXIgaXNXZWJHTFN1cHBvcnRlZENhY2hlID0ge307XG5mdW5jdGlvbiBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVkKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpIHtcblxuICAgIGlmIChpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF0gPSBpc1dlYkdMU3VwcG9ydGVkKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpO1xuICAgIH1cblxuICAgIHJldHVybiBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF07XG59XG5cbmlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICBhbHBoYTogdHJ1ZSxcbiAgICBzdGVuY2lsOiB0cnVlLFxuICAgIGRlcHRoOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBnZXRXZWJHTENvbnRleHQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCkge1xuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAgIHZhciBhdHRyaWJ1dGVzID0gT2JqZWN0LmNyZWF0ZShpc1N1cHBvcnRlZC53ZWJHTENvbnRleHRBdHRyaWJ1dGVzKTtcbiAgICBhdHRyaWJ1dGVzLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgPSBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNXZWJHTFN1cHBvcnRlZChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSB7XG4gICAgdmFyIGdsID0gZ2V0V2ViR0xDb250ZXh0KGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpO1xuICAgIGlmICghZ2wpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRyeSBjb21waWxpbmcgYSBzaGFkZXIgYW5kIGdldCBpdHMgY29tcGlsZSBzdGF0dXMuIFNvbWUgYnJvd3NlcnMgbGlrZSBCcmF2ZSBibG9jayB0aGlzIEFQSVxuICAgIC8vIHRvIHByZXZlbnQgZmluZ2VycHJpbnRpbmcuIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBtZWFucyB0aGF0IE1hcGJveCBHTCB3b24ndCB3b3JrLlxuICAgIHZhciBzaGFkZXI7XG4gICAgdHJ5IHtcbiAgICAgICAgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gc29tZSBvbGRlciBicm93c2VycyB0aHJvdyBhbiBleGNlcHRpb24gdGhhdCBgY3JlYXRlU2hhZGVyYCBpcyBub3QgZGVmaW5lZFxuICAgICAgICAvLyBzbyBoYW5kbGUgdGhpcyBzZXBhcmF0ZWx5IGZyb20gdGhlIGNhc2Ugd2hlcmUgYnJvd3NlcnMgYmxvY2sgYGNyZWF0ZVNoYWRlcmBcbiAgICAgICAgLy8gZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghc2hhZGVyIHx8IGdsLmlzQ29udGV4dExvc3QoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsICd2b2lkIG1haW4oKSB7fScpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcbiAgICByZXR1cm4gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc05vdElFKCkge1xuICAgIHJldHVybiAhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xufVxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCJjb25zdCBJTkYgPSAxZTIwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW55U0RGIHtcbiAgICBjb25zdHJ1Y3Rvcih7XG4gICAgICAgIGZvbnRTaXplID0gMjQsXG4gICAgICAgIGJ1ZmZlciA9IDMsXG4gICAgICAgIHJhZGl1cyA9IDgsXG4gICAgICAgIGN1dG9mZiA9IDAuMjUsXG4gICAgICAgIGZvbnRGYW1pbHkgPSAnc2Fucy1zZXJpZicsXG4gICAgICAgIGZvbnRXZWlnaHQgPSAnbm9ybWFsJyxcbiAgICAgICAgZm9udFN0eWxlID0gJ25vcm1hbCdcbiAgICB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuY3V0b2ZmID0gY3V0b2ZmO1xuICAgICAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcblxuICAgICAgICAvLyBtYWtlIHRoZSBjYW52YXMgc2l6ZSBiaWcgZW5vdWdoIHRvIGJvdGggaGF2ZSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBhcm91bmQgdGhlIGdseXBoXG4gICAgICAgIC8vIGZvciBcImhhbG9cIiwgYW5kIGFjY291bnQgZm9yIHNvbWUgZ2x5cGhzIHBvc3NpYmx5IGJlaW5nIGxhcmdlciB0aGFuIHRoZWlyIGZvbnQgc2l6ZVxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplID0gZm9udFNpemUgKyBidWZmZXIgKiA0O1xuXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2NyZWF0ZUNhbnZhcyhzaXplKTtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7d2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlfSk7XG4gICAgICAgIGN0eC5mb250ID0gYCR7Zm9udFN0eWxlfSAke2ZvbnRXZWlnaHR9ICR7Zm9udFNpemV9cHggJHtmb250RmFtaWx5fWA7XG5cbiAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdhbHBoYWJldGljJztcbiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdsZWZ0JzsgLy8gTmVjZXNzYXJ5IHNvIHRoYXQgUlRMIHRleHQgZG9lc24ndCBoYXZlIGRpZmZlcmVudCBhbGlnbm1lbnRcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICdibGFjayc7XG5cbiAgICAgICAgLy8gdGVtcG9yYXJ5IGFycmF5cyBmb3IgdGhlIGRpc3RhbmNlIHRyYW5zZm9ybVxuICAgICAgICB0aGlzLmdyaWRPdXRlciA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIHNpemUpO1xuICAgICAgICB0aGlzLmdyaWRJbm5lciA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIHNpemUpO1xuICAgICAgICB0aGlzLmYgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUpO1xuICAgICAgICB0aGlzLnogPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUgKyAxKTtcbiAgICAgICAgdGhpcy52ID0gbmV3IFVpbnQxNkFycmF5KHNpemUpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDYW52YXMoc2l6ZSkge1xuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLndpZHRoID0gY2FudmFzLmhlaWdodCA9IHNpemU7XG4gICAgICAgIHJldHVybiBjYW52YXM7XG4gICAgfVxuXG4gICAgZHJhdyhjaGFyKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHdpZHRoOiBnbHlwaEFkdmFuY2UsXG4gICAgICAgICAgICBhY3R1YWxCb3VuZGluZ0JveEFzY2VudCxcbiAgICAgICAgICAgIGFjdHVhbEJvdW5kaW5nQm94RGVzY2VudCxcbiAgICAgICAgICAgIGFjdHVhbEJvdW5kaW5nQm94TGVmdCxcbiAgICAgICAgICAgIGFjdHVhbEJvdW5kaW5nQm94UmlnaHRcbiAgICAgICAgfSA9IHRoaXMuY3R4Lm1lYXN1cmVUZXh0KGNoYXIpO1xuXG4gICAgICAgIC8vIFRoZSBpbnRlZ2VyL3BpeGVsIHBhcnQgb2YgdGhlIHRvcCBhbGlnbm1lbnQgaXMgZW5jb2RlZCBpbiBtZXRyaWNzLmdseXBoVG9wXG4gICAgICAgIC8vIFRoZSByZW1haW5kZXIgaXMgaW1wbGljaXRseSBlbmNvZGVkIGluIHRoZSByYXN0ZXJpemF0aW9uXG4gICAgICAgIGNvbnN0IGdseXBoVG9wID0gTWF0aC5jZWlsKGFjdHVhbEJvdW5kaW5nQm94QXNjZW50KTtcbiAgICAgICAgY29uc3QgZ2x5cGhMZWZ0ID0gMDtcblxuICAgICAgICAvLyBJZiB0aGUgZ2x5cGggb3ZlcmZsb3dzIHRoZSBjYW52YXMgc2l6ZSwgaXQgd2lsbCBiZSBjbGlwcGVkIGF0IHRoZSBib3R0b20vcmlnaHRcbiAgICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IE1hdGgubWluKHRoaXMuc2l6ZSAtIHRoaXMuYnVmZmVyLCBNYXRoLmNlaWwoYWN0dWFsQm91bmRpbmdCb3hSaWdodCAtIGFjdHVhbEJvdW5kaW5nQm94TGVmdCkpO1xuICAgICAgICBjb25zdCBnbHlwaEhlaWdodCA9IE1hdGgubWluKHRoaXMuc2l6ZSAtIHRoaXMuYnVmZmVyLCBnbHlwaFRvcCArIE1hdGguY2VpbChhY3R1YWxCb3VuZGluZ0JveERlc2NlbnQpKTtcblxuICAgICAgICBjb25zdCB3aWR0aCA9IGdseXBoV2lkdGggKyAyICogdGhpcy5idWZmZXI7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGdseXBoSGVpZ2h0ICsgMiAqIHRoaXMuYnVmZmVyO1xuXG4gICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWF4KHdpZHRoICogaGVpZ2h0LCAwKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShsZW4pO1xuICAgICAgICBjb25zdCBnbHlwaCA9IHtkYXRhLCB3aWR0aCwgaGVpZ2h0LCBnbHlwaFdpZHRoLCBnbHlwaEhlaWdodCwgZ2x5cGhUb3AsIGdseXBoTGVmdCwgZ2x5cGhBZHZhbmNlfTtcbiAgICAgICAgaWYgKGdseXBoV2lkdGggPT09IDAgfHwgZ2x5cGhIZWlnaHQgPT09IDApIHJldHVybiBnbHlwaDtcblxuICAgICAgICBjb25zdCB7Y3R4LCBidWZmZXIsIGdyaWRJbm5lciwgZ3JpZE91dGVyfSA9IHRoaXM7XG4gICAgICAgIGN0eC5jbGVhclJlY3QoYnVmZmVyLCBidWZmZXIsIGdseXBoV2lkdGgsIGdseXBoSGVpZ2h0KTtcbiAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXIsIGJ1ZmZlciwgYnVmZmVyICsgZ2x5cGhUb3ApO1xuICAgICAgICBjb25zdCBpbWdEYXRhID0gY3R4LmdldEltYWdlRGF0YShidWZmZXIsIGJ1ZmZlciwgZ2x5cGhXaWR0aCwgZ2x5cGhIZWlnaHQpO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgZ3JpZHMgb3V0c2lkZSB0aGUgZ2x5cGggcmFuZ2UgdG8gYWxwaGEgMFxuICAgICAgICBncmlkT3V0ZXIuZmlsbChJTkYsIDAsIGxlbik7XG4gICAgICAgIGdyaWRJbm5lci5maWxsKDAsIDAsIGxlbik7XG5cbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBnbHlwaEhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGdseXBoV2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBpbWdEYXRhLmRhdGFbNCAqICh5ICogZ2x5cGhXaWR0aCArIHgpICsgM10gLyAyNTU7IC8vIGFscGhhIHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKGEgPT09IDApIGNvbnRpbnVlOyAvLyBlbXB0eSBwaXhlbHNcblxuICAgICAgICAgICAgICAgIGNvbnN0IGogPSAoeSArIGJ1ZmZlcikgKiB3aWR0aCArIHggKyBidWZmZXI7XG5cbiAgICAgICAgICAgICAgICBpZiAoYSA9PT0gMSkgeyAvLyBmdWxseSBkcmF3biBwaXhlbHNcbiAgICAgICAgICAgICAgICAgICAgZ3JpZE91dGVyW2pdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZ3JpZElubmVyW2pdID0gSU5GO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gYWxpYXNlZCBwaXhlbHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZCA9IDAuNSAtIGE7XG4gICAgICAgICAgICAgICAgICAgIGdyaWRPdXRlcltqXSA9IGQgPiAwID8gZCAqIGQgOiAwO1xuICAgICAgICAgICAgICAgICAgICBncmlkSW5uZXJbal0gPSBkIDwgMCA/IGQgKiBkIDogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlZHQoZ3JpZE91dGVyLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgdGhpcy5mLCB0aGlzLnYsIHRoaXMueik7XG4gICAgICAgIGVkdChncmlkSW5uZXIsIGJ1ZmZlciwgYnVmZmVyLCBnbHlwaFdpZHRoLCBnbHlwaEhlaWdodCwgd2lkdGgsIHRoaXMuZiwgdGhpcy52LCB0aGlzLnopO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBNYXRoLnNxcnQoZ3JpZE91dGVyW2ldKSAtIE1hdGguc3FydChncmlkSW5uZXJbaV0pO1xuICAgICAgICAgICAgZGF0YVtpXSA9IE1hdGgucm91bmQoMjU1IC0gMjU1ICogKGQgLyB0aGlzLnJhZGl1cyArIHRoaXMuY3V0b2ZmKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2x5cGg7XG4gICAgfVxufVxuXG4vLyAyRCBFdWNsaWRlYW4gc3F1YXJlZCBkaXN0YW5jZSB0cmFuc2Zvcm0gYnkgRmVsemVuc3p3YWxiICYgSHV0dGVubG9jaGVyIGh0dHBzOi8vY3MuYnJvd24uZWR1L35wZmYvcGFwZXJzL2R0LWZpbmFsLnBkZlxuZnVuY3Rpb24gZWR0KGRhdGEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgZ3JpZFNpemUsIGYsIHYsIHopIHtcbiAgICBmb3IgKGxldCB4ID0geDA7IHggPCB4MCArIHdpZHRoOyB4KyspIGVkdDFkKGRhdGEsIHkwICogZ3JpZFNpemUgKyB4LCBncmlkU2l6ZSwgaGVpZ2h0LCBmLCB2LCB6KTtcbiAgICBmb3IgKGxldCB5ID0geTA7IHkgPCB5MCArIGhlaWdodDsgeSsrKSBlZHQxZChkYXRhLCB5ICogZ3JpZFNpemUgKyB4MCwgMSwgd2lkdGgsIGYsIHYsIHopO1xufVxuXG4vLyAxRCBzcXVhcmVkIGRpc3RhbmNlIHRyYW5zZm9ybVxuZnVuY3Rpb24gZWR0MWQoZ3JpZCwgb2Zmc2V0LCBzdHJpZGUsIGxlbmd0aCwgZiwgdiwgeikge1xuICAgIHZbMF0gPSAwO1xuICAgIHpbMF0gPSAtSU5GO1xuICAgIHpbMV0gPSBJTkY7XG4gICAgZlswXSA9IGdyaWRbb2Zmc2V0XTtcblxuICAgIGZvciAobGV0IHEgPSAxLCBrID0gMCwgcyA9IDA7IHEgPCBsZW5ndGg7IHErKykge1xuICAgICAgICBmW3FdID0gZ3JpZFtvZmZzZXQgKyBxICogc3RyaWRlXTtcbiAgICAgICAgY29uc3QgcTIgPSBxICogcTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY29uc3QgciA9IHZba107XG4gICAgICAgICAgICBzID0gKGZbcV0gLSBmW3JdICsgcTIgLSByICogcikgLyAocSAtIHIpIC8gMjtcbiAgICAgICAgfSB3aGlsZSAocyA8PSB6W2tdICYmIC0tayA+IC0xKTtcblxuICAgICAgICBrKys7XG4gICAgICAgIHZba10gPSBxO1xuICAgICAgICB6W2tdID0gcztcbiAgICAgICAgeltrICsgMV0gPSBJTkY7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgcSA9IDAsIGsgPSAwOyBxIDwgbGVuZ3RoOyBxKyspIHtcbiAgICAgICAgd2hpbGUgKHpbayArIDFdIDwgcSkgaysrO1xuICAgICAgICBjb25zdCByID0gdltrXTtcbiAgICAgICAgY29uc3QgcXIgPSBxIC0gcjtcbiAgICAgICAgZ3JpZFtvZmZzZXQgKyBxICogc3RyaWRlXSA9IGZbcl0gKyBxciAqIHFyO1xuICAgIH1cbn1cbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLy9cbi8vIE91ciBjdXN0b20gaW50cm8gcHJvdmlkZXMgYSBzcGVjaWFsaXplZCBcImRlZmluZSgpXCIgZnVuY3Rpb24sIGNhbGxlZCBieSB0aGVcbi8vIEFNRCBtb2R1bGVzIGJlbG93LCB0aGF0IHNldHMgdXAgdGhlIHdvcmtlciBibG9iIFVSTCBhbmQgdGhlbiBleGVjdXRlcyB0aGVcbi8vIG1haW4gbW9kdWxlLCBzdG9yaW5nIGl0cyBleHBvcnRlZCB2YWx1ZSBhcyAnbWFwbGlicmVnbCdcblxuLy8gVGhlIHRocmVlIFwiY2h1bmtzXCIgaW1wb3J0ZWQgaGVyZSBhcmUgcHJvZHVjZWQgYnkgYSBmaXJzdCBSb2xsdXAgcGFzcyxcbi8vIHdoaWNoIG91dHB1dHMgdGhlbSBhcyBBTUQgbW9kdWxlcy5cblxuLy8gU2hhcmVkIGRlcGVuZGVuY2llcywgaS5lLjpcbi8qXG5kZWZpbmUoWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gICAgLy8gQ29kZSBmb3IgYWxsIGNvbW1vbiBkZXBlbmRlbmNpZXNcbiAgICAvLyBFYWNoIG1vZHVsZSdzIGV4cG9ydHMgYXJlIGF0dGFjaGVkIGF0dGFjaGVkIHRvICdleHBvcnRzJyAod2l0aFxuICAgIC8vIG5hbWVzIHJld3JpdHRlbiB0byBhdm9pZCBjb2xsaXNpb25zLCBldGMuKVxufSlcbiovXG5pbXBvcnQgJy4vYnVpbGQvbWFwbGlicmVnbC9zaGFyZWQnO1xuXG4vLyBXb3JrZXIgYW5kIGl0cyB1bmlxdWUgZGVwZW5kZW5jaWVzLCBpLmUuOlxuLypcbmRlZmluZShbJy4vc2hhcmVkLmpzJ10sIGZ1bmN0aW9uIChfX3NoYXJlZF9fanMpIHtcbiAgICAvLyAgQ29kZSBmb3Igd29ya2VyIHNjcmlwdCBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXMuXG4gICAgLy8gIEV4cGVjdHMgdGhlIG91dHB1dCBvZiAnc2hhcmVkJyBtb2R1bGUgdG8gYmUgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50LFxuICAgIC8vICBzaW5jZSBhbGwgcmVmZXJlbmNlcyB0byBjb21tb24gZGVwcyBsb29rIGxpa2UsIGUuZy4sXG4gICAgLy8gIF9fc2hhcmVkX19qcy5zaGFwZVRleHQoKS5cbn0pO1xuKi9cbi8vIFdoZW4gdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byBvdXIgY3VzdG9tIGRlZmluZSgpIGFib3ZlLFxuLy8gaXQgZ2V0cyBzdHJpbmdpZmllZCwgdG9nZXRoZXIgd2l0aCB0aGUgc2hhcmVkIHdyYXBwZXIgKHVzaW5nXG4vLyBGdW5jdGlvbi50b1N0cmluZygpKSwgYW5kIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9mIGNvZGUgaXMgbWFkZSBpbnRvIGFcbi8vIEJsb2IgVVJMIHRoYXQgZ2V0cyB1c2VkIGJ5IHRoZSBtYWluIG1vZHVsZSB0byBjcmVhdGUgdGhlIHdlYiB3b3JrZXJzLlxuaW1wb3J0ICcuL2J1aWxkL21hcGxpYnJlZ2wvd29ya2VyJztcblxuLy8gTWFpbiBtb2R1bGUgYW5kIGl0cyB1bmlxdWUgZGVwZW5kZW5jaWVzXG4vKlxuZGVmaW5lKFsnLi9zaGFyZWQuanMnXSwgZnVuY3Rpb24gKF9fc2hhcmVkX19qcykge1xuICAgIC8vICBDb2RlIGZvciBtYWluIEdMIEpTIG1vZHVsZSBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXMuXG4gICAgLy8gIEV4cGVjdHMgdGhlIG91dHB1dCBvZiAnc2hhcmVkJyBtb2R1bGUgdG8gYmUgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50LFxuICAgIC8vICBzaW5jZSBhbGwgcmVmZXJlbmNlcyB0byBjb21tb24gZGVwcyBsb29rIGxpa2UsIGUuZy4sXG4gICAgLy8gIF9fc2hhcmVkX19qcy5zaGFwZVRleHQoKS5cbiAgICAvL1xuICAgIC8vICBSZXR1cm5zIHRoZSBhY3R1YWwgbWFwbGlicmVnbCAoaS5lLiBzcmMvaW5kZXguanMpXG59KTtcbiovXG5pbXBvcnQgJy4vYnVpbGQvbWFwbGlicmVnbC9pbmRleCc7XG5cbmV4cG9ydCBkZWZhdWx0IG1hcGxpYnJlZ2w7XG4iXSwibmFtZXMiOlsib2JqZWN0QXNzaWduIiwiaW5oZXJpdHNfYnJvd3Nlck1vZHVsZSIsInJlcXVpcmUkJDAiLCJyZXF1aXJlJCQxIiwiY29tcGFyZSIsImFzc2VydE1vZHVsZSIsImJlemllciIsIlVuaXRCZXppZXIiLCJleHRlbmQiLCJjbG9uZSIsImV4cG9ydGVkIiwiUG9pbnQiLCJ3ZWJwU3VwcG9ydGVkIiwiYXNzZXJ0IiwiYXJyYXkiLCJ0b1N0cmluZyIsInBhcnNlQ1NTQ29sb3IiLCJ0eXBlcyIsInZhbHVlVG9TdHJpbmciLCJQYXJzaW5nQ29udGV4dCIsIkVYVEVOVCIsIm1lcmNhdG9yWGZyb21MbmciLCJtZXJjYXRvcllmcm9tTGF0IiwiaW50ZXJwb2xhdGVOdW1iZXIiLCJ0eXBlVG9TdHJpbmciLCJkZWZpbml0aW9ucyIsImlzQ29uc3RhbnQuaXNTdGF0ZUNvbnN0YW50IiwiaXNGZWF0dXJlQ29uc3RhbnQiLCJpc0NvbnN0YW50LmlzRmVhdHVyZUNvbnN0YW50IiwiaXNDb25zdGFudC5pc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQiLCJ2YWxpZGF0ZVNwZWMiLCJ2YWxpZGF0ZUZpbHRlciIsInZhbGlkYXRlUGFpbnRQcm9wZXJ0eSIsInZhbGlkYXRlTGF5b3V0UHJvcGVydHkiLCJ2YWxpZGF0ZVNvdXJjZSIsInZhbGlkYXRlTGlnaHQiLCJsYXRlc3RTdHlsZVNwZWMiLCJpc0NoYXIiLCJicm93c2VyIiwicnRsVGV4dFBsdWdpbiIsInN0eWxlU3BlYyIsImFsaWduIiwibGF5b3V0IiwibWVtYmVycyIsInNpemUiLCJhbGlnbm1lbnQiLCJtdXJtdXJoYXNoSnNNb2R1bGUiLCJtdXJtdXJoYXNoSnMiLCJtdXJtdXIzIiwic3dhcCIsImxheW91dEF0dHJpYnV0ZXMiLCJ0cmFuc2xhdGUiLCJwYWludCIsImVxdWFscyIsImNyZWF0ZSIsImdsTWF0cml4LkFSUkFZX1RZUEUiLCJjb3B5IiwiaWRlbnRpdHkiLCJmcm9tVmFsdWVzIiwic2V0IiwidHJhbnNwb3NlIiwiaW52ZXJ0IiwiYWRqb2ludCIsImRldGVybWluYW50IiwibXVsdGlwbHkiLCJyb3RhdGUiLCJzY2FsZSIsImZyb21Sb3RhdGlvbiIsImZyb21TY2FsaW5nIiwic3RyIiwiZnJvYiIsImFkZCIsInN1YnRyYWN0IiwiZXhhY3RFcXVhbHMiLCJnbE1hdHJpeC5FUFNJTE9OIiwibXVsdGlwbHlTY2FsYXIiLCJtdWx0aXBseVNjYWxhckFuZEFkZCIsIm11bCIsInN1YiIsImZyb21UcmFuc2xhdGlvbiIsImZyb21NYXQ0IiwiZnJvbVF1YXQiLCJyb3RhdGVYIiwicm90YXRlWSIsInJvdGF0ZVoiLCJmcm9tUm90YXRpb25UcmFuc2xhdGlvbiIsImdldFRyYW5zbGF0aW9uIiwibGVuZ3RoIiwiZGl2aWRlIiwiY2VpbCIsImZsb29yIiwibWluIiwibWF4Iiwicm91bmQiLCJzY2FsZUFuZEFkZCIsImRpc3RhbmNlIiwic3F1YXJlZERpc3RhbmNlIiwic3F1YXJlZExlbmd0aCIsIm5lZ2F0ZSIsImludmVyc2UiLCJub3JtYWxpemUiLCJkb3QiLCJjcm9zcyIsImxlcnAiLCJyYW5kb20iLCJnbE1hdHJpeC5SQU5ET00iLCJ0cmFuc2Zvcm1NYXQ0IiwidHJhbnNmb3JtTWF0MyIsInRyYW5zZm9ybVF1YXQiLCJhbmdsZSIsInplcm8iLCJkaXYiLCJkaXN0Iiwic3FyRGlzdCIsImxlbiIsInNxckxlbiIsImZvckVhY2giLCJjb25qdWdhdGUiLCJ2ZWM0LmNsb25lIiwidmVjNC5mcm9tVmFsdWVzIiwidmVjNC5jb3B5IiwidmVjNC5zZXQiLCJ2ZWM0LmFkZCIsInZlYzQuc2NhbGUiLCJ2ZWM0LmRvdCIsInZlYzQubGVycCIsInZlYzQubGVuZ3RoIiwidmVjNC5zcXVhcmVkTGVuZ3RoIiwidmVjNC5ub3JtYWxpemUiLCJ2ZWM0LmV4YWN0RXF1YWxzIiwidmVjNC5lcXVhbHMiLCJ2ZWMzLmNyZWF0ZSIsInZlYzMuZnJvbVZhbHVlcyIsInZlYzMuZG90IiwidmVjMy5jcm9zcyIsInZlYzMubGVuIiwidmVjMy5ub3JtYWxpemUiLCJtYXQzLmNyZWF0ZSIsInF1YXQuY3JlYXRlIiwibWF0NC5nZXRSb3RhdGlvbiIsIm1hdDQuZ2V0VHJhbnNsYXRpb24iLCJxdWF0LmNvcHkiLCJxdWF0LnJvdGF0ZVgiLCJxdWF0LnJvdGF0ZVkiLCJxdWF0LnJvdGF0ZVoiLCJxdWF0LmRvdCIsInF1YXQubGVuZ3RoIiwicXVhdC5zcXVhcmVkTGVuZ3RoIiwicHJvcGVydGllcyIsInByb2plY3RRdWVyeUdlb21ldHJ5IiwidmVjNC50cmFuc2Zvcm1NYXQ0IiwiZWFyY3V0TW9kdWxlIiwiZWFyY3V0XzEiLCJzaWduZWRBcmVhIiwiZGVmYXVsdENvbXBhcmUiLCJjbGFzc2lmeVJpbmdzIiwiRUFSQ1VUX01BWF9SSU5HUyIsImVhcmN1dCIsIlZlY3RvclRpbGVGZWF0dXJlIiwiVmVjdG9yVGlsZUxheWVyIiwiVmVjdG9yVGlsZSIsInJlcXVpcmUkJDIiLCJ2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzIiwibXZ0IiwiYWRkVmVydGV4IiwibGF5b3V0QXR0cmlidXRlc0V4dCIsImllZWU3NTQiLCJib3JkZXIiLCJQcm90b2J1ZiIsIldyaXRpbmdNb2RlIiwiaW50ZXJwb2xhdGUiLCJRdWV1ZSIsIlN5bWJvbEJ1Y2tldCIsIm1hdDQuaWRlbnRpdHkiLCJnbG9iYWxSVExUZXh0UGx1Z2luIiwidHJhbnNmb3JtVGV4dCIsImNpcmNsZSIsImhlYXRtYXAiLCJoaWxsc2hhZGUiLCJmaWxsIiwiZmlsbEV4dHJ1c2lvbiIsImxpbmUiLCJzeW1ib2wiLCJiYWNrZ3JvdW5kIiwicmFzdGVyIiwiTG5nTGF0Qm91bmRzIiwidnQiLCJmZWF0dXJlRmlsdGVyIiwiUGVyZm9ybWFuY2VNYXJrZXJzIiwicmVmUHJvcGVydGllcyIsImNyZWF0ZVN0eWxlTGF5ZXIiLCJwb3RwYWNrIiwiQWxwaGFJbWFnZSIsInJlZ2lzdGVyIiwiT3ZlcnNjYWxlZFRpbGVJRCIsIkNvbGxpc2lvbkJveEFycmF5IiwiRGljdGlvbmFyeUNvZGVyIiwiRmVhdHVyZUluZGV4Iiwid2Fybk9uY2UiLCJtYXBPYmplY3QiLCJJbWFnZUF0bGFzIiwicGVyZm9ybVN5bWJvbExheW91dCIsIkxpbmVCdWNrZXQiLCJGaWxsQnVja2V0IiwiRmlsbEV4dHJ1c2lvbkJ1Y2tldCIsIkV2YWx1YXRpb25QYXJhbWV0ZXJzIiwiZ2V0QXJyYXlCdWZmZXIiLCJSZXF1ZXN0UGVyZm9ybWFuY2UiLCJpc0ltYWdlQml0bWFwIiwiREVNRGF0YSIsIlJHQkFJbWFnZSIsInJld2luZCIsIkZlYXR1cmVXcmFwcGVyIiwiR2VvSlNPTldyYXBwZXIiLCJ2dFBiZk1vZHVsZSIsInZ0UGJmIiwic29ydCIsInRyYW5zZm9ybSIsImNyZWF0ZUV4cHJlc3Npb24iLCJnZXRKU09OIiwiQWN0b3IiLCJlbmZvcmNlQ2FjaGVTaXplTGltaXQiLCJSZXNvdXJjZVR5cGUiLCJnZXRJbWFnZSIsIkV2ZW50ZWQiLCJFcnJvckV2ZW50IiwiRXZlbnQiLCJJbWFnZVBvc2l0aW9uIiwicGFyc2VHbHlwaFBCRiIsImFzeW5jQWxsIiwic3BoZXJpY2FsVG9DYXJ0ZXNpYW4iLCJQcm9wZXJ0aWVzIiwiRGF0YUNvbnN0YW50UHJvcGVydHkiLCJUcmFuc2l0aW9uYWJsZSIsImVtaXRWYWxpZGF0aW9uRXJyb3JzIiwidmFsaWRhdGVTdHlsZSIsInVuaXF1ZUlkIiwicGljayIsImNhY2hlRW50cnlQb3NzaWJseUFkZGVkIiwiY3JlYXRlTGF5b3V0IiwiTWVyY2F0b3JDb29yZGluYXRlIiwiUmFzdGVyQm91bmRzQXJyYXkiLCJTZWdtZW50VmVjdG9yIiwiQ2Fub25pY2FsVGlsZUlEIiwiZ2V0VmlkZW8iLCJWYWxpZGF0aW9uRXJyb3IiLCJ2ZWN0b3IiLCJyYXN0ZXJEZW0iLCJnZW9qc29uIiwidmlkZW8iLCJpbWFnZSIsImNhbnZhcyIsImJpbmRBbGwiLCJtYXQ0LmNyZWF0ZSIsIm1hdDQudHJhbnNsYXRlIiwibWF0NC5zY2FsZSIsIm1hdDQubXVsdGlwbHkiLCJkZXNlcmlhbGl6ZUJ1Y2tldCIsImxhenlMb2FkUlRMVGV4dFBsdWdpbiIsInRvRXZhbHVhdGlvbkZlYXR1cmUiLCJHZW9KU09ORmVhdHVyZSIsInBhcnNlQ2FjaGVDb250cm9sIiwiY3JlYXRlU291cmNlIiwia2V5c0RpZmZlcmVuY2UiLCJ3ZWJXb3JrZXJGYWN0b3J5IiwibGF0ZXN0IiwiaXNFcXVhbCIsImNsYW1wIiwibWF0NC5yb3RhdGVaIiwibWF0NC5jbG9uZSIsInN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbSIsInN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZSIsImFkZER5bmFtaWNBdHRyaWJ1dGVzIiwicHJvamVjdGlvbi5wcm9qZWN0IiwicHJvamVjdGlvbi5nZXRQZXJzcGVjdGl2ZVJhdGlvIiwiT05FX0VNIiwicHJvamVjdGlvbi5wbGFjZUZpcnN0QW5kTGFzdEdseXBoIiwiY2xpcExpbmUiLCJpbnRlcnNlY3Rpb25UZXN0cy5wb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24iLCJwcm9qZWN0aW9uLnh5VHJhbnNmb3JtTWF0NCIsImdldEFuY2hvckFsaWdubWVudCIsImV2YWx1YXRlVmFyaWFibGVPZmZzZXQiLCJwcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXgiLCJwcm9qZWN0aW9uLmdldEdsQ29vcmRNYXRyaXgiLCJnZXRPdmVybGFwTW9kZSIsIm1hdDQuaW52ZXJ0IiwiZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbiIsIl9lbWl0VmFsaWRhdGlvbkVycm9ycyIsImRpZmZPcGVyYXRpb25zIiwiZ2V0V29ya2VyUG9vbCIsIlpvb21IaXN0b3J5IiwiZ2V0UmVmZXJyZXIiLCJ0cmlnZ2VyUGx1Z2luQ29tcGxldGlvbkV2ZW50IiwiZGVyZWYiLCJ2YWxpZGF0ZUN1c3RvbVN0eWxlTGF5ZXIiLCJkZWVwRXF1YWwiLCJmaWx0ZXJPYmplY3QiLCJydGxUZXh0UGx1Z2luRXZlbnRlZCIsIm1ha2VSZXF1ZXN0IiwicmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZSIsIlVuaWZvcm1NYXRyaXg0ZiIsIlVuaWZvcm0zZiIsIlVuaWZvcm0xZiIsIlVuaWZvcm0xaSIsIlVuaWZvcm0yZiIsIm1hdDMuZnJvbVJvdGF0aW9uIiwidmVjMy50cmFuc2Zvcm1NYXQzIiwiVW5pZm9ybUNvbG9yIiwibWF0NC5vcnRobyIsIlVuaWZvcm00ZiIsIkNvbG9yIiwiQUxXQVlTIiwibWF0NC5tdWwiLCJDb2xsaXNpb25DaXJjbGVMYXlvdXRBcnJheSIsImNvbGxpc2lvbkNpcmNsZUxheW91dCIsIlF1YWRUcmlhbmdsZUFycmF5IiwiZXZhbHVhdGVTaXplRm9yWm9vbSIsInN5bWJvbFByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeCIsInN5bWJvbFByb2plY3Rpb24uaGlkZUdseXBocyIsInN5bWJvbFByb2plY3Rpb24ucHJvamVjdCIsInN5bWJvbFByb2plY3Rpb24uZ2V0UGVyc3BlY3RpdmVSYXRpbyIsImV2YWx1YXRlU2l6ZUZvckZlYXR1cmUiLCJzeW1ib2xQcm9qZWN0aW9uLmdldEdsQ29vcmRNYXRyaXgiLCJzeW1ib2xQcm9qZWN0aW9uLnVwZGF0ZUxpbmVMYWJlbHMiLCJuZXh0UG93ZXJPZlR3byIsInJlbmRlckNvbG9yUmFtcCIsImRyYXciLCJkZWJ1ZyIsImN1c3RvbSIsIlBvc0FycmF5IiwiTGluZVN0cmlwSW5kZXhBcnJheSIsIlRyaWFuZ2xlSW5kZXhBcnJheSIsInZlYzMuc3ViIiwidmVjMy5zY2FsZSIsInZlYzMuYWRkIiwidmVjMy5jbG9uZSIsIm51bWJlciIsIkxuZ0xhdCIsIndyYXAiLCJtYXQyLmNyZWF0ZSIsIm1hdDIucm90YXRlIiwiVW53cmFwcGVkVGlsZUlEIiwidmVjMi5zcXJMZW4iLCJtYXQ0LnBlcnNwZWN0aXZlIiwibWF0NC5yb3RhdGVYIiwibWVyY2F0b3JaZnJvbUFsdGl0dWRlIiwiZGVmYXVsdE9wdGlvbnMiLCJfZWFzZSIsImRlZmF1bHRFYXNpbmciLCJQZXJmb3JtYW5jZVV0aWxzIiwic2V0Q2FjaGVMaW1pdHMiLCJzZXRSVExUZXh0UGx1Z2luIiwiZ2V0UlRMVGV4dFBsdWdpblN0YXR1cyIsIkFKQVhFcnJvciIsImNvbmZpZyIsImNsZWFyVGlsZUNhY2hlIiwiaXNTYWZhcmkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQSxZQUFZLENBQUM7QUFDYjtBQUNBLElBQUkscUJBQXFCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDO0FBQ3pELElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO0FBQ3JELElBQUksZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztBQUM3RDtBQUNBLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUN2QixDQUFDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO0FBQ3hDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0FBQy9FLEVBQUU7QUFDRjtBQUNBLENBQUMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxlQUFlLEdBQUc7QUFDM0IsQ0FBQyxJQUFJO0FBQ0wsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtB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LEVBQUUsV0FBVyxFQUFFLE9BQU8sSUFBSUEsT0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEdBQUcsTUFBTSxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxLQUFLLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFVBQVUsTUFBTSxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUU7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksS0FBSyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssSUFBSSxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxFQUFFLFdBQVc7QUFDcEIsUUFBUSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxFQUFFLFNBQVMsS0FBSyxFQUFFO0FBQzVCLFFBQVEsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLGVBQWUsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN0QixRQUFRLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN6QixRQUFRLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0IsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFFBQVEsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxFQUFFLFdBQVc7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFO0FBQ3pCLFFBQVEsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDM0IsUUFBUSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLO0FBQ3pCLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ25DLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRTtBQUMxQixRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM5QyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdkIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdEIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDOUIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsRUFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1S0Q7QUFFYyxNQUFPLGVBQWUsQ0FBQTtBQUtoQyxJQUFBLFdBQUEsQ0FBWSxHQUFXLEVBQUUsS0FFeEIsRUFBRSxPQUFlLEVBQUUsVUFBMEIsRUFBQTtBQUMxQyxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQSxFQUFHLEdBQUcsQ0FBQSxFQUFBLENBQUksR0FBRyxFQUFFLElBQUksT0FBTyxDQUFDO0FBQ2pELFFBQUEsSUFBSSxVQUFVO0FBQUUsWUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUU3QyxJQUFJLEtBQUssS0FBSyxJQUFJLElB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Q0EsSUFBSSxjQUFjLEdBQUc7QUFDckIsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RCxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRCxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pELEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BELEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlELEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVELEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUQsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0QsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDL0QsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDL0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRSxFQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RSxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxFQUFFLGtCQUFrQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RSxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRCxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRSxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFF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QUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDMUMsUUFBQSxNQUFNLGFBQWEsR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLFFBQUEsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDckgsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ2IsWUFBQSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDcEgsU0FBQTtBQUNELFFBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNqQixLQUFBO0FBQ0QsSUFBQSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUE7SUFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDN0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFBO0FBQzNELElBQUEsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxRQUFNLENBQUM7QUFDcEQsSUFBQSxNQUFNLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUdBLFFBQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHQSxRQUFNLENBQUMsQ0FBQztJQUM1RCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEIsSUFBQSxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsRUFBRTtBQUMzQixRQUFBLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxXQUFXLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDL0MsWUFBQSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFNBQUE7QUFDSixLQUFBO0FBQ0QsSUFBQSxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFBO0FBQ3pELElBQUEsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxRQUFNLENBQUM7QUFDcEQsSUFBQSxNQUFNLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUdBLFFBQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHQSxRQUFNLENBQUMsQ0FBQztJQUM1RCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDckIsSUFBQSxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRTtRQUN6QixNQUFNLFFB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QyxFQUFFLENBQUMsRUFBSSxFQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3hDLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFJLEVBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDeEMsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUksRUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUMzQyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBSSxFQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBRTNDLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBSSxFQUFBLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDbEUsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFBLEVBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3RFLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBSSxFQUFBLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDaEUsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFJLEVBQUEsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNoRSxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUks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LENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxLQUFBO0FBQ0QsSUFBQSxNQUFNLEVBQUU7UUFDSixVQUFVO0FBQ1YsUUFBQSxDQUFDLFVBQVUsQ0FBQztRQUNaLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUc7QUFDckQsS0FBQTtBQUNELElBQUEsS0FBSyxFQUFFO1FBQ0gsVUFBVTtBQUNWLFFBQUEsQ0FBQyxVQUFVLENBQUM7QUFDWixRQUFBLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLEtBQUE7QUFDRCxJQUFBLEtBQUssRUFBRTtRQUNILFVBQVU7QUFDVixRQUFBLENBQUMsVUFBVSxDQUFDO0FBQ1osUUFBQSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxLQUFBO0FBQ0QsSUFBQSxLQUFLLEVBQUU7UUFDSCxVQUFVO0FBQ1YsUUFBQSxDQUFDLFVBQVUsQ0FBQztBQUNaLFFBQUEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsS0FBQTtBQUNELElBQUEsTUFBTSxFQUFFO1FBQ0osVUFBVTtBQUNWLFFBQUEsQ0FBQyxVQUFVLENBQUM7QUFDWixRQUFBLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFD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QUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDL0MsUUFBQSxPQUFPLEtBQUssQ0FBQztBQUNoQixLQUFBO0FBQ0QsSUFBQSxRQUFRLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDYixRQUFBLEtBQUssS0FBSztBQUNOLFlBQUEsT0FBTyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7QUFFOUUsUUFBQSxLQUFLLElBQUk7WUFDTCxPQUFPLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFN0YsUUFBQSxLQUFLLEtBQUssQ0FBQztBQUNYLFFBQUEsS0FBSyxNQUFNLENBQUM7QUFDWixRQUFBLEtBQUssTUFBTTtBQUNQLFlBQUEsT0FBTyxLQUFLLENBQUM7QUFFakIsUUFBQSxLQUFLLElBQUksQ0FBQztBQUNWLFFBQUEsS0FBSyxJQUFJLENBQUM7QUFDVixRQUFBLEtBQUssR0FBRyxDQUFDO0FBQ1QsUUFBQSxLQUFLLElBQUksQ0FBQztBQUNWLFFBQUEsS0FBSyxHQUFHLENBQUM7QUFDVCxRQUFBLEtBQUssSUFBSTtZQUNMLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFekYsUUFBQSxLQUFLLEtBQUssQ0FBQztBQUNYLFFBQUEsS0FBSyxLQUFLO1lBQ04sS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxD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QUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1RSxLQUFBO0lBRU0sT0FBTyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBQTtBQUN0SyxRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFH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QUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBO0FBRUQsd0NBQXdDLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDeEUsUUFBUSxDQUFDLDBDQUEwQyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7QUFFL0Y7Ozs7Ozs7O0FBUUc7QUFDSCxNQUFNLDhCQUErQixTQUFRLFdBQVcsQ0FBQTtBQU9wRCxJQUFBLGFBQWEsR0FBQTtRQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3JELEtBQUE7SUFFTSxXQUFXLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFBO0FBQy9XLFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1SixLQUFBO0lBRU0sT0FBTyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUE7QUFDdFgsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7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LEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDakUsSUFBQSxJQUFJLE9BQU8sR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ2pFLElBQUEsSUFBSSw2QkFBNkIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZGLElBQUEsSUFBSSw4QkFBOEIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3hGLElBQUEsSUFBSSw0QkFBNEIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3RGLElBQUEsSUFBSSw2QkFBNkIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZGLElBQUEsSUFBSSxxQkFBcUIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQy9FLElBQUEsSUFBSSw2QkFBNkIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZGLElBQUEsSUFBSSxHQUFHLEdBQUssRUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFD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QyxLQUFLLFVBQVUsQ0FBQztBQUNyRjtBQUNBLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNYLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDdEMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxLQUFLLFVBQVUsQ0FBQztBQUNwRixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEYsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1I7QUFDQSxDQUFDLFFBQVEsU0FBUztBQUNsQixFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFDckQsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQ3BELEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDM0M7QUFDQSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ25GLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDaEMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUNuRixFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDWCxFQUFFO0FBQ0Y7QUFDQSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDO0FBQ2xCO0FBQ0EsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNqQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLFVBQVUsSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ2xHLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDakIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxLQUFLLFVBQVUsQ0FBQztBQUNwRyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ2pCO0FBQ0EsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakIsQ0FBQztBQUNEO0FBQ0EsR0FBRyxRQUFhLEtBQUssV0FBVyxFQUFFO0FBQ2xDLEVBQUUsaUJBQWlCLGlCQUFpQixDQUFBO0FBQ3BDLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3REQSxTQUFTLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDdEMsRUFBRTtBQUNGLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNO0FBQ2xCLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDVCxJQUFJLENBQUMsQ0FBQztBQUNOO0FBQ0EsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDakIsR0FBRyxDQUFDO0FBQ0osS0FBSyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7QUFDeEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQ3pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JGLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JGO0FBQ0EsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0RjtBQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNYLElBQUksRUFBRSxDQUFDLENBQUM7QUFDUixHQUFHO0FBQ0g7QUFDQSxFQUFFLFFBQVEsQ0FBQztBQUNYLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNwRCxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7QUFDbkQsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMxQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0YsR0FBRztBQUNIO0FBQ0EsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNoQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkYsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNoQjtBQUNBLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUFDRDtB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QUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2RSxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQUUsUUFBQSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUFFLFFBQUEsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQ7QUFDQSxTQUFTLHlCQUF5QixDQUFDLEtBQWtCLEVBQUUsQ0FBUSxFQUFBO0lBQzNELElBQUksQ0FBQyxHQUFHLEtBQUssRUFDVCxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUVqQixJQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ25DLFFBQUEsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQzNELFlBQUEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLFlBQUEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLFlBQUEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNoRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDVixhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFDRCxJQUFBLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsSUFBVSxFQUFFLENBQVEsRUFBQTtJQUM5QyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQzNELFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFFBQUEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2hHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNWLFNBQUE7QUFDSixLQUFBO0FBQ0QsSUFBQSxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLElBQVUsRUFBRSxLQUFhLEVBQUUsS0FBYSxFQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUE7QUFDaEcsSUFBQSxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRTtBQUNsQixRQUFBLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1osS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1osS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1osS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQUUsWUFBQSxPQUFPLElBQUksQ0FBQztBQUNqQyxLQUFBO0FBRUQsSUFBQSxNQUFNLE9BQU8sR0FBRztBQUNaLFFBQUEsSUFBSXZDLGFBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSUEsYUFBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7QUFDdkIsUUFBQSxJQUFJQSxhQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztBQUN2QixRQUFBLElBQUlBLGFBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO0tBQUMsQ0FBQztBQUU3QixJQUFBLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDakIsUUFBQSxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtBQUMxQixZQUFBLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztBQUFFLGdCQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdEMsUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2QixRQUFBLElBQUksaUJBQWlCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUM7QUFBRSxZQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELEtBQUE7QUFFRCxJQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEVBQVMsRUFBRSxFQUFTLEVBQUUsT0FBcUIsRUFBQTtBQUNsRSxJQUFBLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixJQUFBLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFdEIsSUFBQSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFNBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsU0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxTQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUUsUUFBQSxPQUFPLEtBQUssQ0FBQzs7QUFHbkQsSUFBQSxNQUFNLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ELElBQUEsT0FBTyxHQUFHLEtBQUssa0JBQWtCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsR0FBRyxLQUFLLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLFFBQUEsR0FBRyxLQUFLLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQTs7QUN0TWdCLFNBQUEsb0JBQW9CLENBQ2hDLFFBQWdCLEVBQ2hCLEtBQWlCLEVBQ2pCLE1BQXNDLEVBQUE7QUFFdEMsSUFBQSxNQUFNLEtBQUssR0FBSyxLQUFLLENBQUMsS0FBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQXlDLENBQUMsS0FBSyxDQUFDO0FBQ2hHLElBQUEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtRQUMzQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFDdEIsS0FBQTtBQUFNLFNBQUE7QUFDSCxRQUFBLE9BQU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNFLEtBQUE7QUFDTCxDQUFDO0FBRUssU0FBVSxpQkFBaUIsQ0FBQyxTQUEyQixFQUFBO0lBQ3pELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUssU0FBVXdDLFdBQVMsQ0FBQyxhQUEyQixFQUNqRCxTQUEyQixFQUMzQixlQUFtQyxFQUNuQyxPQUFlLEVBQ2YsaUJBQXlCLEVBQUE7SUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNoQyxRQUFBLE9BQU8sYUFBYSxDQUFDO0FBQ3hCLEtBQUE7QUFDRCxJQUFBLE1BQU0sRUFBRSxHQUFHeEMsYUFBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUU3RCxJQUFJLGVBQWUsS0FBSyxVQUFVLEVBQUU7QUFDaEMsUUFBQSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDeEIsS0FBQTtJQUVELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUN0QixJQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNDLFFBQUEsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLEtBQUE7QUFDRCxJQUFBLE9BQU8sVUFBVSxDQUFDO0FBQ3RCLENBQUM7QUFFZSxTQUFBLFVBQVUsQ0FBQyxLQUEwQixFQUFFLE1BQWMsRUFBQTtJQUNqRSxNQUFNLFFBQVEsR0FBd0IsRUFBRSxDQUFDO0FBQ3pDLElBQUEsS0FBSyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUU7QUFDM0QsUUFBQSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQWlCLEVBQUUsQ0FBQztBQUNqQyxRQUFBLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUIsWUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxQixZQUFBLE1BQU0sSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSUEsYUFBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3RFLFlBQUEsTUFBTSxJQUFJLEdBQUcsS0FBSyxLQUFLLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUlBLGFBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBRXhDLFlBQUEsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3RCxJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUU7QUFDcEIsZ0JBQUEsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7QUFDbkMsYUFBQTtBQUVELFlBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9DLFNBQUE7QUFDRCxRQUFBLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUIsS0FBQTtBQUNELElBQUEsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQTs7QUNyRUE7QUErQkEsTUFBTStCLFFBQU0sR0FBa0MsSUFBSSxVQUFVLENBQUM7SUFDekQsaUJBQWlCLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQ0YsSUFBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLGlCQUFpQixDQUFzQyxDQUFDO0FBQ2hJLENBQUEsQ0FBQyxDQUFDO0FBOEJILE1BQU1ZLE9BQUssR0FBaUMsSUFBSSxVQUFVLENBQUM7SUFDdkQsZUFBZSxFQUFFLElBQUksa0JBQWtCLENBQUNaLElBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxlQUFlLENBQXNDLENBQUM7SUFDeEgsY0FBYyxFQUFFLElBQUksa0JBQWtCLENBQUNBLElBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxjQUFjLENBQXNDLENBQUM7SUFDdEgsYUFBYSxFQUFFLElBQUksa0JBQWtCLENBQUNBLElBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxhQUFhLENBQXNDLENBQUM7SUFDcEgsZ0JBQWdCLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQ0EsSUFBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGdCQUFnQixDQUFzQyxDQUFDO0lBQzFILGtCQUFrQixFQUFFLElBQUksb0JBQW9CLENBQUNBLElBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxrQkFBa0IsQ0FBc0MsQ0FBQztJQUNoSSx5QkFBeUIsRUFBRSxJQUFJLG9CQUFvQixDQUFDQSxJQUFTLENBQUMsY0FBYyxDQUFDLENBQUMseUJBQXlCLENBQXNDLENBQUM7SUFDOUksb0JBQW9CLEVBQUUsSUFBSSxvQkFBb0IsQ0FBQ0EsSUFBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLG9CQUFvQixDQUFzQyxDQUFDO0lBQ3BJLHdCQUF3QixFQUFFLElBQUksb0JBQW9CLENBQUNBLElBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyx3QkFBd0IsQ0FBc0MsQ0FBQztJQUM1SSxxQkFBcUIsRUFBRSxJQUFJLGtCQUFrQixDQUFDQSxJQUFTLENBQUMsY0FBYyxDQUFDLENBQUMscUJBQXFCLENBQXNDLENBQUM7SUFDcEkscUJBQXFCLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQ0EsSUFBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLHFCQUFxQixDQUFzQyxDQUFDO0lBQ3BJLHVCQUF1QixFQUFFLElBQUksa0JBQWtCLENBQUNBLElBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyx1QkFBdUIsQ0FBc0MsQ0FBQztBQUMzSSxDQUFBLENBQUMsQ0FBQztBQUVILElBQUEsWUFBQSxHQUFnQixFQUFFWSxLQUFBQSxFQUFBQSxPQUFLLEVBQUVWLE1BQUFBLEVBQUFBLFFBQU0sRUFHN0IsQ0FBQTs7QUNoRkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUN2QixJQUFJLFVBQVUsR0FBRyxPQUFPLFlBQVksS0FBSyxXQUFXLEdBQUcsWUFBWSxHQUFHLEtBQUssQ0FBQztBQUM1RSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsa0JBQWtCLENBQUMsSUFBSSxFQUFFO0FBQ3pDLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FBQztBQUNwQixDQUFDO0FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQzVCLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3BCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNXLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUNELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWTtBQUMxQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDWCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQzNCO0FBQ0EsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO0FBQ2QsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixDQUFDLENBQUE7Ozs7Ozs7Ozs7OztBQ2hERDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsUUFBTSxHQUFHO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSUMsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QztBQUNBLEVBQUUsSUFBSUEsVUFBbUIsSUFBSSxZQUFZLEVBQUU7QUFDM0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM5QyxPQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSThDLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsWUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMvQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksS0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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LEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxjQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN2QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxhQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxLQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3ZCLEVBQUUsT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN4RSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsQ0FBQyxFQUFFO0FBQ3hCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNuQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNwQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlxQixPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFWLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxnQkFBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLHNCQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJQyxLQUFHLEdBQUdiLFVBQVEsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSWMsS0FBRyxHQUFHTixVQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOWF6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNsQixRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQyxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzlDLE9BQUssQ0FBQyxDQUFDLEVBQUU7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJOEMsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFlBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUMvQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNJLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM5QjtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNaLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3ZDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxhQUFXLENBQUMsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNsQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztB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LENBQUM7QUFDM0QsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLHNCQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSCxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUcsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcEIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSXFCLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVB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RyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNFLFlBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN4RSxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNJLEtBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDdEUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNGLFVBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDbEM7QUFDQSxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUNqQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsR0FBRyxNQUFNO0FBQ1QsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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QyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGFBQVcsQ0FBQyxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDeEcsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNiLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ25DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNjLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTYSxpQkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNaLGNBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2EsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDdkMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEM7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xGO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDL0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1osS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzlJLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csZ0JBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msc0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNILGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvSixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNwQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJcUIsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNud0IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJRyxLQUFHLEdBQUdiLFVBQVEsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSWMsS0FBRyxHQUFHTixVQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeHdCekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNsQixRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQyxVQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM5QyxPQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSThDLFVBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsWUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMzRyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksS0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNGLFVBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQ2pCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSSxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEY7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0csRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzFHLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEM7QUFDQSxFQUFFLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDL0UsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQjtBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDYixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RELEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTYixXQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDekIsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUN6QixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3pCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEQsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEQsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2UsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcs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QUM7QUFDZCxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZDtBQUNBLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDOUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDOUM7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUNqQjtBQUNBLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNRLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM5QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM5QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNMLGlCQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUN4QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNaLGNBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtBQUM3QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2Q7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHTyxPQUFnQixFQUFFO0FBQzlCLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWCxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWCxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWCxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEI7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN4QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDeEMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QjtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNXLHlCQUF1QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25EO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFF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Q08sU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN0QyxFQUFFLElBQUksT0FBTyxHQUFHLElBQUkvQixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMzQixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1o7QUFDQSxFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtBQUNqQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN0QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixHQUFHLE1BQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEVBQUU7QUFDekMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixHQUFHLE1BQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFO0FBQzFCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsR0FBRyxNQUFNO0FBQ1QsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN0QixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzNEO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsa0NBQWtDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwRTtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNsQyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzVELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUM1RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDN0QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUNsRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUM5QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQzVELEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLEVBQUUsQ0FBQztBQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZDtBQUNBLEVBQUUsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxRQUFRLEVBQUU7QUFDdkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQ2hDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNsQyxHQUFHLE1BQU07QUFDVCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDeEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1UsSUFBQyxXQUFXLEdBQUcsYUFBYyxDQUFBO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQzVELEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLEVBQUUsQ0FBQztBQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7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R0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzlCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNVLElBQUMsS0FBSyxHQUFHLE9BQVEsQ0FBQTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDbEUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzlCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM5QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztB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LEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDekIsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN6QixFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0I7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDWCxHQUFHLE1BQU07QUFDVCxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFD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R0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTWSxLQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3ZCLEVBQUUsT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN0UCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUgsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNFLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsUyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNwQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSXFCLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENB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QyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNSLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVN3QixRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTM0IsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTNEIsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUM5QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FB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RSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDNUMsRUFBRSxJQUFJLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsRUFBRSxJQUFJLE9BQU8sR0FBRyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM3RSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzdFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDN0UsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMzQyxFQUFFLElBQUksYUFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxJQUFJLHFCQUFxQixHQUFHLGFBQWEsR0FBRyxhQUFhLENBQUM7QUFDNUQsRUFBRSxJQUFJLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxPQUFPLEdBQUcscUJBQXFCLEdBQUcsYUFBYSxDQUFDO0FBQ3RELEVBQUUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxxQkFBcUIsQ0FBQztBQUM5QyxFQUFFLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxZQUFZLEdBQUcsYUFBYSxDQUFDO0FBQ2pELEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzdFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDN0UsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM3RSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUNuQyxFQUFFLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxDQUFDLEdBQUdDLE1BQWUsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzVDLEVBQUUsSUFBSSxDQUFDLEdBQUdBLE1BQWUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDeEMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzlDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDckIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGVBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN6QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEQsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmO0FBQ0E7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDM0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUMzQixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUI7QUFDQSxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUc7QUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRztBQUNoQyxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDakM7QUFDQSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ1osRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ1osRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ1o7QUFDQSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7QUFDWixFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7QUFDWixFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7QUFDWjtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQzFCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzFCLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDeEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2I7QUFDQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JEO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNaLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckI7QUFDQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUN4QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2Q7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFH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RyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTWSxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1IsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTd0IsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTM0IsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM0QixhQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQzlDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsSUFB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QUNPLFNBQVNDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUM7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ25DLEVBQUUsS0FBSyxHQUFHLEtBQUssSUFBSSxHQUFHLENBQUM7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNyQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNiO0FBQ0EsRUFBRSxHQUFHO0FBQ0wsSUFBSSxFQUFFLEdBQUdDLE1BQWUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzNCLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQ3BCO0FBQ0EsRUFBRSxHQUFHO0FBQ0wsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzNCLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQ3BCO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNuQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxlQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNwRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ3BELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDcEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSSxNQUFJLENBQUMsR0FBRyxFQUFFO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsT0FB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QUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUU7QUFDekMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEIsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4QixNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxDQUFDLENBQUM7QUFDYixHQUFHLENBQUM7QUFDSixDQUFDLEVBQUUsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNscEJIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQyxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsVUFBUSxDQUFDLEdBQUcsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDN0MsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO0FBQzFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM5QjtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUdpQixPQUFnQixFQUFFO0FBQzVCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEdBQUcsTUFBTTtBQUNUO0FBQ0EsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksVUFBVSxHQUFHMkIsS0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QixFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3JDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2tCLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDYixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3hCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUNiLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDeEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ2IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUN4QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNuQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM1QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2IsRUFBRWxCLE9BQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDO0FBQ0E7QUFDQSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztBQUMxQztBQUNBLEVBQUUsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDaEQ7QUFDQSxFQUFFLElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRTtBQUNuQixJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQztBQUNuQixJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNiLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ2IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDYixJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNiLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxLQUFLLEdBQUdRLE9BQWdCLEVBQUU7QUFDdEM7QUFDQSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2pELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN6QyxHQUFHLE1BQU07QUFDVDtBQUNBO0FBQ0EsSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNyQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNyQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNyQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzhCLFFBQU0sQ0FBQyxHQUFHLEVBQUU7QUFDNUI7QUFDQTtBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUdDLE1BQWUsRUFBRSxDQUFDO0FBQzdCLEVBQUUsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxDQUFDO0FBQzdCLEVBQUUsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxDQUFDO0FBQzdCLEVBQUUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDdkMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsR0FB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LENBQUM7QUFDekIsSUFBSSxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztBQUN4QjtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDbkMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNuQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25DLEdBQUcsTUFBTTtBQUNUO0FBQ0EsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDeEUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztBQUN6QixJQUFJLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25ELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25ELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25ELEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN4QyxFQUFFLElBQUksU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztBQUN4QyxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDakIsRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDO0FBQ2pCLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2hELEtBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJ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QUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxPQUFPckMsV0FBUyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDL0MsR0FBRyxDQUFDO0FBQ0osQ0FBQyxFQUFFLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xzQkg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM5QyxRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJQyxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWixFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTOUMsT0FBSyxDQUFDLENBQUMsRUFBRTtBQUN6QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUk4QyxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csWUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDM0QsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJSCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsNkJBQTZCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSUEsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHO0FBQ25CLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHO0FBQ25CLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDcEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuRCxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUN4QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNqQztBQUNBLEVBQUUsSUFBSSxLQUFLLEdBQUdtRixRQUFXLEVBQUUsQ0FBQztBQUM1QixFQUFFQyxXQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUlwRixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLEVBQUVxRixnQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3BGLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csS0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFH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QyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ25ELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3BELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsRUFBRUMsU0FBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xELEVBQUVDLFNBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNsRCxFQUFFQyxTQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1QixFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM5QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVB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LENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNlLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTUCxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekcsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSWEsS0FBRyxHQUFHYixVQUFRLENBQUM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSW1DLEtBQUcsR0FBRzRDLEtBQVEsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzFDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSUYsS0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENB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QUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLElBQUksU0FBUyxHQUFHSCxlQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkM7QUFDQSxFQUFFLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtBQUNyQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3JDLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM5QixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDOUIsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQzlCLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM5QixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTNUIsS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqSSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNJLGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUksQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcEIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlxQixPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlxQixDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE1BQU0sR0FBRztBQUN6QixFQUFFLElBQUksR0FBRyxHQUFHLElBQUluQixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSUEsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQSxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQzlDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxNQUFNLENBQUMsQ0FBQyxFQUFFO0FBQzFCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQjtBQUNBLEVBQUUsSUFBSSxHQUFHLEdB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QUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtB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QUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkU7QUFDQSxFQUFFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO0FBQzVDO0FBQ0EsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNB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QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxRQUFRLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLFFBQVEsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0UsUUFBUSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlFO0FBQ0E7QUFDQSxJQUFJLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQ3hELFFBQVEsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDekQ7QUFDQSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLO0FBQ3JCLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDdEI7QUFDQTtBQUNBLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO0FBQ2pELFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUk7QUFDNUMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDdkQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNwQjtBQUNBLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUk7QUFDNUMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDdkQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDN0IsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSTtBQUM1QyxZQUFZLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUN2RCxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtBQUM3QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJO0FBQzVDLFlBQVksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3ZELFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7QUFDdkQsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEIsSUFBSSxHQUFHO0FBQ1AsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSTtBQUN0QixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztBQUM1QjtBQUNBLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDeEc7QUFDQSxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN0QyxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN0QyxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN0QztBQUNBO0FBQ0EsWUFBWSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsWUFBWSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CO0FBQ0EsWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztBQUMxQixTQUFTO0FBQ1QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNuQixLQUFLLFFBQVEsQ0FBQyxLQUFLLEtBQUssRUFBRTtBQUMxQjtBQUNBLElBQUksT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUNqRTtBQUNBLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2xCLElBQUksR0FBRztBQUNQLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDNUIsUUFBUSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFO0FBQzdCLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUN0RDtBQUNBLGdCQUFnQixJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNDO0FBQ0E7QUFDQSxnQkFBZ0IsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVDLGdCQUFnQixDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUM7QUFDQTtBQUNBLGdCQUFnQixZQUFZLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNyRSxnQkFBZ0IsWUFBWSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckUsZ0JBQWdCLE9BQU87QUFDdkIsYUFBYTtBQUNiLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDdkIsU0FBUztBQUNULFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDbkIsS0FBSyxRQUFRLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDMUIsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7QUFDM0QsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO0FBQ2xCLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQztBQUNqQztBQUNBLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDeEQsUUFBUSxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNyQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ25FLFFBQVEsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEQsUUFBUSxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3BELFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN0QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDekI7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3ZDLFFBQVEsU0FBUyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkQsUUFBUSxTQUFTLEdBQUcsWUFBWSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUQsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3hCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO0FBQ3hDLElBQUksSUFBSSxNQUFNLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDakIsUUFBUSxPQUFPLFNBQVMsQ0FBQztBQUN6QixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkQ7QUFDQTtBQUNBLElBQUksSUFBSSxjQUFjLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0QsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwRDtBQUNBO0FBQ0EsSUFBSSxPQUFPLFNBQVMsS0FBSyxNQUFNLEdBQUcsY0FBYyxHQUFHLFNBQVMsQ0FBQztBQUM3RCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7QUFDekMsSUFBSSxJQUFJLENBQUMsR0FBRyxTQUFTO0FBQ3JCLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ25CLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ25CLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtBQUN0QixRQUFRLENBQUMsQ0FBQztBQUNWO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRztBQUNQLFFBQVEsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM3RCxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNFLFlBQVksSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7QUFDbkMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdkIsZ0JBQWdCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRTtBQUM5QixvQkFBb0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM3QyxvQkFBb0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3ZELGlCQUFpQjtBQUNqQixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDaEQsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ25CLEtBQUssUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQzlCO0FBQ0EsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3hCO0FBQ0EsSUFBSSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQztBQUNoQixRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoQixRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoQixRQUFRLE1BQU0sR0FBRyxRQUFRO0FBQ3pCLFFBQVEsR0FBRyxDQUFDO0FBQ1o7QUFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDVjtBQUNBLElBQUksR0FBRztBQUNQLFFBQVEsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDaEQsZ0JBQWdCLGVBQWUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNqRztBQUNBLFlBQVksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xEO0FBQ0EsWUFBWSxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQ3RDLGlCQUFpQixHQUFHLEdBQUcsTUFBTSxLQUFLLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNsSCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixnQkFBZ0IsTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUM3QixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNuQixLQUFLLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRTtBQUN6QjtBQUNBLElBQUksT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDaEQsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEIsSUFBSSxHQUFHO0FBQ1AsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3pCLFFBQVEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3pCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDbkIsS0FBSyxRQUFRLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDMUI7QUFDQSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN6QixJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ25CO0FBQ0EsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRTtBQUMxQixJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUs7QUFDakQsUUFBUSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ25CO0FBQ0EsSUFBSSxHQUFHO0FBQ1AsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLFFBQVEsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNwQixRQUFRLElBQUksR0FBRyxJQUFJLENBQUM7QUFDcEIsUUFBUSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCO0FBQ0EsUUFBUSxPQUFPLENBQUMsRUFBRTtBQUNsQixZQUFZLFNBQVMsRUFBRSxDQUFDO0FBQ3hCLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQixZQUFZLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDdEIsWUFBWSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxnQkFBZ0IsS0FBSyxFQUFFLENBQUM7QUFDeEIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzVCLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU07QUFDOUIsYUFBYTtBQUNiLFlBQVksS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUMzQjtBQUNBLFlBQVksT0FBTyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDbEQ7QUFDQSxnQkFBZ0IsSUFBSSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDdEUsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2hDLG9CQUFvQixLQUFLLEVBQUUsQ0FBQztBQUM1QixpQkFBaUIsTUFBTTtBQUN2QixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDaEMsb0JBQW9CLEtBQUssRUFBRSxDQUFDO0FBQzVCLGlCQUFpQjtBQUNqQjtBQUNBLGdCQUFnQixJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztBQUN6QyxxQkFBcUIsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUM5QjtBQUNBLGdCQUFnQixDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUMvQixnQkFBZ0IsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN6QixhQUFhO0FBQ2I7QUFDQSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEIsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUMxQixRQUFRLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFDcEI7QUFDQSxLQUFLLFFBQVEsU0FBUyxHQUFHLENBQUMsRUFBRTtBQUM1QjtBQUNBLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQzNDO0FBQ0EsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDckMsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDckM7QUFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ3BDO0FBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUNwQztBQUNBLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFFO0FBQzVCLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSztBQUNqQixRQUFRLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDekIsSUFBSSxHQUFHO0FBQ1AsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUN2RixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ25CLEtBQUssUUFBUSxDQUFDLEtBQUssS0FBSyxFQUFFO0FBQzFCO0FBQ0EsSUFBSSxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDekQsSUFBSSxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQzdELFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFDN0QsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzRSxZQUFZLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1RSxhQUFhLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNELFlBQVksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdkIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN4QixJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0EsSUFBSSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQztBQUM1QztBQUNBLElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFD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R0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRTtBQUMxRCxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsS0FBSztBQUNMLElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBQ0Q7QUFDQTtBQUNBLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxJQUFJLEVBQUU7QUFDakMsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUMvQixRQUFRLE1BQU0sR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDO0FBQzNELFFBQVEsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUN0QjtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqRCxZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUUsU0FBUztBQUNULFFBQVEsSUFBSSxD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LFFBQVEsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDMUMsU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDcEQsQ0FBQTs7QUM3RU8sTUFBTSx3QkFBd0IsR0FBRztBQUNwQyxJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLElBQUksRUFBRSxHQUFHO0FBQ1QsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztDQUNYLENBQUM7QUFFc0IsU0FBQSxzQkFBc0IsQ0FBQyxLQUFhLEVBQUE7SUFDeEQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBRWhCLElBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkMsUUFBQSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDckQsUUFBQSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7UUFFckQsTUFBTSxxQkFBcUIsSUFDdkIsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLGlDQUFpQyxDQUFDLFlBQVksQ0FBQyxJQUFJLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0csYUFBQSxDQUFDLFlBQVksSUFBSSxDQUFDLGlDQUFpQyxDQUFDLFlBQVksQ0FBQyxJQUFJLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNoSCxDQUFDO1FBRUYsSUFBSSxxQkFBcUIsSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM3RCxNQUFNLElBQUksd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEQsU0FBQTtBQUFNLGFBQUE7QUFDSCxZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUE7O0FDNUdBO0FBRUEsSUFBQSxNQUFBLEdBQWUsRUFBRSxDQUFBOzs7Ozs7QUNEakIsSUFBWSxJQUFBLEdBQUErSCxTQUFBLENBQUEsSUFBQSxHQUFHLFVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtBQUM3RCxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUNWLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUE7QUFDcEMsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFBO0FBQzVCLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQTtBQUN2QixFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ2hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDNUI7QUFDQSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDUjtBQUNBLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQy9CLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDaEIsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFBO0FBQ2YsRUFBRSxPQUFPLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQzlFO0FBQ0EsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDL0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNoQixFQUFFLEtBQUssSUFBSSxJQUFJLENBQUE7QUFDZixFQUFFLE9BQU8sS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUU7QUFDOUU7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUE7QUFDakIsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtBQUN6QixJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDO0FBQzlDLEdBQUcsTUFBTTtBQUNULElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFBO0FBQ2pCLEdBQUc7QUFDSCxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pELENBQUMsQ0FBQTtBQUNEO0FBQ0EsSUFBQSxLQUFBLEdBQUFBLFNBQUEsQ0FBQSxLQUFhLEdBQUcsVUFBVSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtBQUNyRSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDYixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFBO0FBQ3BDLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQTtBQUM1QixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUE7QUFDdkIsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUNsRSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDN0Q7QUFDQSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3pCO0FBQ0EsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQzFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQzVCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQTtBQUNaLEdBQUcsTUFBTTtBQUNULElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDOUMsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMzQyxNQUFNLENBQUMsRUFBRSxDQUFBO0FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ1osS0FBSztBQUNMLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsRUFBRTtBQUN4QixNQUFNLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ3JCLEtBQUssTUFBTTtBQUNYLE1BQU0sS0FBSyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7QUFDMUMsS0FBSztBQUNMLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN4QixNQUFNLENBQUMsRUFBRSxDQUFBO0FBQ1QsTUFB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QUFJLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxPQUFPO0FBQ3hHLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ3BELEtBQUs7QUFDTDtBQUNBLElBQUksWUFBWSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNELEtBQUs7QUFDTDtBQUNBLElBQUksWUFBWSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUMvQixRQUFRLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckM7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQjtBQUNBLFFBQVEsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUNoQztBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUM7QUFDdEM7QUFDQSxRQUFRLElBQUksR0FB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Q0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7QUFDMUcsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO0FBQzFHLFNBQVMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtBQUMxRyxTQUFTLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7QUFDMUcsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQzFHLFNBQVMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcs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Q0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDN0U7QUFDQTtBQUNBLElBQUksTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzlEO0FBQ0EsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDbkI7QUFDQSxJQUFJLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFO0FBQzdCO0FBQ0EsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDckQsWUFBWSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEM7QUFDQTtBQUNBLFlBQVksSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM1QjtBQUNBLFlBQVksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELFlBQVksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25EO0FBQ0EsWUFB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LENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDOztBQUVoRSxZQUFBLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDeEYsWUFBQSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQU0sQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDeEYsWUFBQSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ3hGLFlBQUEsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQU0sQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFD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QUFDLENBQUMsR0FBRyxVQUFVO1lBQzlDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVU7U0FDakQsQ0FBQztBQUNMLEtBQUE7Ozs7QUFNRCxJQUFBLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO0FBQzdDLElBQUEsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7QUFFL0MsSUFBQSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQztBQUM3QixJQUFBLElBQUksT0FBTyxLQUFLLE9BQU8sSUFBSSxPQUFPLEtBQUssTUFBTSxFQUFFOztBQUUzQyxRQUFBLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxRQUFBLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxLQUFBO0FBQU0sU0FBQTs7QUFFSCxRQUFBLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsU0FBUyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pFLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxLQUFBO0FBRUQsSUFBQSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQztBQUMzQyxJQUFBLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBQ2pELElBQUEsSUFBSSxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7O0FBRTVDLFFBQUEsR0FBRyxHQUFHLFVB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QkFBQSxFQUFBLFlBQWlDLEVBQ2pDLFNBQW9CLEdBQUEsQ0FBQyxFQUNyQixLQUFBLEdBQWlCLEtBQUssRUFBQTs7QUFHdEIsSUFBQSxJQUFJLElBQUksR0FBRyxRQUFRLEVBQUUsSUFBSSxHQUFHLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDO0FBQ3pFLElBQUEsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLElBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdkMsUUFBQSxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBQSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUFFLFlBQUEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUFFLFlBQUEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUFFLFlBQUEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUFFLFlBQUEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsS0FBQTtBQUVELElBQUEsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQixJQUFBLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDM0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekMsSUFBQSxJQUFJLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDOztJQUdyQixNQUFNLFNBQVMsR0FBRyxJQUFJZ0ssU0FBSyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUU1QyxJQUFJLFFBQVEsS0FBSyxDQUFDO0FBQUUsUUFBQSxPQUFPLElBQUloSyxhQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztBQUdqRCxJQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRTtBQUN4QyxRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRTtBQUN4QyxZQUFBLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzNELFNBQUE7QUFDSixLQUFBOztBQUdELElBQUEsSUFBSSxRQUFRLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzdDLElBQUEsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUVqQyxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUU7O0FBRXJCLFFBQUEsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDOztBQUc3QixRQUFBLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtZQUNwQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLFlBQUEsSUFBSSxLQUFLO2dCQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN0RyxTQUFBOztRQUdELElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLFNBQVM7WUFBRSxTQUFTOztBQUdqRCxRQUFBLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN0RSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDdEUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN0RSxTQUFTLElBQUksQ0FBQyxDQUFDO0FBQ2xCLEtBQUE7QUFFRCxJQUFBLElBQUksS0FBSyxFQUFFO0FBQ1AsUUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsU0FBUyxDQUFBLENBQUUsQ0FBQyxDQUFDO0FBQ3hDLFFBQUEsT0FB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LENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM1QixRQUFBLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUV0SCxRQUFBLE1BQU0sU0FBUyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsUUFBQSxPQUFPLFNBQVMsQ0FBQztBQUNwQixLQUFBO0FBRUQ7Ozs7Ozs7O0FBUUc7SUFDSCxRQUFRLENBQUMsTUFBaUIsR0FBQSxDQUFDLEVBQUE7UUFDdkIsTUFBTSxtQ0FBbUMsR0FBRyxRQUFRLENBQUM7QUFDckQsUUFBQSxNQUFNLFdBQVcsR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLG1DQUFtQyxFQUNsRSxXQUFXLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFckUsUUFBQSxPQUFPLElBQUlDLGNBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxFQUM5RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxD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QUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLFFBQUEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzlDLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDOzs7O1FBS3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O1lBRTFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFekQsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUV6RCxZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLFNBQUE7O0FBRUQsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakUsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNFLEtBQUE7QUFFRCxJQUFBLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFBO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEQsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFB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SUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFELElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtBQUNsRDtBQUNBLElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSSxFQUFFO0FBQ3pCLFFBQVEsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUNoQyxZQUFZLE1BQU0sQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLFlBQVksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbkMsWUFBWSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLFlBQVksTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRCxZQUFZLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RixZQUFZLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUks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QUFDakUsUUFBUSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEU7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2hELFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixZQUFZLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLFlBQVksTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hELFNBQVM7QUFDVDtBQUNBLFFBQVFDLE1BQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUQsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQ2xDLFFBQVEsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkYsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEIsUUFBUSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFD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WSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQztBQUNBO0FBQ0EsWUFBWSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEQsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNyRjtBQUNBLFlBQVksSUFBSSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNwRyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDL0M7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDNUIsUUFBUSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDL0QsUUFBUSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUQsUUFBUSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdB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QUUsU0FBUyxDQUFDLENBQUM7QUFDdEMsSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QjtBQUNBLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDdkIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQ3hELElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDM0MsUUFBUSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7QUFDdEIsUUFBUSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDMUQsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDckIsSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLENBQUM7QUFDRDtBQUNBLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUNyQixJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUMsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FB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QUFDdEMsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUU7QUFDeEU7QUFDQSxJQUFJLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUN6RCxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDekIsSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDbEI7QUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2pELFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QixRQUFRLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0IsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QixRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNyQyxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNyQyxRQUFRLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztB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QUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hEO0FBQ0E7QUFDQSxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUM1QixJQUFJLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzlGLFFBQVEsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDdEIsUUFBUSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUU7QUFDeEIsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDbkIsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDM0IsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDN0IsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDekIsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUMzRCxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ25FLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDNUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxD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QUFDaEIsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUNmLEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDOUMsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDM0IsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDMUQ7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEMsUUFBUSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEM7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0MsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQy9DLFFBQVEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMvQyxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0MsS0FBSztBQUNMLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVB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LENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEYsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEYsWUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxLQUFLLEVBQUU7QUFDbkIsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkYsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkYsWUFBWSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbkQ7QUFDQSxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUs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QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDakYsWUFBQUEscUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFNLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ2pGLFlBQUFBLHFCQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDakYsWUFBQUEscUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQU0sQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ3BGLFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLEtBQUE7QUFFRCxJQUFBLFVBQVUsR0FBQTtBQUNOLFFBQUEsSUFBSSxDQUFDLDJC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QUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9GO0FBQ0EsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3RDLFlBQVksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM5RSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sS0FBSyxDQUFDO0FBQ3JCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdELElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEcsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0RCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNoQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEI7QUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ25ELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLEdBQUc7QUFDWCxZQUFZLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6RCxTQUFTLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUN4QztBQUNBLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDWixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdkIsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUMsUUFBUSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25ELEtBQUs7QUFDTCxDQUFBOztBQ2xIYyxNQUFPLFlBQVksQ0FBQTtBQVk3QixJQUFBLFdBQVksQ0FBQSxjQUE4QixFQUFFLHdCQUF3QyxFQUFBO0FBQ2hGLFFBQUEsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7QUFDckMsUUFBQSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUM7QUFDekQsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNyQixLQUFBO0FBRUQsSUFBQSxNQUFNLENBQUMsR0FBbUIsRUFBQTtBQUN0QixRQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEtBQUE7QUFFRCxJQUFBLFNBQVMsQ0FBQyxNQUVULEVBQUUsUUFJRCxFQUFBO1FBQ0UsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBRWYsUUFBQSxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtBQUN4QixZQUFBLEtBQUssTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7QUFDekIsYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBQyxXQUFRLENBQUEsUUFBQSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBQyxFQUFFLFFBSTFCLEtBQUk7WUFDRixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDUixnQkFBQSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRztBQUMxQixvQkFBQSxNQUFNLEVBQUUsRUFBRTtBQUNWLG9CQUFBLFFBQVEsRUFBRSxFQUFFO0FBQ1osb0JBQUEsTUFBTSxFQUFFLEVBQUU7aUJBQ2IsQ0FBQztBQUNMLGFBQUE7WUFFRCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDckIsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztnQkFDbkMsT0FBTztBQUNWLGFBQUE7WUFFRCxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLFlBQUEsSUFBSSxLQUFLLEVBQUU7QUFDUCxnQkFBQSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDekIsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztnQkFDbkMsT0FBTztBQUNWLGFBQUE7WUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNuQyxZQUFBLElBQUksS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEVBQUU7QUFDckIsZ0JBQUEsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQztnQkFDcEQsT0FBTztBQUNWLGFBQUE7QUFFRCxZQUFBLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDckIsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztnQkFDbkMsT0FBTztBQUNWLGFBQUE7WUFFRCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ1gsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLGdCQUFBLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQ25FLENBQUMsR0FBRyxFQUFFLFFBRUUsS0FBSTtBQUNSLG9CQUFBLElBQUksUUFBUSxFQUFFO0FBQ1Ysd0JBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUU7NEJBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN2QyxnQ0FBQSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckMsNkJBQUE7QUFDSix5QkFBQTtBQUNELHdCQUFBLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzlCLHFCQUFBO0FBQ0Qsb0JBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUU7QUFDdkIsd0JBQUEsRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNyQixxQkFBQTtBQUNELG9CQUFBLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqQyxpQkFBQyxDQUFDLENBQUM7QUFDVixhQUFBO0FBRUQsWUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BRVosS0FBSTtBQUNSLGdCQUFBLElBQUksR0FBRyxFQUFFO29CQUNMLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixpQkFBQTtBQUFNLHFCQUFBLElBQUksTUFBTSxFQUFFO0FBQ2Ysb0JBQUEsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0FBQzFELGlCQUFBO0FBQ0wsYUFBQyxDQUFDLENBQUM7QUFDUCxTQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFJQSxLQUFJO0FBQ1QsWUFBQSxJQUFJLEdBQUcsRUFBRTtnQkFDTCxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsYUFBQTtBQUFNLGlCQUFBLElBQUksTUFBTSxFQUFFO2dCQUNmLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFFbEIsS0FBSyxNQUFNLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUMsSUFBSSxNQUFNLEVBQUU7O0FBRXJDLG9CQUFBLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLElBQUk7d0JBQ25ELEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtBQUNaLHdCQUFBLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTt3QkFDNUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO3FCQUN6QixDQUFDO0FBQ0wsaUJBQUE7QUFFRCxnQkFBQSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzFCLGFBQUE7QUFDTCxTQUFDLENBQUMsQ0FBQztBQUNOLEtBQUE7QUFFRCxJQUFBLDBCQUEwQixDQUFDLEVBQVUsRUFBQTs7QUFFakMsUUFBQSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCO0FBQ2xDLGFBQUNoTSw4QkFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pDLGdCQUFBQSw4QkFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzlCLGdCQUFBQSw4QkFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN0QixnQkFBQUEsV0FBQUEsQ0FBQUEsa0JBQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztBQUVuQyxLQUFBO0FBRUQsSUFBQSxRQUFRLENBQUMsS0FBWSxFQUFFLEtBQWEsRUFBRSxFQUFVLEVBQUE7QUFDNUMsUUFBQSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7UUFDakQsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNiLE9BQU87QUFDVixTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3RDLE9BQU87QUFDVixTQUFBO0FBRUQsUUFBQSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDVixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDdkIsWUFBQSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3JCLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDdEIsYUFBQTtBQUFNLGlCQUFBLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDOUIsVUFBVSxHQUFHLEtBQUssQ0FBQztBQUN0QixhQUFBO0FBQU0saUJBQUEsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM3QixVQUFVLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLGFBQUE7WUFDRCxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUM7QUFDL0MsZ0JBQUEsUUFBUSxFQUFFLEVBQUU7QUFDWixnQkFBQSxNQUFNLEVBQUUsQ0FBQztBQUNULGdCQUFBLE1BQU0sRUFBRSxDQUFDO0FBQ1QsZ0JBQUEsTUFBTSxFQUFFLElBQUk7Z0JBQ1osVUFBVTtnQkFDVixVQUFVO0FBQ2IsYUFBQSxDQUFDLENBQUM7QUFDTixTQUFBO0FBRUQsUUFBQSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVuRDs7Ozs7Ozs7Ozs7O0FBWUc7UUFDSCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFFekIsT0FBTztZQUNILEVBQUU7WUFDRixNQUFNLEVBQUUsSUFBSTJKLFdBQUFBLENBQUFBLFVBQVUsQ0FBQyxFQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3ZGLFlBQUEsT0FBTyxFQUFFO0FBQ0wsZ0JBQUEsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRTtBQUM1QixnQkFBQSxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFO0FBQzlCLGdCQUFBLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUM7Z0JBQ3pCLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLGFBQWEsSUFBSSxDQUFDLENBQUM7QUFDeEMsZ0JBQUEsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRTtBQUNuQyxhQUFBO1NBQ0osQ0FBQztBQUNMLEtBQUE7O0FBOUxEO0FBQ08sWUFBYyxDQUFBLGNBQUEsR0FBRyxjQUFjLENBQUM7QUFDaEMsWUFBTyxDQUFBLE9BQUEsR0FBRyxPQUFPLENBQUE7O0FDTjVCLE1BQU0scUJBQXFCLENBQUE7QUFHdkIsSUFBQSxXQUFBLEdBQUE7UUFDSSxJQUFJLENBQUMsYUFBYSxHQUFHeEosV0FBQUEsQ0FBQUEsSUFBUyxDQUFDLEtBQUssQ0FBQyxRQUFzQyxDQUFDO0FBQy9FLEtBQUE7QUFFRCxJQUFBLGdCQUFnQixDQUNaLEtBQTZELEVBQzdELFVBQWdDLEVBQUE7UUFFaEMsT0FBTzhMLFdBQUFBLENBQUFBLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDdEUsS0FBQTtBQUVELElBQUEsV0FBVyxDQUFDLENBQWdCLEVBQUUsQ0FBZ0IsRUFBRSxDQUFTLEVBQUE7UUFDckQsT0FBTztBQUNILFlBQUEsQ0FBQyxFQUFFNUQsV0FBVyxDQUFBLE1BQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzNCLFlBQUEsQ0FBQyxFQUFFQSxXQUFXLENBQUEsTUFBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0IsWUFBQSxDQUFDLEVBQUVBLFdBQVcsQ0FBQSxNQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM5QixDQUFDO0FBQ0wsS0FBQTtBQUNKLENBQUE7QUFnQkQsTUFBTSxVQUFVLEdBQXNCLElBQUk2RCxXQUFBQSxDQUFBQSxVQUFVLENBQUM7SUFDakQsUUFBUSxFQUFFLElBQUlDLFdBQW9CLENBQUEsb0JBQUEsQ0FBQ2hNLGdCQUFTLENBQUMsS0FBSyxDQUFDLE1BQW9DLENBQUM7SUFDeEYsVUFBVSxFQUFFLElBQUkscUJBQXFCLEVBQUU7SUFDdkMsT0FBTyxFQUFFLElBQUlnTSxXQUFvQixDQUFBLG9CQUFBLENBQUNoTSxnQkFBUyxDQUFDLEtBQUssQ0FBQyxLQUFtQyxDQUFDO0lBQ3RGLFdBQVcsRUFBRSxJQUFJZ00sV0FBb0IsQ0FBQSxvQkFBQSxDQUFDaE0sZ0JBQVMsQ0FBQyxLQUFLLENBQUMsU0FBdUMsQ0FBQztBQUNqRyxDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDO0FBRXhDOztBQUVHO0FBQ0gsTUFBTSxLQUFNLFNBQVF3TCxXQUFBQSxDQUFBQSxPQUFPLENBQUE7QUFLdkIsSUFBQSxXQUFBLENBQVksWUFBaUMsRUFBQTtBQUN6QyxRQUFBLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJUywwQkFBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3RELFFBQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDL0QsS0FBQTtBQUVELElBQUEsUUFBUSxHQUFBO0FBQ0osUUFBQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDM0MsS0FBQTtBQUVELElBQUEsUUFBUSxDQUFDLEtBQTBCLEVBQUUsT0FBQSxHQUE4QixFQUFFLEVBQUE7UUFDakUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDdE0sV0FBQUEsQ0FBQUEsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRTtZQUMvQyxPQUFPO0FBQ1YsU0FBQTtBQUVELFFBQUEsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7QUFDdEIsWUFBQSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsWUFBQSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRTtBQUNsQyxnQkFBQSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0RyxhQUFBO0FBQU0saUJBQUE7Z0JBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM3RCxhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLGlCQUFpQixDQUFDLFVBQWdDLEVBQUE7QUFDOUMsUUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDNUYsS0FBQTtBQUVELElBQUEsYUFBYSxHQUFBO0FBQ1QsUUFBQSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7QUFDOUMsS0FBQTtBQUVELElBQUEsV0FBVyxDQUFDLFVBQWdDLEVBQUE7UUFDeEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3RFLEtBQUE7QUFFRCxJQUFBLFNBQVMsQ0FBQyxRQUFrQixFQUFFLEtBQWMsRUFBRSxPQUU3QyxFQUFBO0FBQ0csUUFBQSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRTtBQUN2QyxZQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLFNBQUE7UUFFRCxPQUFPdU0sV0FBQUEsQ0FBQUEsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUNDLFdBQUFBLENBQUFBLGFBQWEsRUFBRW5PLFdBQUFBLENBQUFBLE1BQU0sQ0FBQztZQUNsRSxLQUFLOztZQUVMLEtBQUssRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQzt1QkFDbkNnQyxXQUFTLENBQUEsSUFBQTtTQUNaLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUixLQUFBO0FBQ0osQ0FBQTs7QUNySUQ7Ozs7Ozs7O0FBUUc7QUFDSCxNQUFNLFNBQVMsQ0FBQTtBQVVYLElBQUEsV0FBWSxDQUFBLEtBQWEsRUFBRSxNQUFjLEVBQUE7QUFDckMsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNuQixRQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3JCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFFakIsUUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXJELFFBQUEsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDdkIsS0FBQTtBQUVEOzs7Ozs7O0FBT0c7QUFDSCxJQUFBLE9BQU8sQ0FBQyxTQUF3QixFQUFFLEtBQWMsRUFBQTtBQUM1QyxRQUFBLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRWhELFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDdEIsWUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hELFNBQUE7QUFDRCxRQUFBLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QixLQUFBO0FBRUQsSUFBQSxhQUFhLENBQUMsU0FBd0IsRUFBRSxjQUFzQixFQUFFLE9BQWUsRUFBQTs7O1FBRzNFLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFFbEIsUUFBQSxJQUFJLElBQUksR0FBRyxZQUFZLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ3pFLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDbkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRWxCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLENBQUM7QUFFbkUsUUFBQSxJQUFJLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUVqQixZQUFBLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxZQUFBLElBQUksR0FBRyxpQkFBaUIsR0FBRyxPQUFPLENBQUM7WUFDbkMsaUJBQWlCLElBQUksVUFBVSxDQUFDO0FBQ2hDLFlBQUEsS0FBSyxHQUFHLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUVwQyxZQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxLQUFLLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDcEUsU0FBQTtBQUVELFFBQUEsT0FBTyxNQUFNLENBQUM7QUFDakIsS0FBQTtBQUVELElBQUEsWUFBWSxDQUFDLE1BQVcsRUFBRSxPQUFlLEVBQUUsQ0FBUyxFQUFBO0FBQ2hELFFBQUEsTUFBTSxXQUFXLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUVoQyxRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakMsWUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUMvQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDbEIsWUFBQSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFOUIsWUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqQyxnQkFBQSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTtBQUFFLG9CQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUFFLGlCQUFBO0FBRXpELGdCQUFBLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQyxnQkFBQSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzlDLGdCQUFBLElBQUksY0FBYyxDQUFDO2dCQUVuQixNQUFNLFVBQVUsR0FBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO29CQUNkLE1BQU0sUUFBUSxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3BELG9CQUFBLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZFLGlCQUFBO0FBQU0scUJBQUE7QUFDSCxvQkFBQSxjQUFjLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDekYsaUJBQUE7Z0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsY0FBYyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0UsYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxjQUFjLENBQUMsTUFBVyxFQUFBOzs7QUFJdEIsUUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDekMsWUFBQSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDakIsZ0JBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkIsYUFBQTtpQkFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDNUMsZ0JBQUEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3RCLGdCQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLGFBQUE7QUFDSixTQUFBOztBQUdELFFBQUEsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFFBQUEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDOUIsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDekMsU0FBQTtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN4QyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDbEIsUUFBQSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFOUIsUUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqQyxZQUFBLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO0FBQ3JCLGdCQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvQixhQUFBO0FBRUQsWUFBQSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUMsWUFBQSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDOUMsWUFBQSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUV6RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzRSxTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsT0FBTyxDQUFDLFNBQXdCLEVBQUUsS0FBYyxFQUFBO0FBQzVDLFFBQUEsTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6QixJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDckM4SixXQUFRLENBQUEsUUFBQSxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDbkMsWUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLFNBQUE7UUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZixRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQUUsWUFBQSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUUsU0FBQTtRQUV0RSxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDZCxZQUFBLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBQ3BDLFlBQUEsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUVsRSxZQUFBLElBQUksS0FBSyxFQUFFO2dCQUNQLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QyxhQUFBO0FBQU0saUJBQUE7QUFDSCxnQkFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9CLGFBQUE7QUFDSixTQUFBO0FBRUQsUUFBQSxNQUFNLFNBQVMsR0FBRztBQUNkLFlBQUEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNO0FBQ3pDLFlBQUEsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU07QUFDM0IsWUFBQSxLQUFLLEVBQUUsTUFBTTtTQUNoQixDQUFDO0FBRUYsUUFBQSxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQztBQUN2QixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBRWxCLFFBQUEsT0FBTyxTQUFTLENBQUM7QUFDcEIsS0FBQTtBQUVELElBQUEsSUFBSSxDQUFDLE9BQWdCLEVBQUE7QUFDakIsUUFBQSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDZixZQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDNUMsWUFBQSxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUQsWUFBQSxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUQsWUFBQSxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsRSxZQUFBLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xFLFlBQUEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUVoSCxTQUFBO0FBQU0sYUFBQTtZQUNILEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFNUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ1osZ0JBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDbkIsZ0JBQUEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVHLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUNKLENBQUE7O0FDdk1EOzs7OztBQUtHO0FBQ0gsTUFBTSxVQUFVLENBQUE7QUFXWixJQUFBLFdBQVksQ0FBQSxVQUFzQixFQUFFLE1BQVcsRUFBQTtBQUMzQyxRQUFBLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxFQUFFLEdBQUdzQyxXQUFBQSxDQUFBQSxRQUFRLEVBQUUsQ0FBQztBQUNyQixRQUFBLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNqRCxRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3JDLFlBQUEsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFlBQUEsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzVELFlBQUEsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFVLE9BQUEsRUFBQSxDQUFDLENBQUEsQ0FBRSxDQUFDO0FBQzNCLFlBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0IsU0FBQTtBQUNELFFBQUEvTixXQUFBQSxDQUFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QixLQUFBO0FBRUQ7OztBQUdHO0FBQ0gsSUFBQSxTQUFTLENBQUMsSUFBWSxFQUFFLElBQWEsRUFBRSxFQUE0QixFQUFBO0FBQy9ELFFBQUFBLFdBQUFBLENBQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLFFBQUEsRUFBRSxHQUFHLEVBQUUsSUFBSSxZQUFBLEdBQWMsQ0FBQztRQUMxQndOLFdBQVEsQ0FBQSxRQUFBLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEtBQUk7WUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2hDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVixLQUFBO0FBRUQ7OztBQUdHO0FBQ0gsSUFBQSxRQUFRLEdBQUE7QUFDSixRQUFBeE4sV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDM0IsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6QyxLQUFBO0FBRUQsSUFBQSxNQUFNLEdBQUE7QUFDRixRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFPLEVBQUEsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BELFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLEtBQUE7QUFDSixDQUFBO0FBRUQsVUFBVSxDQUFDLEtBQUssR0FBRytNLFdBQUssQ0FBQSxLQUFBLENBQUE7O0FDekRWLFNBQUEsWUFBQSxFQUFVLE9BQVksRUFBRSxjQUE4QixFQUFFLFFBQTRCLEVBQUE7QUFDOUYsSUFBQSxNQUFNLE1BQU0sR0FBRyxVQUFTLEdBQVUsRUFBRSxRQUFhLEVBQUE7QUFDN0MsUUFBQSxJQUFJLEdBQUcsRUFBRTtBQUNMLFlBQUEsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsU0FBQTtBQUFNLGFBQUEsSUFBSSxRQUFRLEVBQUU7WUFDakIsTUFBTSxNQUFNLEdBQVFpQixXQUFJLENBQUEsSUFBQTs7WUFFcEJyTyxXQUFNLENBQUEsTUFBQSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFDekIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQzdGLENBQUM7WUFFRixJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUU7QUFDeEIsZ0JBQUEsTUFBTSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO2dCQUM3QyxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFJLEVBQUcsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BGLGFBQUE7QUFFRCxZQUFBLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDMUIsU0FBQTtBQUNMLEtBQUMsQ0FBQztJQUVGLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUNiLFFBQUEsT0FBT21OLFdBQU8sQ0FBQSxPQUFBLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUVHLHdCQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0YsS0FBQTtBQUFNLFNBQUE7QUFDSCxRQUFBLE9BQU94TCxXQUFBQSxDQUFBQSxRQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3JELEtBQUE7QUFDTCxDQUFBOztBQzlCQSxNQUFNLFVBQVUsQ0FBQTtBQUtaLElBQUEsV0FBQSxDQUFZLE1BQXdDLEVBQUUsT0FBdUIsRUFBRSxPQUF1QixFQUFBO0FBQ2xHLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBR21KLHdCQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNoRSxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztBQUM1QixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztBQUNoQyxLQUFBO0FBRUQsSUFBQSxjQUFjLENBQUMsTUFBd0MsRUFBQTs7QUFFbkQsUUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuSCxLQUFBO0FBRUQsSUFBQSxRQUFRLENBQUMsTUFBdUIsRUFBQTtBQUM1QixRQUFBLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QyxRQUFBLE1BQU0sS0FBSyxHQUFHO0FBQ1YsWUFBQSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQ3BLLFdBQWdCLENBQUEsZ0JBQUEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ3JFLFlBQUEsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUNDLFdBQWdCLENBQUEsZ0JBQUEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ3RFLFlBQUEsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUNELFdBQWdCLENBQUEsZ0JBQUEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ3BFLFlBQUEsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUNDLFdBQWdCLENBQUEsZ0JBQUEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO1NBQ3hFLENBQUM7QUFDRixRQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUMvRyxRQUFBLE9BQU8sR0FBRyxDQUFDO0FBQ2QsS0FBQTtBQUNKLENBQUE7O0FDaEJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJHO0FBQ0gsTUFBTSxnQkFBaUIsU0FBUTBNLFdBQUFBLENBQUFBLE9BQU8sQ0FBQTtBQXNCbEMsSUFBQSxXQUFBLENBQVksRUFBVSxFQUFFLE9BRXZCLEVBQUUsVUFBc0IsRUFBRSxhQUFzQixFQUFBO0FBQzdDLFFBQUEsS0FBSyxFQUFFLENBQUM7QUFDUixRQUFBLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2IsUUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUU3QixRQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO0FBQ3JCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNsQixRQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQ3BCLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDcEIsUUFBQSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDMUIsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUVyQixRQUFBeE4sa0JBQU0sQ0FBQyxJQUFJLEVBQUVxTyxXQUFJLENBQUEsSUFBQSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RSxRQUFBLElBQUksQ0FBQyxRQUFRLEdBQUdyTyxrQkFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRWxELFFBQUEsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztBQUU1RCxRQUFBLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxHQUFHLEVBQUU7QUFDdkIsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7QUFDdEUsU0FBQTtBQUVELFFBQUEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3hDLEtBQUE7QUFFRCxJQUFBLElBQUksR0FBQTtBQUNBLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFDckIsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUkwTixpQkFBSyxDQUFDLGFBQWEsRUFBRSxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsUUFBQSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxLQUFJO0FBQzVGLFlBQUEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUM3QixZQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLFlBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNsRCxZQUFBLElBQUksR0FBRyxFQUFFO2dCQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUQsc0JBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLGFBQUE7QUFBTSxpQkFBQSxJQUFJLFFBQVEsRUFBRTtBQUNqQixnQkFBQXpOLGtCQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QixJQUFJLFFBQVEsQ0FBQyxNQUFNO0FBQUUsb0JBQUEsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7O0FBS25HLGdCQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTBOLFdBQUssQ0FBQSxLQUFBLENBQUMsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLGdCQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUEsV0FBSyxDQUFBLEtBQUEsQ0FBQyxNQUFNLEVBQUUsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakYsYUFBQTtBQUNMLFNBQUMsQ0FBQyxDQUFDO0FBQ04sS0FBQTtBQUVELElBQUEsTUFBTSxHQUFBO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3ZCLEtBQUE7QUFFRCxJQUFBLE9BQU8sQ0FBQyxNQUF3QixFQUFBO0FBQzVCLFFBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3pFLEtBQUE7QUFFRCxJQUFBLEtBQUssQ0FBQyxHQUFRLEVBQUE7QUFDVixRQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2YsS0FBQTtBQUVELElBQUEsaUJBQWlCLENBQUMsUUFBa0IsRUFBQTtRQUNoQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtBQUN2QixZQUFBLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNsQyxTQUFBO0FBRUQsUUFBQSxRQUFRLEVBQUUsQ0FBQztRQUVYLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNmLEtBQUE7QUFFRDs7Ozs7QUFLRztBQUNILElBQUEsUUFBUSxDQUFDLEtBQW9CLEVBQUE7QUFDekIsUUFBQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBSztBQUN4QixZQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNoQyxTQUFDLENBQUMsQ0FBQztBQUVILFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBRUQ7Ozs7O0FBS0c7QUFDSCxJQUFBLE1BQU0sQ0FBQyxHQUFXLEVBQUE7QUFDZCxRQUFBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFLO0FBQ3hCLFlBQUEsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDZixZQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM1QixTQUFDLENBQUMsQ0FBQztBQUVILFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBRUQsSUFBQSxRQUFRLEdBQUE7UUFDSixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtBQUN2QixZQUFBLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUMvQixZQUFBLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDaEMsU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLFNBQVMsR0FBQTtRQUNMLE9BQU8xTixXQUFBQSxDQUFBQSxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwQyxLQUFBO0FBRUQsSUFBQSxRQUFRLENBQUMsSUFBVSxFQUFFLFFBQXdCLEVBQUE7UUFDekMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDekYsUUFBQSxNQUFNLE1BQU0sR0FBRztBQUNYLFlBQUEsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRXNOLFdBQVksQ0FBQSxZQUFBLENBQUMsSUFBSSxDQUFDO1lBQzFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtBQUNuQixZQUFBLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVc7WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUU7WUFDdkQsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQ2YsWUFBQSxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUU7QUFDcEMsWUFBQSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQjtZQUMvQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDNUIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBRW5FLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLFNBQUE7QUFBTSxhQUFBLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7O0FBRWpDLFlBQUEsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7QUFDbEMsU0FBQTtBQUFNLGFBQUE7WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLFNBQUE7QUFFRCxRQUFBLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUE7WUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBRXBCLElBQUksSUFBSSxDQUFDLE9BQU87QUFDWixnQkFBQSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUUxQixZQUFBLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO0FBQzNCLGdCQUFBLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLGFBQUE7QUFFRCxZQUFBLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjO0FBQzNCLGdCQUFBLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztBQUU5QyxZQUFBLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSxJQUFJO0FBQUUsZ0JBQUEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRTVDLFlBQUFnQixtQ0FBdUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFekMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWYsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDekMsZ0JBQUEsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDOUIsYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxTQUFTLENBQUMsSUFBVSxFQUFBO1FBQ2hCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNkLFlBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDdkIsU0FBQTtRQUNELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNaLFlBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM5RixTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsVUFBVSxDQUFDLElBQVUsRUFBQTtRQUNqQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDWixZQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDL0YsU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLGFBQWEsR0FBQTtBQUNULFFBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsS0FBQTtBQUNKLENBQUE7O0FDck9ELE1BQU0sZ0JBQWlCLFNBQVFkLFdBQUFBLENBQUFBLE9BQU8sQ0FBQTtBQW9CbEMsSUFBQSxXQUFBLENBQVksRUFBVSxFQUFFLE9BQWlFLEVBQUUsVUFBc0IsRUFBRSxhQUFzQixFQUFBO0FBQ3JJLFFBQUEsS0FBSyxFQUFFLENBQUM7QUFDUixRQUFBLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2IsUUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUM3QixRQUFBLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUVyQyxRQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO0FBQ3JCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNsQixRQUFBLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDcEIsUUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztBQUNwQixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBRXJCLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBR3hOLGtCQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEQsUUFBQUEsa0JBQU0sQ0FBQyxJQUFJLEVBQUVxTyxXQUFBQSxDQUFBQSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUQsS0FBQTtBQUVELElBQUEsSUFBSSxHQUFBO0FBQ0EsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUNyQixRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSVgsaUJBQUssQ0FBQyxhQUFhLEVBQUUsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFELFFBQUEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsS0FBSTtBQUM1RixZQUFBLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDN0IsWUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUNwQixZQUFBLElBQUksR0FBRyxFQUFFO2dCQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUQsc0JBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLGFBQUE7QUFBTSxpQkFBQSxJQUFJLFFBQVEsRUFBRTtBQUNqQixnQkFBQXpOLGtCQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QixJQUFJLFFBQVEsQ0FBQyxNQUFNO0FBQUUsb0JBQUEsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7O0FBS25HLGdCQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTBOLFdBQUssQ0FBQSxLQUFBLENBQUMsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLGdCQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUEsV0FBSyxDQUFBLEtBQUEsQ0FBQyxNQUFNLEVBQUUsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakYsYUFBQTtBQUNMLFNBQUMsQ0FBQyxDQUFDO0FBQ04sS0FBQTtBQUVELElBQUEsTUFBTSxHQUFBO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3ZCLEtBQUE7QUFFRCxJQUFBLEtBQUssQ0FBQyxHQUFRLEVBQUE7QUFDVixRQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2YsS0FBQTtBQUVELElBQUEsUUFBUSxHQUFBO1FBQ0osSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7QUFDdkIsWUFBQSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDL0IsWUFBQSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxTQUFTLEdBQUE7UUFDTCxPQUFPMU4sV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDcEMsS0FBQTtBQUVELElBQUEsT0FBTyxDQUFDLE1BQXdCLEVBQUE7QUFDNUIsUUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekUsS0FBQTtBQUVELElBQUEsUUFBUSxDQUFDLElBQVUsRUFBRSxRQUF3QixFQUFBO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxPQUFPLEdBQUd1TixXQUFRLENBQUEsUUFBQSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRUQsV0FBQUEsQ0FBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEtBQUk7WUFDNUcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBRXBCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNkLGdCQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO2dCQUN4QixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEIsYUFBQTtBQUFNLGlCQUFBLElBQUksR0FBRyxFQUFFO0FBQ1osZ0JBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7Z0JBQ3ZCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixhQUFBO0FBQU0saUJBQUEsSUFBSSxHQUFHLEVBQUU7QUFDWixnQkFBQSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CO0FBQUUsb0JBQUEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQ3pDLGdCQUFBLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDdEIsZ0JBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDZCxvQkFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztBQUMvQyxpQkFBQTtBQUFNLHFCQUFBO29CQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFDckUsb0JBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUV6RSxJQUFJLE9BQU8sQ0FBQywyQkFBMkIsRUFBRTtBQUNyQyx3QkFBQSxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLDJCQUEyQixDQUFDLDBCQUEwQixFQUFFLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBQzNJLHFCQUFBO0FBQ0osaUJBQUE7QUFFRCxnQkFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUV0QixnQkFBQWdCLG1DQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFekMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xCLGFBQUE7QUFDTCxTQUFDLENBQUMsQ0FBQztBQUNOLEtBQUE7QUFFRCxJQUFBLFNBQVMsQ0FBQyxJQUFVLEVBQUUsUUFBd0IsRUFBQTtRQUMxQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDZCxZQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3ZCLFNBQUE7QUFDRCxRQUFBLFFBQVEsRUFBRSxDQUFDO0FBQ2QsS0FBQTtBQUVELElBQUEsVUFBVSxDQUFDLElBQVUsRUFBRSxRQUF3QixFQUFBO1FBQzNDLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pFLFFBQUEsUUFBUSxFQUFFLENBQUM7QUFDZCxLQUFBO0FBRUQsSUFBQSxhQUFhLEdBQUE7QUFDVCxRQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEtBQUE7QUFDSixDQUFBOztBQzlKRCxJQUFJLHVCQUFnQyxDQUFDO0FBRXZCLFNBQVUsd0JBQXdCLEdBQUE7SUFDNUMsSUFBSSx1QkFBdUIsSUFBSSxJQUFJLEVBQUU7QUFDakMsUUFBQSx1QkFBdUIsR0FBRyxPQUFPLGVBQWUsS0FBSyxXQUFXO1lBQzVELElBQUksZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQzFDLE9BQU8saUJBQWlCLEtBQUssVUFBVSxDQUFDO0FBQy9DLEtBQUE7QUFFRCxJQUFBLE9BQU8sdUJBQXVCLENBQUM7QUFDbkMsQ0FBQTs7QUNNQSxNQUFNLG1CQUFvQixTQUFRLGdCQUFnQixDQUFBO0FBRzlDLElBQUEsV0FBQSxDQUFZLEVBQVUsRUFBRSxPQUFxQyxFQUFFLFVBQXNCLEVBQUUsYUFBc0IsRUFBQTtRQUN6RyxLQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDOUMsUUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQztBQUN6QixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBR3RPLGtCQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQztBQUNoRCxLQUFBO0FBRUQsSUFBQSxTQUFTLEdBQUE7UUFDTCxPQUFPO0FBQ0gsWUFBQSxJQUFJLEVBQUUsWUFBWTtZQUNsQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDMUIsQ0FBQztBQUNMLEtBQUE7QUFFRCxJQUFBLFFBQVEsQ0FBQyxJQUFVLEVBQUUsUUFBd0IsRUFBQTtRQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsT0FBTyxHQUFHdU4sV0FBUSxDQUFBLFFBQUEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUVELFdBQVksQ0FBQSxZQUFBLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRW5ILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELFFBQUEsU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBQTtZQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2QsZ0JBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7Z0JBQ3hCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQixhQUFBO0FBQU0saUJBQUEsSUFBSSxHQUFHLEVBQUU7QUFDWixnQkFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztnQkFDdkIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLGFBQUE7QUFBTSxpQkFBQSxJQUFJLEdBQUcsRUFBRTtBQUNaLGdCQUFBLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0I7QUFBRSxvQkFBQSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzRCxPQUFRLEdBQVcsQ0FBQyxZQUFZLENBQUM7Z0JBQ2pDLE9BQVEsR0FBVyxDQUFDLE9BQU8sQ0FBQztnQkFDNUIsTUFBTSxRQUFRLEdBQUdkLFdBQWEsQ0FBQSxhQUFBLENBQUMsR0FBRyxDQUFDLElBQUksd0JBQXdCLEVBQUUsQ0FBQztBQUNsRSxnQkFBQSxNQUFNLFlBQVksR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHMUssV0FBTyxDQUFBLFFBQUEsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25FLGdCQUFBLE1BQU0sTUFBTSxHQUFHO29CQUNYLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztvQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDZixZQUFZO29CQUNaLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDMUIsQ0FBQztnQkFFRixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtvQkFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3hDLG9CQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzNELGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUE7QUFDbEIsWUFBQSxJQUFJLEdBQUcsRUFBRTtBQUNMLGdCQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO2dCQUN2QixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsYUFBQTtBQUVELFlBQUEsSUFBSSxHQUFHLEVBQUU7QUFDTCxnQkFBQSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNmLGdCQUFBLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7QUFDbEMsZ0JBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7Z0JBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQixhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLG9CQUFvQixDQUFDLE1BQXdCLEVBQUE7QUFDekMsUUFBQSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0FBQ25DLFFBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXJDLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3pDLFFBQUEsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUM5RCxRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUN6QyxRQUFBLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBRXBFLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDOztBQUU1QixRQUFBLGdCQUFnQixDQUFDLElBQUk0SixXQUFBQSxDQUFBQSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLENBQUM7QUFDeEgsUUFBQSxnQkFBZ0IsQ0FBQyxJQUFJQSxXQUFBQSxDQUFBQSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLENBQUM7O0FBR3hILFFBQUEsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNqQixZQUFBLGdCQUFnQixDQUFDLElBQUlBLFdBQUFBLENBQUFBLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLENBQUM7QUFDNUgsWUFBQSxnQkFBZ0IsQ0FBQyxJQUFJQSxXQUFnQixDQUFBLGdCQUFBLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDO0FBQzdJLFlBQUEsZ0JBQWdCLENBQUMsSUFBSUEsV0FBQUEsQ0FBQUEsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUMsQ0FBQztBQUMvSCxTQUFBOztBQUVELFFBQUEsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUU7QUFDdkIsWUFBQSxnQkFBZ0IsQ0FBQyxJQUFJQSxXQUFBQSxDQUFBQSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDO0FBQzVILFlBQUEsZ0JBQWdCLENBQUMsSUFBSUEsV0FBZ0IsQ0FBQSxnQkFBQSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUMsQ0FBQztBQUM3SSxZQUFBLGdCQUFnQixDQUFDLElBQUlBLFdBQUFBLENBQUFBLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLENBQUM7QUFDL0gsU0FBQTtBQUVELFFBQUEsT0FBTyxnQkFBZ0IsQ0FBQztBQUMzQixLQUFBO0FBRUQsSUFBQSxVQUFVLENBQUMsSUFBVSxFQUFBO1FBQ2pCLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNWLFlBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDbkIsU0FBQTtRQUNELElBQUksSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7QUFFN0IsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUM7QUFDdEUsU0FBQTtBQUNKLEtBQUE7QUFFSixDQUFBOztBQy9HRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkNHO0FBQ0gsTUFBTSxhQUFjLFNBQVE4QixXQUFBQSxDQUFBQSxPQUFPLENBQUE7QUFvQi9COztBQUVHO0FBQ0gsSUFBQSxXQUFBLENBQVksRUFBVSxFQUFFLE9BQTZCLEVBQUUsVUFBc0IsRUFBRSxhQUFzQixFQUFBO0FBQ2pHLFFBQUEsS0FBSyxFQUFFLENBQUM7QUFFUixRQUFBLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOzs7QUFJYixRQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO0FBRXRCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNsQixRQUFBLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUEsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDMUIsUUFBQSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztBQUV2QixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ25DLFFBQUEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRXJDLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBSSxPQUFPLENBQUMsSUFBWSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUd4TixXQUFBQSxDQUFBQSxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRXBDLFFBQUEsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztBQUU1RCxRQUFBLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTO0FBQUUsWUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDbEUsSUFBSSxPQUFPLENBQUMsSUFBSTtBQUFFLFlBQUEsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzNDLElBQUksT0FBTyxDQUFDLFdBQVc7QUFBRSxZQUFBLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNoRSxRQUFBLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUVuQyxRQUFBLE1BQU0sS0FBSyxHQUFHWSxXQUFBQSxDQUFBQSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7QUFNckMsUUFBQSxJQUFJLENBQUMsYUFBYSxHQUFHWixrQkFBTSxDQUFDO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtBQUNmLFlBQUEsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksS0FBSztBQUNqQyxZQUFBLGdCQUFnQixFQUFFO0FBQ2QsZ0JBQUEsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSztBQUNyRSxnQkFBQSxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxHQUFHLEtBQUssSUFBSSxLQUFLO0FBQ2hGLGdCQUFBLE1BQU0sRUFBRVksV0FBTSxDQUFBLE1BQUE7Z0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO0FBQ3JCLGdCQUFBLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLEtBQUs7QUFDekMsZ0JBQUEsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksS0FBSztBQUMxQyxhQUFBO0FBQ0QsWUFBQSxtQkFBbUIsRUFBRTtBQUNqQixnQkFBQSxPQUFPLEVBQUUsT0FBTyxDQUFDLGNBQWMsS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUM7QUFDekYsZ0JBQUEsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7QUFDckQsZ0JBQUEsTUFBTSxFQUFFQSxXQUFNLENBQUEsTUFBQTtnQkFDZCxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLEVBQUUsSUFBSSxLQUFLO0FBQzdDLGdCQUFBLEdBQUcsRUFBRSxLQUFLO0FBQ1YsZ0JBQUEsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksS0FBSztBQUMxQyxhQUFBO1lBQ0QsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQjtZQUM1QyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07QUFDekIsU0FBQSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUM3QixLQUFBO0FBRUQsSUFBQSxJQUFJLEdBQUE7OztBQUdBLFFBQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3RDLEtBQUE7QUFFRCxJQUFBLEtBQUssQ0FBQyxHQUFRLEVBQUE7QUFDVixRQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2YsS0FBQTtBQUVEOzs7OztBQUtHO0FBQ0gsSUFBQSxPQUFPLENBQUMsSUFBOEIsRUFBQTtBQUNsQyxRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLFFBQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRWxDLFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBRUQ7Ozs7OztBQU1HO0FBQ0gsSUFBQSx1QkFBdUIsQ0FBQyxTQUFpQixFQUFFLFFBQTBCLEVBQUE7QUFDakUsUUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzNGLFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBRUQ7Ozs7OztBQU1HO0FBQ0gsSUFBQSxrQkFBa0IsQ0FBQyxTQUFpQixFQUFFLFFBQTBDLEVBQUE7QUFDNUUsUUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3RGLFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCRztBQUNILElBQUEsZ0JBQWdCLENBQUMsU0FBaUIsRUFBRSxLQUFhLEVBQUUsTUFBYyxFQUFFLFFBQTBDLEVBQUE7QUFDekcsUUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUN4QyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDZixTQUFTO1lBQ1QsS0FBSztZQUNMLE1BQU07U0FDVCxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2IsUUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLEtBQUE7QUFFRDs7OztBQUlHO0FBQ0gsSUFBQSxpQkFBaUIsQ0FBQyxjQUFpQyxFQUFBO1FBQy9DLE1BQU0sT0FBTyxHQUFHWixXQUFBQSxDQUFBQSxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMvQyxRQUFBLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDeEIsUUFBQSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDOEIsb0JBQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUV3TCxXQUFZLENBQUEsWUFBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNHLE9BQU8sQ0FBQyxPQUFPLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO0FBQ3ZFLFNBQUE7QUFBTSxhQUFBO1lBQ0gsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLFNBQUE7UUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7QUFDckIsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlJLGlCQUFLLENBQUMsYUFBYSxFQUFFLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQzs7OztBQUsxRCxRQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRyxJQUFJLENBQUMsSUFBSSxDQUFXLFNBQUEsQ0FBQSxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEtBQUk7WUFDOUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXJCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUMvQyxPQUFPO0FBQ1YsYUFBQTtZQUVELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQztBQUMxQixZQUFBLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pFLGdCQUFBLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7O1lBUTdELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUcsRUFBQSxJQUFJLENBQUMsSUFBSSxDQUFBLFNBQUEsQ0FBVyxFQUFFLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUV6RSxZQUFBLElBQUksR0FBRyxFQUFFO2dCQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUQsc0JBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixPQUFPO0FBQ1YsYUFBQTtZQUVELE1BQU0sSUFBSSxHQUFRLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUMsQ0FBQztZQUN2RCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDO0FBQzFFLGdCQUFBek4sV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFDLGNBQWMsRUFBQyxDQUFDLENBQUM7WUFFbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJME4sV0FBQUEsQ0FBQUEsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFNBQUMsQ0FBQyxDQUFDO0FBQ04sS0FBQTtBQUVELElBQUEsTUFBTSxHQUFBO0FBQ0YsUUFBQSxPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssQ0FBQyxDQUFDO0FBQ25DLEtBQUE7QUFFRCxJQUFBLFFBQVEsQ0FBQyxJQUFVLEVBQUUsUUFBd0IsRUFBQTtBQUN6QyxRQUFBLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLEdBQUcsWUFBWSxDQUFDO0FBQ3hELFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxNQUFNLEdBQUc7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07QUFDbkIsWUFBQSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO1lBQzdCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQ2YsWUFBQSxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUU7QUFDcEMsWUFBQSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQjtZQUMvQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDNUIsQ0FBQztBQUVGLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksS0FBSTtZQUMxRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDcEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFeEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2QsZ0JBQUEsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekIsYUFBQTtBQUVELFlBQUEsSUFBSSxHQUFHLEVBQUU7QUFDTCxnQkFBQSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixhQUFBO0FBRUQsWUFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLENBQUM7QUFFdEUsWUFBQSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixTQUFDLENBQUMsQ0FBQztBQUNOLEtBQUE7QUFFRCxJQUFBLFNBQVMsQ0FBQyxJQUFVLEVBQUE7UUFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2QsWUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN2QixTQUFBO0FBQ0QsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUN2QixLQUFBO0FBRUQsSUFBQSxVQUFVLENBQUMsSUFBVSxFQUFBO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztBQUNwRixLQUFBO0FBRUQsSUFBQSxRQUFRLEdBQUE7QUFDSixRQUFBLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztBQUN2RSxLQUFBO0FBRUQsSUFBQSxTQUFTLEdBQUE7QUFDTCxRQUFBLE9BQU8xTixrQkFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzdCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztBQUNuQixTQUFBLENBQUMsQ0FBQztBQUNOLEtBQUE7QUFFRCxJQUFBLGFBQWEsR0FBQTtBQUNULFFBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsS0FBQTtBQUNKLENBQUE7O0FDOVZELElBQUEsc0JBQUEsR0FBZXVPLHdCQUFZLENBQUM7SUFDeEIsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBQztJQUM3QyxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFDO0FBQ3hELENBQUEsQ0FBQyxDQUFBOztBQ21CRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQ0c7QUFDSCxNQUFNLFdBQVksU0FBUWYsV0FBQUEsQ0FBQUEsT0FBTyxDQUFBO0FBcUI3Qjs7QUFFRztBQUNILElBQUEsV0FBQSxDQUFZLEVBQVUsRUFBRSxPQUF3RixFQUFFLFVBQXNCLEVBQUUsYUFBc0IsRUFBQTtBQUM1SixRQUFBLEtBQUssRUFBRSxDQUFDO0FBQ1IsUUFBQSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNiLFFBQUEsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDN0IsUUFBQSxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFFdkMsUUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUNwQixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDbEIsUUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztBQUNwQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFFckIsUUFBQSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7QUFFckMsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMxQixLQUFBO0FBRUQsSUFBQSxJQUFJLENBQUMsY0FBNEIsRUFBRSxlQUE0QixFQUFBO0FBQzNELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFDckIsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlFLGlCQUFLLENBQUMsYUFBYSxFQUFFLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBRTVCSCxXQUFRLENBQUEsUUFBQSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUVELFdBQUFBLENBQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEtBQUk7QUFDN0YsWUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUNwQixZQUFBLElBQUksR0FBRyxFQUFFO2dCQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUcsc0JBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLGFBQUE7QUFBTSxpQkFBQSxJQUFJLEtBQUssRUFBRTtBQUNkLGdCQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLGdCQUFBLElBQUksY0FBYyxFQUFFO0FBQ2hCLG9CQUFBLElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO0FBQ3JDLGlCQUFBO0FBQ0QsZ0JBQUEsSUFBSSxlQUFlLEVBQUU7QUFDakIsb0JBQUEsZUFBZSxFQUFFLENBQUM7QUFDckIsaUJBQUE7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3pCLGFBQUE7QUFDTCxTQUFDLENBQUMsQ0FBQztBQUNOLEtBQUE7QUFFRCxJQUFBLE1BQU0sR0FBQTtRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN2QixLQUFBO0FBRUQ7Ozs7Ozs7Ozs7O0FBV0c7QUFDSCxJQUFBLFdBQVcsQ0FBQyxPQUdYLEVBQUE7UUFDRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFDN0IsWUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLFNBQUE7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQy9CLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQVEsRUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvRCxRQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsS0FBQTtBQUVELElBQUEsY0FBYyxHQUFBO1FBQ1YsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1YsWUFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0QyxZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUMsV0FBSyxDQUFBLEtBQUEsQ0FBQyxNQUFNLEVBQUUsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEYsU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLEtBQUssQ0FBQyxHQUFRLEVBQUE7QUFDVixRQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2YsS0FBQTtBQUVEOzs7Ozs7OztBQVFHO0FBQ0gsSUFBQSxjQUFjLENBQUMsV0FBd0IsRUFBQTtBQUNuQyxRQUFBLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDOzs7OztRQU8vQixNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDYyxXQUFrQixDQUFBLGtCQUFBLENBQUMsVUFBVSxDQUFDLENBQUM7OztBQUlwRSxRQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsMEJBQTBCLENBQUMsWUFBWSxDQUFDLENBQUM7Ozs7QUFLdkQsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7OztRQUk1QyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFekYsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUlDLFdBQUFBLENBQUFBLGlCQUFpQixFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU3TixXQUFNLENBQUEsTUFBQSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUVBLFdBQU0sQ0FBQSxNQUFBLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVBLFdBQU0sQ0FBQSxNQUFBLEVBQUVBLFdBQU0sQ0FBQSxNQUFBLENBQUMsQ0FBQztRQUVoRixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7QUFDbkIsWUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztBQUM1QixTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk4TSxXQUFLLENBQUEsS0FBQSxDQUFDLE1BQU0sRUFBRSxFQUFDLFFBQVEsRUFBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxRQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsS0FBQTtBQUVELElBQUEsT0FBTyxHQUFBO0FBQ0gsUUFBQSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3JELE9BQU87QUFDVixTQUFBO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQ3pDLFFBQUEsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUV0QixRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO0FBQ3BCLFlBQUEsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyRyxTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUN0QixZQUFBLElBQUksQ0FBQyxjQUFjLEdBQUdnQixXQUFBQSxDQUFBQSxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2YsWUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6RCxZQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ2xELFNBQUE7QUFFRCxRQUFBLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFlBQUEsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUN6QixnQkFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUN0QixnQkFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDL0IsYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxRQUFRLENBQUMsSUFBVSxFQUFFLFFBQXdCLEVBQUE7Ozs7Ozs7QUFPekMsUUFBQSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRTtBQUMxRCxZQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDNUMsWUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNsQixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEIsU0FBQTtBQUFNLGFBQUE7QUFDSCxZQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1lBQ3ZCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQixTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsU0FBUyxHQUFBO1FBQ0wsT0FBTztBQUNILFlBQUEsSUFBSSxFQUFFLE9BQU87QUFDYixZQUFBLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7WUFDckIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQ2hDLENBQUM7QUFDTCxLQUFBO0FBRUQsSUFBQSxhQUFhLEdBQUE7QUFDVCxRQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEtBQUE7QUFDSixDQUFBO0FBRUQ7Ozs7O0FBS0c7QUFDRyxTQUFVLDBCQUEwQixDQUFDLE1BQWlDLEVBQUE7SUFDeEUsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztBQUNwQixJQUFBLElBQUksSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDO0FBQ3JCLElBQUEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7QUFFckIsSUFBQSxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtRQUN4QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLEtBQUE7QUFFRCxJQUFBLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdkIsSUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBRXRDLElBQUEsT0FBTyxJQUFJQyxXQUFlLENBQUEsZUFBQSxDQUN0QixJQUFJLEVBQ0osSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxFQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFBOztBQ2xTQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCRztBQUNILE1BQU0sV0FBWSxTQUFRLFdBQVcsQ0FBQTtBQU1qQzs7QUFFRztBQUNILElBQUEsV0FBQSxDQUFZLEVBQVUsRUFBRSxPQUFpQyxFQUFFLFVBQXNCLEVBQUUsYUFBc0IsRUFBQTtRQUNyRyxLQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDOUMsUUFBQSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQ3BCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDMUIsS0FBQTtBQUVELElBQUEsSUFBSSxHQUFBO0FBQ0EsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUNyQixRQUFBLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFFN0IsUUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNmLFFBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRXJCLFdBQVksQ0FBQSxZQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0YsU0FBQTtRQUVEc0IsV0FBUSxDQUFBLFFBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssS0FBSTtBQUMvQixZQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLFlBQUEsSUFBSSxHQUFHLEVBQUU7Z0JBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJbkIsc0JBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLGFBQUE7QUFBTSxpQkFBQSxJQUFJLEtBQUssRUFBRTtBQUNkLGdCQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLGdCQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzs7O0FBSXZCLGdCQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE1BQUs7QUFDeEMsb0JBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztBQUM5QixpQkFBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1Ysb0JBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyQixpQkFBQTtnQkFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDekIsYUFBQTtBQUNMLFNBQUMsQ0FBQyxDQUFDO0FBQ04sS0FBQTtBQUVEOztBQUVHO0FBQ0gsSUFBQSxLQUFLLEdBQUE7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDWixZQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDdEIsU0FBQTtBQUNKLEtBQUE7QUFFRDs7QUFFRztBQUNILElBQUEsSUFBSSxHQUFBO1FBQ0EsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ1osWUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3JCLFNBQUE7QUFDSixLQUFBO0FBRUQ7OztBQUdHO0FBQ0gsSUFBQSxJQUFJLENBQUMsT0FBZSxFQUFBO1FBQ2hCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNaLFlBQUEsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7QUFDMUMsWUFBQSxJQUFJLE9BQU8sR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3BFLGdCQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUEsV0FBQUEsQ0FBQUEsVUFBVSxDQUFDLElBQUlvQixXQUFBQSxDQUFBQSxlQUFlLENBQUMsQ0FBQSxRQUFBLEVBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQSxDQUFFLEVBQUUsSUFBSSxFQUFFLENBQXVELG9EQUFBLEVBQUEsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBLGFBQUEsQ0FBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hNLGFBQUE7O0FBQU0sZ0JBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBQzNDLFNBQUE7QUFDSixLQUFBO0FBRUQ7Ozs7QUFJRztBQUNILElBQUEsUUFBUSxHQUFBO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3JCLEtBQUE7QUFFRCxJQUFBLEtBQUssQ0FBQyxHQUFRLEVBQUE7UUFDVixJQUFJLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztBQUNyQixRQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ1osWUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2xCLFlBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDekMsU0FBQTtBQUNKLEtBQUE7QUFFRDs7Ozs7OztBQU9HOztBQUdILElBQUEsT0FBTyxHQUFBO1FBQ0gsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRTtBQUNuRSxZQUFBLE9BQU87QUFDVixTQUFBO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQ3pDLFFBQUEsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUV0QixRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO0FBQ3BCLFlBQUEsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyRyxTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUN0QixZQUFBLElBQUksQ0FBQyxjQUFjLEdBQUdILFdBQUFBLENBQUFBLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakUsU0FBQTtBQUVELFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDZixZQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELFlBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDbEQsU0FBQTtBQUFNLGFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQzNCLFlBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0MsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkYsU0FBQTtBQUVELFFBQUEsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsWUFBQSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQ3pCLGdCQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO0FBQ3RCLGdCQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMvQixhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLFNBQVMsR0FBQTtRQUNMLE9BQU87QUFDSCxZQUFBLElBQUksRUFBRSxPQUFPO1lBQ2IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQ2hDLENBQUM7QUFDTCxLQUFBO0FBRUQsSUFBQSxhQUFhLEdBQUE7UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUMzQyxLQUFBO0FBQ0osQ0FBQTs7QUNuTEQ7Ozs7Ozs7O0FBUUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkJHO0FBQ0gsTUFBTSxZQUFhLFNBQVEsV0FBVyxDQUFBO0FBVWxDOztBQUVHO0FBQ0gsSUFBQSxXQUFBLENBQVksRUFBVSxFQUFFLE9BQWtDLEVBQUUsVUFBc0IsRUFBRSxhQUFzQixFQUFBO1FBQ3RHLEtBQUssQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQzs7QUFHOUMsUUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtBQUN0QixZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSWpCLFdBQVUsQ0FBQSxVQUFBLENBQUMsSUFBSW9CLFdBQWUsQ0FBQSxlQUFBLENBQUMsV0FBVyxFQUFFLENBQUEsQ0FBRSxFQUFFLElBQUksRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwSCxTQUFBO0FBQU0sYUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUMxRSxZQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsRUFBRTtBQUM5RyxZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSXBCLFdBQVUsQ0FBQSxVQUFBLENBQUMsSUFBSW9CLFdBQWUsQ0FBQSxlQUFBLENBQUMsV0FBVyxFQUFFLENBQUEsQ0FBRSxFQUFFLElBQUksRUFBRSw2RUFBNkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4SixTQUFBO1FBRUQsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7QUFDekQsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlwQixXQUFVLENBQUEsVUFBQSxDQUFDLElBQUlvQixXQUFlLENBQUEsZUFBQSxDQUFDLFdBQVcsRUFBRSxDQUFBLENBQUUsRUFBRSxJQUFJLEVBQUUscURBQXFELENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEksU0FBQTtBQUVELFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7QUFDakIsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlwQixXQUFVLENBQUEsVUFBQSxDQUFDLElBQUlvQixXQUFlLENBQUEsZUFBQSxDQUFDLFdBQVcsRUFBRSxDQUFBLENBQUUsRUFBRSxJQUFJLEVBQUUsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0csU0FBQTtBQUFNLGFBQUEsSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sWUFBWSxpQkFBaUIsQ0FBQyxFQUFFO0FBQzdGLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJcEIsV0FBVSxDQUFBLFVBQUEsQ0FBQyxJQUFJb0IsV0FBZSxDQUFBLGVBQUEsQ0FBQyxXQUFXLEVBQUUsQ0FBQSxDQUFFLEVBQUUsSUFBSSxFQUFFLGlJQUFpSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVNLFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUN6RSxLQUFBO0FBRUQ7Ozs7O0FBS0c7QUFFSDs7Ozs7QUFLRztBQUVILElBQUEsSUFBSSxHQUFBO0FBQ0EsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUNwQixRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2QsWUFBQSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLFlBQVksaUJBQWlCO0FBQzNELGdCQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtnQkFDbkIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBc0IsQ0FBQzs7O0FBR3pFLFNBQUE7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFFakMsUUFBQSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFO0FBQzlCLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJcEIsV0FBVSxDQUFBLFVBQUEsQ0FBQyxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRyxPQUFPO0FBQ1YsU0FBQTtRQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBQTtBQUNSLFlBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDckIsWUFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQzlCLFNBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBQTtZQUNULElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDZixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDZixnQkFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztBQUN6QixhQUFBO0FBQ0wsU0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3pCLEtBQUE7QUFFRDs7OztBQUlHO0FBQ0gsSUFBQSxTQUFTLEdBQUE7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDdEIsS0FBQTtBQUVELElBQUEsS0FBSyxDQUFDLEdBQVEsRUFBQTtBQUNWLFFBQUEsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixJQUFJLElBQUksQ0FBQyxPQUFPO2dCQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNqQyxTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsUUFBUSxHQUFBO1FBQ0osSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2hCLEtBQUE7Ozs7Ozs7Ozs7Ozs7O0FBZ0JELElBQUEsT0FBTyxHQUFBO1FBQ0gsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQy9CLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDakIsU0FBQTtRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDakIsU0FBQTtRQUVELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQUUsT0FBTztRQUV6QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO0FBQUUsWUFBQSxPQUFPO1FBRWpELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN6QyxRQUFBLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFFdEIsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtBQUNwQixZQUFBLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckcsU0FBQTtBQUVELFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7QUFDdEIsWUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHaUIsV0FBQUEsQ0FBQUEsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNqRSxTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0FBQ2xGLFNBQUE7QUFBTSxhQUFBLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7QUFDaEMsWUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFDekQsU0FBQTtBQUVELFFBQUEsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsWUFBQSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQ3pCLGdCQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO0FBQ3RCLGdCQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMvQixhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLFNBQVMsR0FBQTtRQUNMLE9BQU87QUFDSCxZQUFBLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQ2hDLENBQUM7QUFDTCxLQUFBO0FBRUQsSUFBQSxhQUFhLEdBQUE7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDeEIsS0FBQTtBQUVELElBQUEscUJBQXFCLEdBQUE7QUFDakIsUUFBQSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNyRCxZQUFBLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUUsZ0JBQUEsT0FBTyxJQUFJLENBQUM7QUFDdkMsU0FBQTtBQUNELFFBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsS0FBQTtBQUNKLENBQUE7O0FDbkpELE1BQU0sV0FBVyxHQUFHO1lBQ2hCSSxnQkFBTTtZQUNOOUQsZ0JBQU07QUFDTixJQUFBLFlBQVksRUFBRStELG1CQUFTO2FBQ3ZCQyxhQUFPO1dBQ1BDLFdBQUs7V0FDTEMsV0FBSztZQUNMQyxZQUFNO0NBQ1QsQ0FBQztBQUVGOzs7Ozs7Ozs7QUFTRztBQUNJLE1BQU0sTUFBTSxHQUFHLFVBQVMsRUFBVSxFQUFFLGFBQWtDLEVBQUUsVUFBc0IsRUFBRSxhQUFzQixFQUFBO0FBQ3pILElBQUEsTUFBTSxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRyxhQUFxQixFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUUxRyxJQUFBLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7QUFDbEIsUUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLENBQTRCLHlCQUFBLEVBQUEsRUFBRSxDQUFlLFlBQUEsRUFBQSxNQUFNLENBQUMsRUFBRSxDQUFFLENBQUEsQ0FBQyxDQUFDO0FBQzdFLEtBQUE7QUFFRCxJQUFBQyxtQkFBTyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3JFLElBQUEsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUssTUFBTSxhQUFhLEdBQUcsVUFBVSxJQUFZLEVBQUE7QUFDL0MsSUFBQSxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFSyxNQUFNLGFBQWEsR0FBRyxVQUFVLElBQVksRUFBRSxJQUVwRCxFQUFBO0FBQ0csSUFBQSxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzdCLENBQUMsQ0FBQTs7QUNuSEQ7O0FBRUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUE7QUFDeEMsSUFBQSxNQUFNLENBQUMsR0FBR0MsV0FBQUEsQ0FBQUEsTUFBVyxFQUFFLENBQUM7QUFDeEIsSUFBQUMsV0FBYyxDQUFBLFNBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDQyxXQUFVLENBQUEsS0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLEdBQUcsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLElBQUEsT0FBT0MsV0FBYSxDQUFBLFFBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25GLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLE1BQXFCLEVBQUUsV0FBc0MsRUFBRSxRQUFnQixFQUFBO0FBQ3pHLElBQUEsSUFBSSxNQUFNLEVBQUU7QUFDUixRQUFBLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxFQUFFO0FBQzFCLFlBQUEsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLFlBQUEsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtBQUN2RSxnQkFBQSxPQUFPLElBQUksQ0FBQztBQUNmLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUFNLFNBQUE7QUFDSCxRQUFBLEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFO0FBQzNCLFlBQUEsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtBQUM5RCxnQkFBQSxPQUFPLElBQUksQ0FBQztBQUNmLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUNELElBQUEsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUVlLFNBQUEscUJBQXFCLENBQ2pDLFdBQXdCLEVBQ3hCLFdBQXNDLEVBQ3RDLGdCQUFvQyxFQUNwQyxhQUEyQixFQUMzQixNQUlDLEVBQ0QsU0FBb0IsRUFBQTtBQUdwQixJQUFBLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUYsSUFBQSxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0FBQzVELElBQUEsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFFcEYsSUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFCLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLElBQUEsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7UUFDMUIscUJBQXFCLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLGFBQWEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUc7QUFDMUMsWUFBQSxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FDM0MsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixXQUFXLENBQUMsTUFBTSxFQUNsQixNQUFNLENBQUMsYUFBYSxFQUNwQixNQUFNLENBQUMsbUJBQW1CLEVBQzFCLE1BQU0sQ0FBQyxLQUFLLEVBQ1osTUFBTSxFQUNOLFNBQVMsRUFDVCxtQkFBbUIsRUFDbkIsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0QsU0FBQSxDQUFDLENBQUM7QUFDTixLQUFBO0FBRUQsSUFBQSxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDOztBQUdqRSxJQUFBLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxFQUFFO1FBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLEtBQUk7QUFDdkMsWUFBQSxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsT0FBNEIsQ0FBQztBQUM1RCxZQUFBLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckYsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUN0QyxZQUFBLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDL0IsT0FBTyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZELGFBQUE7QUFDRCxZQUFBLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzFCLFNBQUMsQ0FBQyxDQUFDO0FBQ04sS0FBQTtBQUNELElBQUEsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVlLFNBQUEsb0JBQW9CLENBQUMsV0FBc0MsRUFDdkUsZ0JBQTJDLEVBQzNDLFlBQXdDLEVBQ3hDLGFBQTJCLEVBQzNCLE1BSUMsRUFDRCxjQUE4QixFQUM5QixpQkFFQyxFQUFBO0lBQ0QsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMzRSxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDM0IsSUFBQSxLQUFLLE1BQU0sZ0JBQWdCLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDckUsZUFBZSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7QUFDN0QsS0FBQTtBQUNELElBQUEsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUVsQyxJQUFBLEtBQUssTUFBTSxTQUFTLElBQUksZUFBZSxFQUFFO0FBQ3JDLFFBQUEsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FDN0QsZUFBZSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUMzQyxnQkFBZ0IsRUFDaEIsU0FBUyxDQUFDLFdBQVcsRUFDckIsU0FBUyxDQUFDLGdCQUFnQixFQUMxQixNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLGVBQWUsRUFDdEIsV0FBVyxDQUFDLENBQUM7QUFFakIsUUFBQSxLQUFLLE1BQU0sT0FBTyxJQUFJLGFBQWEsRUFBRTtBQUNqQyxZQUFBLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQy9ELFlBQUEsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLFlBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUk7OztBQUd2QixnQkFBQSxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztBQUNwRCxnQkFBQSxJQUFJLGdCQUFnQixFQUFFOzs7OztvQkFLbEIsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDekQsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6RCxvQkFBQW5QLGtCQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLG9CQUFBQSxrQkFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDckIsT0FBTyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzVCLGlCQUFBO0FBQU0scUJBQUE7OztBQUdILG9CQUFBLE9BQU8sQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDO0FBQzFDLGlCQUFBO0FBQ0wsYUFBQyxDQUFDLENBQUM7QUFDSCxZQUFBLEtBQUssTUFBTSxhQUFhLElBQUksWUFBWSxFQUFFO0FBQ3RDLGdCQUFBLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDdEMsYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBOztBQUdELElBQUEsS0FBSyxNQUFNLFNBQVMsSUFBSSxNQUFNLEVBQUU7UUFDNUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsS0FBSTtBQUN6QyxZQUFBLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUM7QUFDdkMsWUFBQSxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQyxZQUFBLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckYsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUN0QyxZQUFBLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDL0IsT0FBTyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZELGFBQUE7QUFDRCxZQUFBLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzFCLFNBQUMsQ0FBQyxDQUFDO0FBQ04sS0FBQTtBQUNELElBQUEsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVlLFNBQUEsbUJBQW1CLENBQUMsV0FBd0IsRUFBRSxNQUk3RCxFQUFBO0FBQ0csSUFBQSxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUk7QUFDcEQsUUFBQSxPQUFPLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkMsS0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFbEIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLElBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkMsUUFBQSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO0FBQ3pDLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNwQixZQUFBLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDekIsWUFBQSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzVDLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQTtBQUNyQixJQUFBLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDckIsSUFBQSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3JCLElBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLFdBQVcsTUFBTSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEosQ0FBQztBQUVELFNBQVMsMEJBQTBCLENBQUMsS0FBSyxFQUFBOzs7SUFHckMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQzdCLElBQUEsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7QUFDdEIsUUFBQSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO0FBQ3ZDLFFBQUEsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztBQUNyQyxRQUFBLE1BQU0sZUFBZSxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUMxRixRQUFBLEtBQUssTUFBTSxPQUFPLElBQUksWUFBWSxFQUFFO0FBQ2hDLFlBQUEsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNDLFlBQUEsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNwRixZQUFBLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQy9ELFlBQUEsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLEVBQUU7QUFDcEMsZ0JBQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRTtBQUM5QyxvQkFBQSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ25ELG9CQUFBLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDcEMsaUJBQUE7QUFDSixhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFDRCxJQUFBLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUE7O0FDN0hnQixTQUFBLFdBQVcsQ0FBQyxLQUFvQixFQUFFLEtBQVksRUFBQTtJQUMxRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7OztBQUlsQixJQUFBLElBQUksQ0FBQyxLQUFLO0FBQUUsUUFBQSxPQUFPLE1BQU0sQ0FBQztBQUUxQixJQUFBLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxFQUFFO0FBQ3hCLFFBQUEsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVE7QUFDekIsYUFBQSxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMvQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFckIsUUFBQSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLFNBQVM7QUFDWixTQUFBOzs7QUFJQSxRQUFBLE1BQWMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ2hDLElBQUksTUFBTSxDQUFDLHNCQUFzQixFQUFFO0FBQzlCLFlBQUEsTUFBYyxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsU0FBQTtBQUNELFFBQUEsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7QUFDeEIsWUFBQSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUM3QixTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQTs7QUMvR0EsTUFBTSx3QkFBd0IsR0FBRyxLQUFLLENBQUM7QUE4QnZDOzs7OztBQUtHO0FBQ0gsTUFBTSxJQUFJLENBQUE7QUEwQ047Ozs7QUFJRztBQUNILElBQUEsV0FBWSxDQUFBLE1BQXdCLEVBQUUsSUFBWSxFQUFBO0FBQzlDLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDckIsUUFBQSxJQUFJLENBQUMsR0FBRyxHQUFHK04sV0FBQUEsQ0FBQUEsUUFBUSxFQUFFLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNkLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDckIsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNsQixRQUFBLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQzNCLFFBQUEsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDeEIsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzs7Ozs7QUFNdkIsUUFBQSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRTdCLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7QUFDMUIsS0FBQTtBQUVELElBQUEsb0JBQW9CLENBQUMsUUFBZ0IsRUFBQTtBQUNqQyxRQUFBLE1BQU0sV0FBVyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQzlDLFFBQUEsSUFBSSxXQUFXLEdBQUd0TSxXQUFPLENBQUEsUUFBQSxDQUFDLEdBQUcsRUFBRTtZQUFFLE9BQU87UUFDeEMsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU87QUFFL0QsUUFBQSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUNsQyxLQUFBO0FBRUQsSUFBQSxZQUFZLEdBQUE7QUFDUixRQUFBLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUM7QUFDNUYsS0FBQTtBQUVEOzs7Ozs7Ozs7QUFTRztBQUNILElBQUEsY0FBYyxDQUFDLElBQXNCLEVBQUUsT0FBWSxFQUFFLFlBQTZCLEVBQUE7QUFDOUUsUUFBQSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNoQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztBQUMzQixTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQzs7UUFHdEIsSUFBSSxDQUFDLElBQUksRUFBRTtBQUNQLFlBQUEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUk2SixXQUFBQSxDQUFBQSxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pELE9BQU87QUFDVixTQUFBO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO0FBQ25CLFlBQUEsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDNUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFOzs7QUFHbEIsZ0JBQUEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztBQUMxRCxhQUFBO2lCQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFOzs7Z0JBRy9CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0FBQ2hFLGFBQUE7QUFDSixTQUFBO0FBQ0QsUUFBQSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0FBQ2hELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRzhELFdBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFOUQsUUFBQSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQzlCLFFBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsSUFBSSxNQUFNLFlBQVlyRixXQUFBQSxDQUFBQSxZQUFZLEVBQUU7QUFDaEMsZ0JBQUEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUM3QixnQkFBQSxJQUFJLFlBQVksRUFBRTtBQUNkLG9CQUFBLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQzlCLGlCQUFBO0FBQU0scUJBQUE7b0JBQ0gsTUFBTTtBQUNULGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO0FBQ3ZCLFlBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLE1BQU0sWUFBWUEsV0FBQUEsQ0FBQUEsWUFBWSxFQUFFO29CQUNoQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7QUFDbkIsd0JBQUEsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDdkIsd0JBQUFzRixXQUFBQSxDQUFBQSxxQkFBcUIsRUFBRSxDQUFDO3dCQUN4QixNQUFNO0FBQ1QscUJBQUE7QUFDSixpQkFBQTtBQUNKLGFBQUE7QUFDSixTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN0QixRQUFBLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ25HLFNBQUE7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDakIsWUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDckMsU0FBQTtRQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtBQUN0QixZQUFBLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztBQUMvQyxTQUFBO0FBQ0osS0FBQTtBQUVEOzs7O0FBSUc7QUFDSCxJQUFBLGdCQUFnQixHQUFBO0FBQ1osUUFBQSxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM5QixTQUFBO0FBQ0QsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUVsQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtBQUN4QixZQUFBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNwQyxTQUFBO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO0FBQ2pCLFlBQUEsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDMUIsU0FBQTtRQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO0FBQ3hCLFlBQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3BDLFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFDL0IsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztBQUMzQixLQUFBO0FBRUQsSUFBQSxTQUFTLENBQUMsS0FBaUIsRUFBQTtRQUN2QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLEtBQUE7QUFFRCxJQUFBLE1BQU0sQ0FBQyxPQUFnQixFQUFBO0FBQ25CLFFBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEMsWUFBQSxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRTtBQUN4QixnQkFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzFCLGFBQUE7QUFDSixTQUFBO0FBRUQsUUFBQSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3RCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO0FBQzlDLFlBQUEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUUsWUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDbkMsU0FBQTtRQUVELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtBQUN0QixZQUFBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsWUFBQSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztBQUMvQixTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsT0FBTyxDQUFDLFlBQTBCLEVBQUE7UUFDOUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzVFLFNBQUE7QUFDSixLQUFBOzs7QUFJRCxJQUFBLHFCQUFxQixDQUNqQixNQUFpQyxFQUNqQyxnQkFBb0MsRUFDcEMsa0JBQXNDLEVBQ3RDLGFBQTJCLEVBQzNCLG1CQUFpQyxFQUNqQyxLQUFhLEVBQ2IsTUFJQyxFQUNELFNBQW9CLEVBQ3BCLG1CQUEyQixFQUMzQixjQUFvQixFQUFBO1FBRXBCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVztBQUNoRSxZQUFBLE9BQU8sRUFBRSxDQUFDO0FBRWQsUUFBQSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7WUFDakMsYUFBYTtZQUNiLG1CQUFtQjtZQUNuQixLQUFLO1lBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGNBQWM7WUFDZCxTQUFTO1lBQ1QsTUFBTTtBQUNOLFlBQUEsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsbUJBQW1CO0FBQ3hELFNBQUEsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUNwRCxLQUFBO0FBRUQsSUFBQSxtQkFBbUIsQ0FBQyxNQUE2QixFQUFFLE1BSWxELEVBQUE7QUFDRyxRQUFBLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztBQUM3QyxRQUFBLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVztZQUFFLE9BQU87QUFFdkQsUUFBQSxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7QUFFN0MsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUVsRSxRQUFBLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUVuQixNQUFNLE1BQU0sR0FBR3ZFLFdBQUFBLENBQUFBLFlBQWEsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELFFBQUEsTUFBTSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0FBRXhCLFFBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLE1BQU0saUJBQWlCLEdBQUd3RSxXQUFtQixDQUFBLG1CQUFBLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJdEQsV0FBQUEsQ0FBQUEsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztvQkFBRSxTQUFTO0FBQzdILGFBQUE7QUFBTSxpQkFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJQSxXQUFvQixDQUFBLG9CQUFBLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDbkYsU0FBUztBQUNaLGFBQUE7WUFDRCxNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNwRCxZQUFBLE1BQU0sY0FBYyxHQUFHLElBQUl1RCxXQUFBQSxDQUFBQSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELFlBQUEsY0FBc0IsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLFlBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUMvQixTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsT0FBTyxHQUFBO0FBQ0gsUUFBQSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQzVGLEtBQUE7QUFFRCxJQUFBLGNBQWMsR0FBQTtBQUNWLFFBQUEsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDcEYsS0FBQTtBQUVELElBQUEsYUFBYSxDQUFDLElBQWdCLEVBQUE7QUFDMUIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixNQUFNLFFBQVEsR0FBR0MsV0FBaUIsQ0FBQSxpQkFBQSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN0RCxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUM7QUFBRSxnQkFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzFGLFNBQUE7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDckIsWUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUMxRCxTQUFBO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO0FBQ3JCLFlBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztBQUV0QixZQUFBLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLEVBQUU7Z0JBQzNCLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDckIsYUFBQTtpQkFBTSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNmLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDcEIsYUFBQTtBQUFNLGlCQUFBLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLEVBQUU7OztnQkFHcEMsU0FBUyxHQUFHLElBQUksQ0FBQztBQUVwQixhQUFBO0FBQU0saUJBQUE7QUFDSCxnQkFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztnQkFFMUMsSUFBSSxDQUFDLEtBQUssRUFBRTs7O29CQUdSLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFFcEIsaUJBQUE7QUFBTSxxQkFBQTs7OztBQUlILG9CQUFBLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLHdCQUF3QixDQUFDLENBQUM7QUFFekUsaUJBQUE7QUFDSixhQUFBO0FBRUQsWUFBQSxJQUFJLFNBQVMsRUFBRTtnQkFDWCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztBQUMzQixnQkFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztBQUMxQixhQUFBO0FBQU0saUJBQUE7QUFDSCxnQkFBQSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsZ0JBQWdCLEdBQUE7UUFDWixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7QUFDMUIsZ0JBQUEsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25FLGFBQUE7QUFBTSxpQkFBQTs7Z0JBRUgsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRixhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLGVBQWUsQ0FBQyxNQUEwQixFQUFFLE9BQVksRUFBQTtRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQjtBQUN4QixZQUFBLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVc7WUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLE9BQU87QUFDVixTQUFBO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO0FBRXhELFFBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQUUsU0FBUztZQUUxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztBQUVoQyxZQUFBLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksbUJBQW1CLENBQUM7QUFDN0UsWUFBQSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDNUMsWUFBQSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNoRCxZQUFBLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsU0FBUztBQUVoRyxZQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN6RyxZQUFBLE1BQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JFLFlBQUEsSUFBSSxLQUFLLEVBQUU7QUFDUCxnQkFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDOUUsYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxjQUFjLEdBQUE7QUFDVixRQUFBLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixLQUFLLFNBQVMsQ0FBQztBQUNqRCxLQUFBO0FBRUQsSUFBQSxrQkFBa0IsR0FBQTtBQUNkLFFBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEdBQUcvTixXQUFBQSxDQUFBQSxRQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEYsS0FBQTtBQUVELElBQUEsYUFBYSxHQUFBO0FBQ1QsUUFBQSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0FBQ3hDLEtBQUE7QUFFRCxJQUFBLGVBQWUsQ0FBQyxRQUFnQixFQUFBO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsR0FBR0EsV0FBQUEsQ0FBQUEsUUFBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQztBQUN2RCxLQUFBO0FBRUQsSUFBQSxlQUFlLENBQUMsU0FBaUIsRUFBRSxZQUEyQixFQUFBO1FBQzFELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNqQixRQUFBLEtBQUssTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFO0FBQzVCLFlBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyQixTQUFBO0FBQ0QsUUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN4QyxLQUFBO0FBRUQsSUFBQSxhQUFhLENBQUMsVUFBeUIsRUFBRSxJQUFtQixFQUFBO0FBQ3hELFFBQUEsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUU7WUFDaEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNsRCxZQUFBLElBQUksWUFBWSxFQUFFO0FBQ2QsZ0JBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDcEIsb0JBQUEsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDbkIsd0JBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixxQkFBQTtBQUNKLGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7QUFDRCxRQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEtBQUE7QUFDSixDQUFBOztBQ2hkRDs7Ozs7O0FBTUc7QUFDSCxNQUFNLFNBQVMsQ0FBQTtBQVVYOzs7QUFHRztBQUNILElBQUEsV0FBWSxDQUFBLEdBQVcsRUFBRSxRQUFpQyxFQUFBO0FBQ3RELFFBQUEsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDZixRQUFBLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNoQixLQUFBO0FBRUQ7Ozs7O0FBS0c7QUFDSCxJQUFBLEtBQUssR0FBQTtBQUNELFFBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3pCLEtBQUssTUFBTSxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdEMsSUFBSSxXQUFXLENBQUMsT0FBTztBQUFFLG9CQUFBLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0QsZ0JBQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2YsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUVoQixRQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsS0FBQTtBQUVEOzs7Ozs7Ozs7QUFTRztBQUNILElBQUEsR0FBRyxDQUFDLE1BQXdCLEVBQUUsSUFBVSxFQUFFLGFBQTRCLEVBQUE7UUFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQzlCLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDdkIsU0FBQTtBQUVELFFBQUEsTUFBTSxXQUFXLEdBQUc7QUFDaEIsWUFBQSxLQUFLLEVBQUUsSUFBSTtBQUNYLFlBQUEsT0FBTyxFQUFFLFNBQVM7U0FDckIsQ0FBQztRQUVGLElBQUksYUFBYSxLQUFLLFNBQVMsRUFBRTtBQUM3QixZQUFBLFdBQVcsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQUs7QUFDbEMsZ0JBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDcEMsRUFBRSxhQUF1QixDQUFDLENBQUM7QUFDL0IsU0FBQTtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2pDLFFBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFckIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQzlCLFlBQUEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRCxZQUFBLElBQUksV0FBVztBQUFFLGdCQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDL0MsU0FBQTtBQUVELFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBRUQ7Ozs7OztBQU1HO0FBQ0gsSUFBQSxHQUFHLENBQUMsTUFBd0IsRUFBQTtRQUN4QixPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUM1QyxLQUFBO0FBRUQ7Ozs7Ozs7QUFPRztBQUNILElBQUEsWUFBWSxDQUFDLE1BQXdCLEVBQUE7QUFDakMsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUFFLFlBQUEsT0FBTyxJQUFJLENBQUM7QUFBRSxTQUFBO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4RCxLQUFBO0FBRUQ7O0FBRUc7QUFDSCxJQUFBLGtCQUFrQixDQUFDLEdBQVcsRUFBQTtRQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLE9BQU87QUFBRSxZQUFBLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDN0IsWUFBQSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsU0FBQTtBQUNELFFBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFOUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3JCLEtBQUE7QUFFRDs7QUFFRztBQUNILElBQUEsUUFBUSxDQUFDLEdBQVcsRUFBQTtRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLFFBQUEsT0FBTyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDdEMsS0FBQTtBQUVEOzs7Ozs7O0FBT0c7QUFDSCxJQUFBLEdBQUcsQ0FBQyxNQUF3QixFQUFBO0FBQ3hCLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFBRSxZQUFBLE9BQU8sSUFBSSxDQUFDO0FBQUUsU0FBQTtBQUV2QyxRQUFBLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztBQUNyQixLQUFBO0FBRUQ7Ozs7Ozs7QUFPRztBQUNILElBQUEsTUFBTSxDQUFDLE1BQXdCLEVBQUUsS0FHaEMsRUFBQTtBQUNHLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFBRSxZQUFBLE9BQU8sSUFBSSxDQUFDO0FBQUUsU0FBQTtRQUN2QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDO0FBRWpDLFFBQUEsTUFBTSxTQUFTLEdBQUcsS0FBSyxLQUFLLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN2QyxRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxPQUFPO0FBQUUsWUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQzdCLFlBQUEsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFNBQUE7QUFDRCxRQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFCLFFBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFOUMsUUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLEtBQUE7QUFFRDs7Ozs7O0FBTUc7QUFDSCxJQUFBLFVBQVUsQ0FBQyxHQUFXLEVBQUE7QUFDbEIsUUFBQSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVmLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNqQyxZQUFBLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0QsWUFBQSxJQUFJLFdBQVc7QUFBRSxnQkFBQSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQy9DLFNBQUE7QUFFRCxRQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsS0FBQTtBQUVEOzs7OztBQUtHO0FBQ0gsSUFBQSxNQUFNLENBQUMsUUFBaUMsRUFBQTtRQUNwQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDbkIsUUFBQSxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDekIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ2hDLGdCQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3hCLG9CQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkIsaUJBQUE7QUFDSixhQUFBO0FBQ0osU0FBQTtBQUNELFFBQUEsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsQyxTQUFBO0FBQ0osS0FBQTtBQUNKLENBQUE7O0FDaE5EOzs7Ozs7OztBQVFFO0FBQ0YsTUFBTSxrQkFBa0IsQ0FBQTtBQUtwQixJQUFBLFdBQUEsR0FBQTtBQUNJLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDaEIsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN2QixRQUFBLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQzNCLEtBQUE7QUFFRCxJQUFBLFdBQVcsQ0FBQyxXQUFtQixFQUFFLFNBQTBCLEVBQUUsUUFBYSxFQUFBO0FBQ3RFLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2xDLFFBQUEsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0RSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3hGLFFBQUE5QixXQUFNLENBQUEsTUFBQSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFMUQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksRUFBRTtBQUMxQyxZQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JDLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDdEMsSUFBSSxFQUFFLEtBQUssT0FBTztvQkFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNsRSxhQUFBO0FBQ0osU0FBQTtBQUFNLGFBQUE7WUFDSCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDbkgsWUFBQSxJQUFJLHFCQUFxQixFQUFFO2dCQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUM5QyxnQkFBQSxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDakQsb0JBQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7QUFBRSx3QkFBQSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztBQUM5RSxpQkFBQTtBQUNKLGFBQUE7QUFBTSxpQkFBQTtBQUNILGdCQUFBLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFO0FBQ3hCLG9CQUFBLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUM5SixvQkFBQSxJQUFJLGVBQWU7QUFBRSx3QkFBQSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0UsaUJBQUE7QUFDSixhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLGtCQUFrQixDQUFDLFdBQW1CLEVBQUUsU0FBMkIsRUFBRSxHQUFZLEVBQUE7UUFDN0UsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNwRSxRQUFBLElBQUksa0JBQWtCO1lBQUUsT0FBTztBQUUvQixRQUFBLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUVsQyxRQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7QUFFeEUsUUFBQSxJQUFJLEdBQUcsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQ2hDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDMUYsZ0JBQUEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDeEQsYUFBQTtBQUNKLFNBQUE7YUFBTSxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7QUFDaEMsWUFBQSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEcsWUFBQSxJQUFJLGFBQWEsRUFBRTtnQkFDZixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDOUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFBRSxvQkFBQSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUU3RyxhQUFBO0FBQU0saUJBQUE7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbkQsYUFBQTtBQUNKLFNBQUE7QUFBTSxhQUFBO0FBQ0gsWUFBQSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUMxQyxTQUFBO0FBRUosS0FBQTtBQUVELElBQUEsUUFBUSxDQUFDLFdBQW1CLEVBQUUsU0FBMEIsRUFBQTtBQUNwRCxRQUFBLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUVyRCxRQUFBLE1BQU0sZUFBZSxHQUFHQSxXQUFNLENBQUEsTUFBQSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7O0FBR3BFLFFBQUEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUk7QUFBRSxZQUFBLE9BQU8sRUFBRSxDQUFDO0FBQ25ELGFBQUEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRSxJQUFJLGdCQUFnQixLQUFLLElBQUk7QUFBRSxnQkFBQSxPQUFPLEVBQUUsQ0FBQztZQUN6QyxLQUFLLE1BQU0sSUFBSSxJQUFJLGdCQUFnQjtBQUFFLGdCQUFBLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JFLFNBQUE7QUFDRCxRQUFBLE9BQU8sZUFBZSxDQUFDO0FBQzFCLEtBQUE7QUFFRCxJQUFBLG1CQUFtQixDQUFDLElBQVUsRUFBRSxPQUFZLEVBQUE7UUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzdDLEtBQUE7QUFFRCxJQUFBLGVBQWUsQ0FBQyxLQUVmLEVBQUUsT0FBWSxFQUFBOztRQUVYLE1BQU0sZUFBZSxHQUF1QixFQUFFLENBQUM7QUFFL0MsUUFBQSxLQUFLLE1BQU0sV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7QUFDekMsWUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN2QixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDN0VBLFdBQU0sQ0FBQSxNQUFBLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDbEYsZ0JBQUEsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0QsYUFBQTtBQUNELFlBQUEsZUFBZSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUM5QyxTQUFBO0FBRUQsUUFBQSxLQUFLLE1BQU0sV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7QUFDMUMsWUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUV2QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUMxQyxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUU7QUFDdEMsb0JBQUEsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEMsaUJBQUE7QUFDSixhQUFBO0FBQU0saUJBQUE7Z0JBQ0gsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFO0FBQ25ELG9CQUFBLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDbEYsb0JBQUEsSUFBSSx1QkFBdUI7d0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDOUQseUJBQUE7QUFDRCx3QkFBQSxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFO0FBQ3JFLDRCQUFBLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoRCx5QkFBQTtBQUNKLHFCQUFBO0FBQ0Qsb0JBQUEsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0QsaUJBQUE7QUFDSixhQUFBO1lBRUQsZUFBZSxDQUFDLFdBQVcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEVBLFdBQU0sQ0FBQSxNQUFBLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3JELFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFFeEIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztBQUV0RCxRQUFBLEtBQUssTUFBTSxFQUFFLElBQUksS0FBSyxFQUFFO0FBQ3BCLFlBQUEsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLFlBQUEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEQsU0FBQTtBQUNKLEtBQUE7QUFDSixDQUFBOztBQ3BJRDs7Ozs7Ozs7OztBQVVHO0FBQ0gsTUFBTSxXQUFZLFNBQVF3TixXQUFBQSxDQUFBQSxPQUFPLENBQUE7QUE4QjdCLElBQUEsV0FBQSxDQUFZLEVBQVUsRUFBRSxPQUE0QixFQUFFLFVBQXNCLEVBQUE7QUFDeEUsUUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLFFBQUEsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDYixRQUFBLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBRTdCLFFBQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUk7Ozs7WUFJbEIsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsY0FBYyxLQUFLLFVBQVU7QUFBRSxnQkFBQSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzs7O1lBSTFGLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUU7Z0JBQ2xHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDZCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDaEIsb0JBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0IsaUJBQUE7QUFDSixhQUFBO0FBQ0wsU0FBQyxDQUFDLENBQUM7QUFFSCxRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLE1BQUs7QUFDeEIsWUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUNoQyxTQUFDLENBQUMsQ0FBQztBQUVILFFBQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBSzs7WUFFbEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2hELFNBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHc0MsTUFBWSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBRTNELFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzVELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDbEIsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN2QixRQUFBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDOUIsUUFBQSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRTdCLFFBQUEsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDeEIsUUFBQSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztBQUMxQyxLQUFBO0FBRUQsSUFBQSxLQUFLLENBQUMsR0FBUSxFQUFBO0FBQ1YsUUFBQSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNmLFFBQUEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzVELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtBQUNwQyxZQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxRQUFRLENBQUMsR0FBUSxFQUFBO1FBQ2IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtBQUN2QyxZQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLFNBQUE7QUFDSixLQUFBO0FBRUQ7Ozs7QUFJRztBQUNILElBQUEsTUFBTSxHQUFBO1FBQ0YsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO0FBQUUsWUFBQSxPQUFPLElBQUksQ0FBQztBQUFFLFNBQUE7QUFDekMsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtBQUFFLFlBQUEsT0FBTyxLQUFLLENBQUM7QUFBRSxTQUFBO0FBQzFDLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUU7QUFBRSxZQUFBLE9BQU8sS0FBSyxDQUFDO0FBQUUsU0FBQTtBQUM3QyxRQUFBLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTO0FBQ25ELGdCQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ3BCLFNBQUE7QUFDRCxRQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsS0FBQTtBQUVELElBQUEsU0FBUyxHQUFBO1FBQ0wsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3ZCLEtBQUE7QUFFRCxJQUFBLEtBQUssR0FBQTtBQUNELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFDdkIsS0FBQTtBQUVELElBQUEsTUFBTSxHQUFBO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztBQUMxQixRQUFBLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztBQUNoRCxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLFFBQUEsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQUNuQyxRQUFBLElBQUksWUFBWTtZQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxTQUFTO0FBQUUsWUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNuRCxLQUFBO0FBRUQsSUFBQSxTQUFTLENBQUMsSUFBVSxFQUFFLFFBQXdCLEVBQUE7UUFDMUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDaEQsS0FBQTtBQUVELElBQUEsV0FBVyxDQUFDLElBQVUsRUFBQTtBQUNsQixRQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO0FBQ3ZCLFlBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTyxHQUFDLENBQUMsQ0FBQztBQUN0RCxLQUFBO0FBRUQsSUFBQSxVQUFVLENBQUMsSUFBVSxFQUFBO0FBQ2pCLFFBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7QUFDdEIsWUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBSyxHQUFHLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJcEMsV0FBSyxDQUFBLEtBQUEsQ0FBQyxXQUFXLEVBQUUsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixLQUFBO0FBRUQsSUFBQSxTQUFTLEdBQUE7QUFDTCxRQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNuQyxLQUFBO0FBRUQsSUFBQSxPQUFPLENBQUMsT0FBZ0IsRUFBQTtBQUNwQixRQUFBLElBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7QUFDdkIsWUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQzFCLFNBQUE7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0UsUUFBQSxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM3QyxTQUFBO0FBQ0osS0FBQTtBQUVEOzs7QUFHRztBQUNILElBQUEsTUFBTSxHQUFBO0FBQ0YsUUFBQSxPQUFRLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVUsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JILEtBQUE7QUFFRCxJQUFBLGdCQUFnQixDQUFDLFdBQXFCLEVBQUE7UUFDbEMsTUFBTSxXQUFXLEdBQWdCLEVBQUUsQ0FBQztBQUNwQyxRQUFBLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUMxQixZQUFBLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDO2dCQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLFNBQUE7QUFDRCxRQUFBLElBQUksV0FBVyxFQUFFO1lBQ2IsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBUSxFQUFFLEVBQVEsS0FBSTtBQUMzQyxnQkFBQSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO0FBQ3BCLGdCQUFBLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7QUFDcEIsZ0JBQUEsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJdk4sV0FBQUEsQ0FBQUEsYUFBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekYsZ0JBQUEsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJQSxXQUFBQSxDQUFBQSxhQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDekYsT0FBTyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMvRixhQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsU0FBQTtBQUNELFFBQUEsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JGLEtBQUE7QUFFRCxJQUFBLG1CQUFtQixDQUFDLE1BQXdCLEVBQUE7UUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwRCxRQUFBLElBQUksVUFBVSxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsU0FBQTtBQUNELFFBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsS0FBQTtBQUVELElBQUEsZUFBZSxDQUFDLEVBQVUsRUFBRSxXQUFxQixFQUFBO0FBQzdDLFFBQUEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO1lBQy9DLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsS0FBSyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7QUFDckYsS0FBQTtBQUVELElBQUEsTUFBTSxHQUFBO1FBQ0YsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2QsWUFBQSxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLE9BQU87QUFDVixTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBRXBCLFFBQUEsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUztBQUFFLGdCQUFBLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzVFLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxXQUFXLENBQUMsRUFBVSxFQUFFLEtBQWdCLEVBQUE7UUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzs7OztBQUs3QixRQUFBLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTzs7Ozs7QUFNbEIsUUFBQSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO0FBQzFCLFlBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsU0FBQTtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdEUsS0FBQTtBQUVELElBQUEsV0FBVyxDQUFDLElBQVUsRUFBRSxFQUFVLEVBQUUsYUFBd0IsRUFBRSxHQUFrQixFQUFBO0FBQzVFLFFBQUEsSUFBSSxHQUFHLEVBQUU7QUFDTCxZQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBQ3ZCLFlBQUEsSUFBSyxHQUFXLENBQUMsTUFBTSxLQUFLLEdBQUc7QUFBRSxnQkFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJc04sV0FBQUEsQ0FBQUEsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQzs7O0FBRTNFLGdCQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pDLE9BQU87QUFDVixTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsU0FBUyxHQUFHM0wsb0JBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMvQixJQUFJLGFBQWEsS0FBSyxTQUFTO0FBQUUsWUFBQSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQ3JFLFFBQUEsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEtBQUssWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHO0FBQUUsWUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hGLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQztBQUUxRSxRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSTRMLFdBQUssQ0FBQSxLQUFBLENBQUMsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEYsU0FBQTtBQUNKLEtBQUE7QUFFRDs7O0FBR0U7QUFDRixJQUFBLFlBQVksQ0FBQyxJQUFVLEVBQUE7QUFDbkIsUUFBQSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztBQUM1QyxRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3pDLFlBQUEsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDMUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM5QyxnQkFBQSxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzdCLGdCQUFBLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUE7QUFDaEMsWUFBQSxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0FBQ2xDLFlBQUEsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNqRSxZQUFBLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsWUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxZQUFBLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQ3ZDLFlBQUEsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFFakMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEIsT0FBTztBQUNWLGFBQUE7WUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFOztnQkFFbEIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzFCLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDYixpQkFBQTtxQkFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDakMsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNiLGlCQUFBO0FBQ0osYUFBQTtZQUNELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTztBQUN6QyxZQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3pELFNBQUE7QUFDSixLQUFBO0FBQ0Q7OztBQUdHO0FBQ0gsSUFBQSxPQUFPLENBQUMsTUFBd0IsRUFBQTtRQUM1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLEtBQUE7QUFFRDs7O0FBR0c7QUFDSCxJQUFBLFdBQVcsQ0FBQyxFQUFVLEVBQUE7QUFDbEIsUUFBQSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsS0FBQTtBQUVEOzs7O0FBSUc7QUFDSCxJQUFBLHFCQUFxQixDQUNqQixVQUVDLEVBQ0QsSUFBWSxFQUNaLGVBQXVCLEVBQ3ZCLE1BRUMsRUFBQTtBQUVELFFBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzFCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7O1lBRzNCLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDVixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDZixnQkFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJO0FBQy9CLGdCQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLGVBQWU7Z0JBQzNDLFNBQVM7O0FBR1gsWUFBQSxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUU7QUFDL0MsZ0JBQUEsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBRW5FLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUVqQyxnQkFBQSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3hCLGVBQWUsR0FBRyxRQUFRLENBQUM7QUFDOUIsaUJBQUE7QUFDSixhQUFBOztZQUdELElBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQztBQUM3QixZQUFBLE9BQU8sTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLEVBQUU7Z0JBQzlCLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFakQsZ0JBQUEsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFOztBQUV4QixvQkFBQSxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQztvQkFDOUMsTUFBTTtBQUNULGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBRUQ7OztBQUdHO0FBQ0gsSUFBQSxnQkFBZ0IsQ0FBQyxNQUF3QixFQUFFLGVBQXVCLEVBQUE7QUFDOUQsUUFBQSxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksZUFBZSxFQUFFO0FBQ3hELGdCQUFBLE9BQU8sTUFBTSxDQUFDO0FBQ2pCLGFBQUE7QUFBTSxpQkFBQTtBQUNILGdCQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsYUFBQTtBQUNKLFNBQUE7QUFDRCxRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDL0MsWUFBQSxJQUFJLElBQUksRUFBRTtBQUNOLGdCQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxjQUFjLENBQUMsTUFBd0IsRUFBQTtRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQyxRQUFBLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtBQUN4QixZQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsU0FBQTs7QUFFRCxRQUFBLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5RCxRQUFBLE9BQU8sVUFBVSxDQUFDO0FBQ3JCLEtBQUE7QUFFRDs7Ozs7Ozs7QUFRRztBQUNILElBQUEsZUFBZSxDQUFDLFNBQW9CLEVBQUE7QUFDaEMsUUFBQSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUUsUUFBQSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUUsUUFBQSxNQUFNLGlCQUFpQixHQUFHLFlBQVksR0FBRyxhQUFhLENBQUM7UUFDdkQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBRTFCLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxlQUFlLENBQUMsQ0FBQztRQUM3RSxNQUFNLE9BQU8sR0FBRyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsR0FBRyxvQkFBb0IsQ0FBQztBQUUzSSxRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLEtBQUE7QUFFRCxJQUFBLGNBQWMsQ0FBQyxHQUFXLEVBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQnRCLFFBQUEsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDbEUsUUFBQSxNQUFNLGFBQWEsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDO0FBQ3BDLFFBQUEsTUFBTSxlQUFlLEdBQUcsYUFBYSxHQUFHLEdBQUcsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzlDLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFFcEIsUUFBQSxJQUFJLFNBQVMsRUFBRTtZQUNYLE1BQU0sS0FBSyxHQUF3QixFQUFFLENBQUM7QUFDdEMsWUFBQSxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUIsZ0JBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFDakUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLGFBQUE7QUFDRCxZQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztBQUdwQixZQUFBLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDM0IsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixnQkFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0IsYUFBQTtBQUNELFlBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdCLGdCQUFBLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEMsYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBRUQ7Ozs7QUFJRztBQUNILElBQUEsTUFBTSxDQUFDLFNBQW9CLEVBQUE7QUFDdkIsUUFBQSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTztBQUFFLFNBQUE7QUFFcEQsUUFBQSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7OztBQUkvQyxRQUFBLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBRXhCLFFBQUEsSUFBSSxZQUFZLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNaLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDckIsU0FBQTtBQUFNLGFBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUM1QixZQUFZLEdBQUcsU0FBUyxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ3ZFLGlCQUFBLEdBQUcsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJaEMsV0FBZ0IsQ0FBQSxnQkFBQSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdKLFNBQUE7QUFBTSxhQUFBO0FBQ0gsWUFBQSxZQUFZLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQztBQUNuQyxnQkFBQSxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO0FBQy9CLGdCQUFBLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87QUFDN0IsZ0JBQUEsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztBQUM3QixnQkFBQSxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO0FBQ2pDLGdCQUFBLGlCQUFpQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCO0FBQ3BELGFBQUEsQ0FBQyxDQUFDO0FBRUgsWUFBQSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO0FBQ3RCLGdCQUFBLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxLQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkYsYUFBQTtBQUNKLFNBQUE7O1FBR0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2RCxRQUFBLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxRixRQUFBLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxlQUFlLEVBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzs7OztRQUs1RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTdELElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakMsTUFBTSxnQkFBZ0IsR0FBb0MsRUFBRSxDQUFDO1lBQzdELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN2QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLFlBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUU7QUFDbEIsZ0JBQUEsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLGdCQUFBckwsV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBRTFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0IsZ0JBQUEsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUl5QixXQUFPLENBQUEsUUFBQSxDQUFDLEdBQUcsRUFBRTtvQkFBRSxTQUFTOztnQkFHN0UsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNsRSxnQkFBQSxJQUFJLFVBQVUsRUFBRTtBQUNaLG9CQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNqQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7QUFDL0QsaUJBQUE7QUFFRCxnQkFBQSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQzVCLGFBQUE7O1lBR0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRXZFLFlBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxnQkFBZ0IsRUFBRTtBQUMvQixnQkFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFOztBQUViLG9CQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUM5QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckMsaUJBQUE7QUFDSixhQUFBO0FBQ0osU0FBQTtBQUVELFFBQUEsS0FBSyxNQUFNLFVBQVUsSUFBSSxNQUFNLEVBQUU7OztZQUc3QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO0FBQzNDLFNBQUE7O1FBR0QsTUFBTSxNQUFNLEdBQUdpTyxXQUFBQSxDQUFBQSxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNuRCxRQUFBLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNoRCxhQUFBO2lCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7QUFDNUQsZ0JBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1QixhQUFBO0FBQ0osU0FBQTs7UUFHRCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztBQUN2QyxLQUFBO0FBRUQsSUFBQSxzQkFBc0IsR0FBQTtBQUNsQixRQUFBLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMxQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUU7QUFDbEMsZ0JBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLG9CQUFvQixDQUFDLFlBQXFDLEVBQUUsSUFBWSxFQUFBO1FBQ3BFLE1BQU0sTUFBTSxHQUFvQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztBQUMzQyxRQUFBLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxRixRQUFBLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxlQUFlLEVBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1RixNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsUUFBQSxLQUFLLE1BQU0sTUFBTSxJQUFJLFlBQVksRUFBRTtZQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztBQUduQyxZQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBRTVCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFBRSxTQUFTO0FBRTdCLFlBQUEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7O0FBRTdCLGdCQUFBLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3JDLGFBQUE7QUFDSixTQUFBOztRQUdELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUV4RSxRQUFBLEtBQUssTUFBTSxNQUFNLElBQUksWUFBWSxFQUFFO1lBQy9CLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRW5DLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFBRSxTQUFTOzs7WUFLN0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFOztBQUVqQyxnQkFBQSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUU7QUFDcEMsb0JBQUEsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDcEMsb0JBQUEsU0FBUztBQUNaLGlCQUFBO0FBQ0osYUFBQTtBQUFNLGlCQUFBOztBQUVILGdCQUFBLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFdkQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN2QixvQkFBQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN2QixvQkFBQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN2QixvQkFBQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUFFLG9CQUFBLFNBQVM7QUFDekMsYUFBQTs7Ozs7QUFPRCxZQUFBLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBRTdDLFlBQUEsS0FBSyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxXQUFXLElBQUksZUFBZSxFQUFFLEVBQUUsV0FBVyxFQUFFO2dCQUMxRixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDOztBQUc5QyxnQkFBQSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO29CQUFFLE1BQU07QUFDakMsZ0JBQUEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFFN0IsZ0JBQUEsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUIsZ0JBQUEsSUFBSSxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRTtBQUM3QixvQkFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNsQyxpQkFBQTtBQUNELGdCQUFBLElBQUksSUFBSSxFQUFFO0FBQ04sb0JBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7OztBQUdoQyxvQkFBQSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3pDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTt3QkFBRSxNQUFNO0FBQzdCLGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBLE9BQU8sTUFBTSxDQUFDO0FBQ2pCLEtBQUE7QUFFRCxJQUFBLDRCQUE0QixHQUFBO0FBQ3hCLFFBQUEsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUU3QixRQUFBLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMvQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDaEIsWUFBQSxJQUFJLFVBQWdCLENBQUM7WUFDckIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7OztBQUk1QyxZQUFBLE9BQU8sU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUU7O0FBRzlCLGdCQUFBLElBQUksU0FBUyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7b0JBQzFDLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNwRCxNQUFNO0FBQ1QsaUJBQUE7QUFFRCxnQkFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7QUFHekIsZ0JBQUEsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQy9ELGdCQUFBLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNDLGdCQUFBLElBQUksVUFBVSxFQUFFO29CQUNaLE1BQU07QUFDVCxpQkFBQTtnQkFFRCxTQUFTLEdBQUcsUUFBUSxDQUFDO0FBQ3hCLGFBQUE7O0FBR0QsWUFBQSxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtBQUNwQixnQkFBQSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO0FBQzdDLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUVEOzs7QUFHRztBQUNILElBQUEsUUFBUSxDQUFDLE1BQXdCLEVBQUE7UUFDN0IsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsUUFBQSxJQUFJLElBQUk7QUFDSixZQUFBLE9BQU8sSUFBSSxDQUFDO1FBRWhCLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4QyxRQUFBLElBQUksSUFBSSxFQUFFO1lBQ04sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7O0FBRTNDLFlBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDckIsWUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzFFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQy9CLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5QyxhQUFBO0FBQ0osU0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQztRQUVwQixJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ1AsWUFBQSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNuRixTQUFBO1FBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJckMsV0FBSyxDQUFBLEtBQUEsQ0FBQyxhQUFhLEVBQUUsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQztBQUMvRixTQUFBO0FBRUQsUUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLEtBQUE7QUFFRCxJQUFBLG1CQUFtQixDQUFDLEVBQVUsRUFBRSxJQUFVLEVBQUE7QUFDdEMsUUFBQSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3BCLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsWUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0IsU0FBQTtBQUVELFFBQUEsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7QUFDOUMsUUFBQSxJQUFJLGFBQWEsRUFBRTtZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQUs7QUFDL0IsZ0JBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDaEMsZ0JBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzNCLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDckIsU0FBQTtBQUNKLEtBQUE7QUFFRDs7O0FBR0c7QUFDSCxJQUFBLFdBQVcsQ0FBQyxFQUFVLEVBQUE7UUFDbEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3QixRQUFBLElBQUksQ0FBQyxJQUFJO1lBQ0wsT0FBTztRQUVYLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNaLFFBQUEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2xCLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsWUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0IsU0FBQTtBQUVELFFBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDYixPQUFPO1FBRVgsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQUU7QUFDOUMsWUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELFNBQUE7QUFBTSxhQUFBO0FBQ0gsWUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUNwQixZQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEIsWUFBQSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLFNBQUE7QUFDSixLQUFBO0FBRUQ7O0FBRUc7QUFDSCxJQUFBLFVBQVUsR0FBQTtBQUNOLFFBQUEsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQUNuQyxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBRXJCLFFBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTTtBQUN4QixZQUFBLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFekIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3ZCLEtBQUE7QUFFRDs7Ozs7O0FBTUc7QUFDSCxJQUFBLE9BQU8sQ0FBQyxrQkFBZ0MsRUFBRSxtQkFBMkIsRUFBRSxVQUFtQixFQUFBO1FBRXRGLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2QixRQUFBLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsU0FBUztBQUFFLFlBQUEsT0FBTyxXQUFXLENBQUM7QUFFbkMsUUFBQSxNQUFNLHdCQUF3QixHQUFHLFVBQVU7QUFDdkMsWUFBQSxTQUFTLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUM7QUFDcEQsWUFBQSxrQkFBa0IsQ0FBQztBQUV2QixRQUFBLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEYsUUFBQSxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFOUYsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFMUIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztBQUNwQixRQUFBLElBQUksSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDO0FBQ3JCLFFBQUEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7QUFFckIsUUFBQSxLQUFLLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixFQUFFO1lBQ2pDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsU0FBQTtBQUVELFFBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxZQUFBLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFOztnQkFFdkIsU0FBUztBQUNaLGFBQUE7QUFDRCxZQUFBLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDM0IsWUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDcEUsWUFBQSxNQUFNLFlBQVksR0FBRyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHOU0sV0FBQUEsQ0FBQUEsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBRTlGLFlBQUEsTUFBTSxlQUFlLEdBQUc7Z0JBQ3BCLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSTROLFdBQUFBLENBQUFBLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJQSxXQUFBQSxDQUFBQSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDMUQsQ0FBQztZQUVGLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUc1TixXQUFBQSxDQUFBQSxNQUFNLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUdBLFdBQU0sQ0FBQSxNQUFBO2dCQUM1RixlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLElBQUksQ0FBQyxFQUFFO0FBRXRGLGdCQUFBLE1BQU0sc0JBQXNCLEdBQWlCLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlGLGdCQUFBLE1BQU0sNEJBQTRCLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFNUYsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDYixJQUFJO29CQUNKLE1BQU07QUFDTixvQkFBQSxhQUFhLEVBQUUsc0JBQXNCO0FBQ3JDLG9CQUFBLG1CQUFtQixFQUFFLDRCQUE0QjtvQkFDakQsS0FBSztBQUNSLGlCQUFBLENBQUMsQ0FBQztBQUNOLGFBQUE7QUFDSixTQUFBO0FBRUQsUUFBQSxPQUFPLFdBQVcsQ0FBQztBQUN0QixLQUFBO0FBRUQsSUFBQSxxQkFBcUIsQ0FBQyxXQUFxQixFQUFBO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0RixRQUFBLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO0FBQ3hCLFlBQUEsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzVFLFNBQUE7QUFDRCxRQUFBLE9BQU8sTUFBTSxDQUFDO0FBQ2pCLEtBQUE7QUFFRCxJQUFBLGFBQWEsR0FBQTtBQUNULFFBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFO0FBQzlCLFlBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixTQUFBO1FBRUQsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNqQyxZQUFBLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3QixnQkFBQSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUlrQixXQUFBQSxDQUFBQSxRQUFPLENBQUMsR0FBRyxFQUFFLEVBQUU7QUFDckUsb0JBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixpQkFBQTtBQUNKLGFBQUE7QUFDSixTQUFBO0FBRUQsUUFBQSxPQUFPLEtBQUssQ0FBQztBQUNoQixLQUFBO0FBRUQ7OztBQUdHO0FBQ0gsSUFBQSxlQUFlLENBQUMsV0FBbUIsRUFBRSxTQUEwQixFQUFFLEtBQVUsRUFBQTtBQUN2RSxRQUFBLFdBQVcsR0FBRyxXQUFXLElBQUksbUJBQW1CLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxRCxLQUFBO0FBRUQ7OztBQUdHO0FBQ0gsSUFBQSxrQkFBa0IsQ0FBQyxXQUFvQixFQUFFLFNBQTJCLEVBQUUsR0FBWSxFQUFBO0FBQzlFLFFBQUEsV0FBVyxHQUFHLFdBQVcsSUFBSSxtQkFBbUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDL0QsS0FBQTtBQUVEOzs7QUFHRztBQUNILElBQUEsZUFBZSxDQUFDLFdBQW1CLEVBQUUsU0FBMEIsRUFBQTtBQUMzRCxRQUFBLFdBQVcsR0FBRyxXQUFXLElBQUksbUJBQW1CLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkQsS0FBQTtBQUVEOzs7O0FBSUc7QUFDSCxJQUFBLGVBQWUsQ0FBQyxPQUFlLEVBQUUsU0FBaUIsRUFBRSxZQUEyQixFQUFBO1FBQzNFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbEMsUUFBQSxJQUFJLElBQUksRUFBRTtBQUNOLFlBQUEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDakQsU0FBQTtBQUNKLEtBQUE7QUFFRDs7O0FBR0c7QUFDSCxJQUFBLDBCQUEwQixDQUFDLFVBQXlCLEVBQUUsSUFBbUIsRUFBQTtBQUNyRSxRQUFBLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDdEMsZ0JBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDckMsYUFBQTtBQUNKLFNBQUE7QUFDRCxRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDckUsS0FBQTtBQUNKLENBQUE7QUFFRCxXQUFXLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxXQUFXLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztBQUVoQyxTQUFTLGFBQWEsQ0FBQyxDQUFtQixFQUFFLENBQW1CLEVBQUE7Ozs7SUFJM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ELElBQUEsT0FBTyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxXQUFXLElBQUksS0FBSyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFBO0lBQ3RCLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxPQUFPLENBQUM7QUFDckUsQ0FBQTs7QUN2NkJjLFNBQVUsYUFBYSxHQUFBO0FBQ2pDLElBQUEsT0FBTyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDNUMsQ0FBQTs7QUM1Qk8sTUFBTSxlQUFlLEdBQUcsZ0NBQWdDLENBQUM7QUFFaEU7OztBQUdHO0FBQ1csTUFBTyxVQUFVLENBQUE7QUFRM0IsSUFBQSxXQUFBLEdBQUE7QUFDSSxRQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLEtBQUE7QUFFRCxJQUFBLE9BQU8sQ0FBQyxLQUFzQixFQUFBO0FBQzFCLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7OztBQUdmLFlBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQ2tPLGFBQWdCLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLGFBQUE7QUFDSixTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztBQUMxQixRQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUMvQixLQUFBO0FBRUQsSUFBQSxPQUFPLENBQUMsS0FBc0IsRUFBQTtBQUMxQixRQUFBLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQixRQUFBLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRTtBQUN4QixZQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFJO2dCQUN2QixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDbEIsYUFBQyxDQUFDLENBQUM7QUFDSCxZQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxXQUFXLEdBQUE7UUFDUCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3pDLEtBQUE7QUFFRCxJQUFBLFNBQVMsR0FBQTtRQUNMLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzFDLEtBQUE7QUFDSixDQUFBO0FBRUQsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDbE8sV0FBTyxDQUFBLFFBQUEsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvRSxVQUFVLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTs7QUN0RDdFLElBQUksZ0JBQWdCLENBQUM7QUFFckI7Ozs7QUFJRztBQUNXLFNBQVUsbUJBQW1CLEdBQUE7SUFDdkMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO0FBQ25CLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztBQUN2QyxLQUFBO0FBQ0QsSUFBQSxPQUFPLGdCQUFnQixDQUFDO0FBQzVCLENBQUM7QUFFZSxTQUFBLE9BQU8sR0FBQTtBQUNuQixJQUFBLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixFQUFFLENBQUM7QUFDekMsSUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFZSxTQUFBLHVCQUF1QixHQUFBO0lBQ25DLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDO0FBQzlCLElBQUEsSUFBSSxJQUFJLEVBQUU7O1FBRU4sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRTtBQUM5QyxZQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDOUIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQzNCLFNBQUE7QUFBTSxhQUFBO0FBQ0gsWUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLHVNQUF1TSxDQUFDLENBQUM7QUFDek4sU0FBQTtBQUNKLEtBQUE7QUFDTCxDQUFBOztBQzdCQSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFBO0lBQ3hCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUVsQixJQUFBLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFO1FBQ25CLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRTtZQUNiLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBdUoseUJBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUk7UUFDeEIsSUFBSSxDQUFDLElBQUksTUFBTSxFQUFFO1lBQ2IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixTQUFBO0FBQ0wsS0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFJRDs7Ozs7Ozs7Ozs7O0FBWUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUE7QUFDdkIsSUFBQSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRXhCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsSUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNwQyxRQUFBLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLEtBQUE7QUFFRCxJQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BDLFFBQUEsSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQTs7QUNqRGMsU0FBVSxVQUFVLEdBQUE7SUFDOUIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBRWpCLElBQUEsTUFBTSxPQUFPLEdBQUc0RSxnQkFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLElBQUEsS0FBSyxNQUFNLFFBQVEsSUFBSUEsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNwQyxNQUFNLElBQUksR0FBR0EsV0FBTSxDQUFBLElBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV2QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUN4QixLQUFLLEdBQUcsT0FBTyxDQUFDO0FBQ25CLGFBQUE7QUFBTSxpQkFBQTtBQUNILGdCQUFBLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7b0JBQ3ZCLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDZCxpQkFBQTtBQUFNLHFCQUFBO29CQUNILEtBQUssR0FBRyxFQUFFLENBQUM7QUFDZCxpQkFBQTtBQUNKLGFBQUE7WUFFRCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7QUFDZixnQkFBQSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzNCLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQTs7QUN6QkEsTUFBTSxVQUFVLEdBQUc7QUFFZjs7QUFFRztBQUNILElBQUEsUUFBUSxFQUFFLFVBQVU7QUFFcEI7O0FBRUc7QUFDSCxJQUFBLFFBQVEsRUFBRSxVQUFVO0FBRXBCOztBQUVHO0FBQ0gsSUFBQSxXQUFXLEVBQUUsYUFBYTtBQUUxQjs7QUFFRztBQUNILElBQUEsZ0JBQWdCLEVBQUUsa0JBQWtCO0FBRXBDOztBQUVHO0FBQ0gsSUFBQSxpQkFBaUIsRUFBRSxtQkFBbUI7QUFFdEM7O0FBRUc7QUFDSCxJQUFBLFNBQVMsRUFBRSxXQUFXO0FBRXRCOztBQUVHO0FBQ0gsSUFBQSxTQUFTLEVBQUUsV0FBVztBQUV0Qjs7QUFFRztBQUNILElBQUEsWUFBWSxFQUFFLGNBQWM7QUFFNUI7O0FBRUc7QUFDSCxJQUFBLG9CQUFvQixFQUFFLHNCQUFzQjtBQUU1Qzs7QUFFRztBQUNILElBQUEsaUJBQWlCLEVBQUUsbUJBQW1CO0FBRXRDOztBQUVHO0FBQ0gsSUFBQSxnQkFBZ0IsRUFBRSxrQkFBa0I7QUFFcEM7O0FBRUc7QUFDSCxJQUFBLFNBQVMsRUFBRSxXQUFXO0FBRXRCOztBQUVHO0FBQ0gsSUFBQSxPQUFPLEVBQUUsU0FBUztBQUVsQjs7QUFFRztBQUNILElBQUEsVUFBVSxFQUFFLFlBQVk7QUFFeEI7O0FBRUc7QUFDSCxJQUFBLFFBQVEsRUFBRSxVQUFVO0FBRXBCOztBQUVHO0FBQ0gsSUFBQSxTQUFTLEVBQUUsV0FBVztBQUV0Qjs7QUFFRztBQUNILElBQUEsU0FBUyxFQUFFLFdBQVc7QUFFdEI7O0FBRUc7QUFDSCxJQUFBLGFBQWEsRUFBRSxlQUFlO0FBRTlCOztBQUVHO0FBQ0gsSUFBQSxRQUFRLEVBQUUsVUFBVTtDQUV2QixDQUFDO0FBRUYsU0FBUyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUE7SUFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDdEYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFBO0FBQ3BELElBQUEsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQztBQUNwRSxJQUFBLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBQTtBQUMzRCxJQUFBLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ2pELElBQUEsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUE7QUFDN0MsSUFBQSxJQUFJLElBQUksQ0FBQztBQUNULElBQUEsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQzNCLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQUUsU0FBUztRQUM1RSxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQ0MsV0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDNUUsWUFBQSxPQUFPLEtBQUssQ0FBQztBQUNoQixTQUFBO0FBQ0osS0FBQTtBQUNELElBQUEsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQzFCLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQUUsU0FBUztRQUMzRSxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQ0EsV0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDNUUsWUFBQSxPQUFPLEtBQUssQ0FBQztBQUNoQixTQUFBO0FBQ0osS0FBQTtBQUNELElBQUEsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBQTtBQUN4RCxJQUFBLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ3RCLElBQUEsS0FBSyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7QUFFcEIsSUFBQSxJQUFJLFFBQVEsQ0FBQzs7SUFHYixLQUFLLFFBQVEsSUFBSSxNQUFNLEVBQUU7QUFDckIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7WUFBRSxTQUFTO0FBQ3RFLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUU7QUFDeEQsWUFBQSxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNwRCxTQUFBO0FBQ0osS0FBQTs7SUFHRCxLQUFLLFFBQVEsSUFBSSxLQUFLLEVBQUU7QUFDcEIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7WUFBRSxTQUFTO0FBQ3JFLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUU7QUFDekQsWUFBQSxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN4QyxTQUFBO0FBQU0sYUFBQSxJQUFJLENBQUNBLFdBQU8sQ0FBQSxTQUFBLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO1lBQ3BELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDeEgsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDckcsYUFBQTtBQUFNLGlCQUFBOztnQkFFSCxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDM0QsYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBQ0wsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUE7QUFDOUUsSUFBQSxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUN0QixJQUFBLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO0FBRXBCLElBQUEsSUFBSSxJQUFJLENBQUM7SUFFVCxLQUFLLElBQUksSUFBSSxNQUFNLEVBQUU7QUFDakIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFBRSxTQUFTO0FBQ2xFLFFBQUEsSUFBSSxDQUFDQSxXQUFPLENBQUEsU0FBQSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQztBQUN2RSxTQUFBO0FBQ0osS0FBQTtJQUNELEtBQUssSUFBSSxJQUFJLEtBQUssRUFBRTtRQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztZQUFFLFNBQVM7QUFDdkgsUUFBQSxJQUFJLENBQUNBLFdBQU8sQ0FBQSxTQUFBLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ3JDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ3ZFLFNBQUE7QUFDSixLQUFBO0FBQ0wsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBQTtJQUNsQixPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUNELFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUE7QUFDM0IsSUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN4QixJQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQTtBQUN2QyxJQUFBLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ3RCLElBQUEsS0FBSyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7O0lBR3BCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7SUFHdEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7O0FBRy9DLElBQUEsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDOztJQUdwQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRWxDLElBQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQzs7QUFHdEUsSUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM1QyxRQUFBLE9BQU8sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRTtBQUM1RCxZQUFBLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDbEUsWUFBQSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xELFNBQUE7QUFBTSxhQUFBOztBQUVILFlBQUEsQ0FBQyxFQUFFLENBQUM7QUFDUCxTQUFBO0FBQ0osS0FBQTs7QUFHRCxJQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztRQUUzQyxPQUFPLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWhELElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLE9BQU87WUFBRSxTQUFTO0FBRTFELFFBQUEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxFQUFFOztBQUU1RCxZQUFBLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDbEUsWUFBQSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkUsU0FBQTtBQUFNLGFBQUE7O0FBRUgsWUFBQSxDQUFDLEVBQUUsQ0FBQztBQUNQLFNBQUE7O1FBR0QsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQztBQUNoRyxRQUFBLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9DLFFBQUEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN6QixLQUFBOztBQUdELElBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BDLFFBQUEsT0FBTyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkMsUUFBQSxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztRQUdqQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSUEscUJBQU8sQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDO1lBQUUsU0FBUzs7O0FBSWpFLFFBQUEsSUFBSSxDQUFDQSxXQUFBQSxDQUFBQSxTQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQ0EsV0FBTyxDQUFBLFNBQUEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQ0EsV0FBQUEsQ0FBQUEsU0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3JLLFlBQUEsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQzs7O0FBR2xFLFlBQUEsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsWUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDLEVBQUMsQ0FBQyxDQUFDO1lBQ3ZGLFNBQVM7QUFDWixTQUFBOztBQUdELFFBQUEsd0JBQXdCLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3ZILFFBQUEsd0JBQXdCLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BILElBQUksQ0FBQ0EsV0FBTyxDQUFBLFNBQUEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNqRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDdEYsU0FBQTtRQUNELElBQUksQ0FBQ0EscUJBQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDQSxXQUFBQSxDQUFBQSxTQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEcsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQztBQUNuSCxTQUFBOztRQUdELEtBQUssSUFBSSxJQUFJLFdBQVcsRUFBRTtBQUN0QixZQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQztnQkFBRSxTQUFTO1lBQ3ZFLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxRQUFRO2dCQUMxRCxJQUFJLEtBQUssVUFBVSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLFNBQVM7Z0JBQUUsU0FBUztZQUM5RSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM5Qix3QkFBd0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNoSSxhQUFBO0FBQU0saUJBQUEsSUFBSSxDQUFDQSxXQUFPLENBQUEsU0FBQSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDdEQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDbEcsYUFBQTtBQUNKLFNBQUE7UUFDRCxLQUFLLElBQUksSUFBSSxVQUFVLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUM7Z0JBQUUsU0FBUztZQUNqSSxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssUUFBUTtnQkFDMUQsSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTO2dCQUFFLFNBQVM7WUFDOUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDOUIsd0JBQXdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDaEksYUFBQTtBQUFNLGlCQUFBLElBQUksQ0FBQ0EsV0FBTyxDQUFBLFNBQUEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ2xHLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFBO0FBQzdCLElBQUEsSUFBSSxDQUFDLE1BQU07QUFBRSxRQUFBLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUVwRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFFbEIsSUFBSTs7UUFFQSxJQUFJLENBQUNBLFdBQU8sQ0FBQSxTQUFBLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDekMsWUFBQSxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDMUQsU0FBQTtRQUNELElBQUksQ0FBQ0EsV0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUN2QyxZQUFBLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ3hFLFNBQUE7UUFDRCxJQUFJLENBQUNBLFdBQU8sQ0FBQSxTQUFBLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDbkMsWUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsQ0FBQztBQUNwRSxTQUFBO1FBQ0QsSUFBSSxDQUFDQSxXQUFPLENBQUEsU0FBQSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQ3pDLFlBQUEsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDMUUsU0FBQTtRQUNELElBQUksQ0FBQ0EsV0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNyQyxZQUFBLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ3RFLFNBQUE7UUFDRCxJQUFJLENBQUNBLFdBQU8sQ0FBQSxTQUFBLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDdkMsWUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsQ0FBQztBQUN4RSxTQUFBO1FBQ0QsSUFBSSxDQUFDQSxXQUFPLENBQUEsU0FBQSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQ3ZDLFlBQUEsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDeEUsU0FBQTtRQUNELElBQUksQ0FBQ0EsV0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUMvQyxZQUFBLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFD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LEdBQUE7UUFDTixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7QUFFakIsUUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM3QixRQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDL0IsUUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM1QixRQUFBLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDOUIsUUFBQSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM1QixRQUFBLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDOUIsUUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM1QixRQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDNUIsUUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3hCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM1QixRQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDN0IsUUFBQSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2hDLFFBQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMzQixRQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDL0IsUUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMxQixRQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDaEMsUUFBQSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2xDLFFBQUEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ25DLFFBQUEsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ25ELFFBQUEsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzNDLEtBQUE7QUFFRCxJQUFBLFFBQVEsR0FBQTtBQUNKLFFBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQy9CLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxD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Q0FBQyxDQUFDO0FBQzdDLFNBQUE7UUFFRCxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUksRUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDN0QsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFJLEVBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQzdELFFBQUEsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFJLEVBQUEsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7O0FBRzlDLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7QUFJaEIsUUFBQSxJQUFJLENBQUMsR0FBMEIsVUFBVSxDQUFDLEVBQUE7QUFDdEMsWUFBQSxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUMzQyxTQUFDLENBQUM7OztBQUlGLFFBQUEsSUFBSSxDQUFDLEdBQTBCLFVBQVUsQ0FBQyxFQUFBO0FBQ3RDLFlBQUEsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6RSxTQUFDLENBQUM7O0FBR0YsUUFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDOztBQUcxQixRQUFBLElBQUksSUFBSSxD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