Skip to content

Instantly share code, notes, and snippets.

@vicapow
Created June 2, 2015 18:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vicapow/350f55e071277718d0fb to your computer and use it in GitHub Desktop.
Save vicapow/350f55e071277718d0fb to your computer and use it in GitHub Desktop.
This file has been truncated, but you can view the full file.
1c1
< (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
---
> (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
118a119,1541
> (function (global){
> /*! https://mths.be/punycode v1.3.2 by @mathias */
> ;(function(root) {
>
> /** Detect free variables */
> var freeExports = typeof exports == 'object' && exports &&
> !exports.nodeType && exports;
> var freeModule = typeof module == 'object' && module &&
> !module.nodeType && module;
> var freeGlobal = typeof global == 'object' && global;
> if (
> freeGlobal.global === freeGlobal ||
> freeGlobal.window === freeGlobal ||
> freeGlobal.self === freeGlobal
> ) {
> root = freeGlobal;
> }
>
> /**
> * The `punycode` object.
> * @name punycode
> * @type Object
> */
> var punycode,
>
> /** Highest positive signed 32-bit float value */
> maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
>
> /** Bootstring parameters */
> base = 36,
> tMin = 1,
> tMax = 26,
> skew = 38,
> damp = 700,
> initialBias = 72,
> initialN = 128, // 0x80
> delimiter = '-', // '\x2D'
>
> /** Regular expressions */
> regexPunycode = /^xn--/,
> regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
> regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
>
> /** Error messages */
> errors = {
> 'overflow': 'Overflow: input needs wider integers to process',
> 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
> 'invalid-input': 'Invalid input'
> },
>
> /** Convenience shortcuts */
> baseMinusTMin = base - tMin,
> floor = Math.floor,
> stringFromCharCode = String.fromCharCode,
>
> /** Temporary variable */
> key;
>
> /*--------------------------------------------------------------------------*/
>
> /**
> * A generic error utility function.
> * @private
> * @param {String} type The error type.
> * @returns {Error} Throws a `RangeError` with the applicable error message.
> */
> function error(type) {
> throw RangeError(errors[type]);
> }
>
> /**
> * A generic `Array#map` utility function.
> * @private
> * @param {Array} array The array to iterate over.
> * @param {Function} callback The function that gets called for every array
> * item.
> * @returns {Array} A new array of values returned by the callback function.
> */
> function map(array, fn) {
> var length = array.length;
> var result = [];
> while (length--) {
> result[length] = fn(array[length]);
> }
> return result;
> }
>
> /**
> * A simple `Array#map`-like wrapper to work with domain name strings or email
> * addresses.
> * @private
> * @param {String} domain The domain name or email address.
> * @param {Function} callback The function that gets called for every
> * character.
> * @returns {Array} A new string of characters returned by the callback
> * function.
> */
> function mapDomain(string, fn) {
> var parts = string.split('@');
> var result = '';
> if (parts.length > 1) {
> // In email addresses, only the domain name should be punycoded. Leave
> // the local part (i.e. everything up to `@`) intact.
> result = parts[0] + '@';
> string = parts[1];
> }
> // Avoid `split(regex)` for IE8 compatibility. See #17.
> string = string.replace(regexSeparators, '\x2E');
> var labels = string.split('.');
> var encoded = map(labels, fn).join('.');
> return result + encoded;
> }
>
> /**
> * Creates an array containing the numeric code points of each Unicode
> * character in the string. While JavaScript uses UCS-2 internally,
> * this function will convert a pair of surrogate halves (each of which
> * UCS-2 exposes as separate characters) into a single code point,
> * matching UTF-16.
> * @see `punycode.ucs2.encode`
> * @see <https://mathiasbynens.be/notes/javascript-encoding>
> * @memberOf punycode.ucs2
> * @name decode
> * @param {String} string The Unicode input string (UCS-2).
> * @returns {Array} The new array of code points.
> */
> function ucs2decode(string) {
> var output = [],
> counter = 0,
> length = string.length,
> value,
> extra;
> while (counter < length) {
> value = string.charCodeAt(counter++);
> if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
> // high surrogate, and there is a next character
> extra = string.charCodeAt(counter++);
> if ((extra & 0xFC00) == 0xDC00) { // low surrogate
> output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
> } else {
> // unmatched surrogate; only append this code unit, in case the next
> // code unit is the high surrogate of a surrogate pair
> output.push(value);
> counter--;
> }
> } else {
> output.push(value);
> }
> }
> return output;
> }
>
> /**
> * Creates a string based on an array of numeric code points.
> * @see `punycode.ucs2.decode`
> * @memberOf punycode.ucs2
> * @name encode
> * @param {Array} codePoints The array of numeric code points.
> * @returns {String} The new Unicode string (UCS-2).
> */
> function ucs2encode(array) {
> return map(array, function(value) {
> var output = '';
> if (value > 0xFFFF) {
> value -= 0x10000;
> output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
> value = 0xDC00 | value & 0x3FF;
> }
> output += stringFromCharCode(value);
> return output;
> }).join('');
> }
>
> /**
> * Converts a basic code point into a digit/integer.
> * @see `digitToBasic()`
> * @private
> * @param {Number} codePoint The basic numeric code point value.
> * @returns {Number} The numeric value of a basic code point (for use in
> * representing integers) in the range `0` to `base - 1`, or `base` if
> * the code point does not represent a value.
> */
> function basicToDigit(codePoint) {
> if (codePoint - 48 < 10) {
> return codePoint - 22;
> }
> if (codePoint - 65 < 26) {
> return codePoint - 65;
> }
> if (codePoint - 97 < 26) {
> return codePoint - 97;
> }
> return base;
> }
>
> /**
> * Converts a digit/integer into a basic code point.
> * @see `basicToDigit()`
> * @private
> * @param {Number} digit The numeric value of a basic code point.
> * @returns {Number} The basic code point whose value (when used for
> * representing integers) is `digit`, which needs to be in the range
> * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
> * used; else, the lowercase form is used. The behavior is undefined
> * if `flag` is non-zero and `digit` has no uppercase form.
> */
> function digitToBasic(digit, flag) {
> // 0..25 map to ASCII a..z or A..Z
> // 26..35 map to ASCII 0..9
> return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
> }
>
> /**
> * Bias adaptation function as per section 3.4 of RFC 3492.
> * http://tools.ietf.org/html/rfc3492#section-3.4
> * @private
> */
> function adapt(delta, numPoints, firstTime) {
> var k = 0;
> delta = firstTime ? floor(delta / damp) : delta >> 1;
> delta += floor(delta / numPoints);
> for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
> delta = floor(delta / baseMinusTMin);
> }
> return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
> }
>
> /**
> * Converts a Punycode string of ASCII-only symbols to a string of Unicode
> * symbols.
> * @memberOf punycode
> * @param {String} input The Punycode string of ASCII-only symbols.
> * @returns {String} The resulting string of Unicode symbols.
> */
> function decode(input) {
> // Don't use UCS-2
> var output = [],
> inputLength = input.length,
> out,
> i = 0,
> n = initialN,
> bias = initialBias,
> basic,
> j,
> index,
> oldi,
> w,
> k,
> digit,
> t,
> /** Cached calculation results */
> baseMinusT;
>
> // Handle the basic code points: let `basic` be the number of input code
> // points before the last delimiter, or `0` if there is none, then copy
> // the first basic code points to the output.
>
> basic = input.lastIndexOf(delimiter);
> if (basic < 0) {
> basic = 0;
> }
>
> for (j = 0; j < basic; ++j) {
> // if it's not a basic code point
> if (input.charCodeAt(j) >= 0x80) {
> error('not-basic');
> }
> output.push(input.charCodeAt(j));
> }
>
> // Main decoding loop: start just after the last delimiter if any basic code
> // points were copied; start at the beginning otherwise.
>
> for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
>
> // `index` is the index of the next character to be consumed.
> // Decode a generalized variable-length integer into `delta`,
> // which gets added to `i`. The overflow checking is easier
> // if we increase `i` as we go, then subtract off its starting
> // value at the end to obtain `delta`.
> for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
>
> if (index >= inputLength) {
> error('invalid-input');
> }
>
> digit = basicToDigit(input.charCodeAt(index++));
>
> if (digit >= base || digit > floor((maxInt - i) / w)) {
> error('overflow');
> }
>
> i += digit * w;
> t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
>
> if (digit < t) {
> break;
> }
>
> baseMinusT = base - t;
> if (w > floor(maxInt / baseMinusT)) {
> error('overflow');
> }
>
> w *= baseMinusT;
>
> }
>
> out = output.length + 1;
> bias = adapt(i - oldi, out, oldi == 0);
>
> // `i` was supposed to wrap around from `out` to `0`,
> // incrementing `n` each time, so we'll fix that now:
> if (floor(i / out) > maxInt - n) {
> error('overflow');
> }
>
> n += floor(i / out);
> i %= out;
>
> // Insert `n` at position `i` of the output
> output.splice(i++, 0, n);
>
> }
>
> return ucs2encode(output);
> }
>
> /**
> * Converts a string of Unicode symbols (e.g. a domain name label) to a
> * Punycode string of ASCII-only symbols.
> * @memberOf punycode
> * @param {String} input The string of Unicode symbols.
> * @returns {String} The resulting Punycode string of ASCII-only symbols.
> */
> function encode(input) {
> var n,
> delta,
> handledCPCount,
> basicLength,
> bias,
> j,
> m,
> q,
> k,
> t,
> currentValue,
> output = [],
> /** `inputLength` will hold the number of code points in `input`. */
> inputLength,
> /** Cached calculation results */
> handledCPCountPlusOne,
> baseMinusT,
> qMinusT;
>
> // Convert the input in UCS-2 to Unicode
> input = ucs2decode(input);
>
> // Cache the length
> inputLength = input.length;
>
> // Initialize the state
> n = initialN;
> delta = 0;
> bias = initialBias;
>
> // Handle the basic code points
> for (j = 0; j < inputLength; ++j) {
> currentValue = input[j];
> if (currentValue < 0x80) {
> output.push(stringFromCharCode(currentValue));
> }
> }
>
> handledCPCount = basicLength = output.length;
>
> // `handledCPCount` is the number of code points that have been handled;
> // `basicLength` is the number of basic code points.
>
> // Finish the basic string - if it is not empty - with a delimiter
> if (basicLength) {
> output.push(delimiter);
> }
>
> // Main encoding loop:
> while (handledCPCount < inputLength) {
>
> // All non-basic code points < n have been handled already. Find the next
> // larger one:
> for (m = maxInt, j = 0; j < inputLength; ++j) {
> currentValue = input[j];
> if (currentValue >= n && currentValue < m) {
> m = currentValue;
> }
> }
>
> // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
> // but guard against overflow
> handledCPCountPlusOne = handledCPCount + 1;
> if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
> error('overflow');
> }
>
> delta += (m - n) * handledCPCountPlusOne;
> n = m;
>
> for (j = 0; j < inputLength; ++j) {
> currentValue = input[j];
>
> if (currentValue < n && ++delta > maxInt) {
> error('overflow');
> }
>
> if (currentValue == n) {
> // Represent delta as a generalized variable-length integer
> for (q = delta, k = base; /* no condition */; k += base) {
> t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
> if (q < t) {
> break;
> }
> qMinusT = q - t;
> baseMinusT = base - t;
> output.push(
> stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
> );
> q = floor(qMinusT / baseMinusT);
> }
>
> output.push(stringFromCharCode(digitToBasic(q, 0)));
> bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
> delta = 0;
> ++handledCPCount;
> }
> }
>
> ++delta;
> ++n;
>
> }
> return output.join('');
> }
>
> /**
> * Converts a Punycode string representing a domain name or an email address
> * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
> * it doesn't matter if you call it on a string that has already been
> * converted to Unicode.
> * @memberOf punycode
> * @param {String} input The Punycoded domain name or email address to
> * convert to Unicode.
> * @returns {String} The Unicode representation of the given Punycode
> * string.
> */
> function toUnicode(input) {
> return mapDomain(input, function(string) {
> return regexPunycode.test(string)
> ? decode(string.slice(4).toLowerCase())
> : string;
> });
> }
>
> /**
> * Converts a Unicode string representing a domain name or an email address to
> * Punycode. Only the non-ASCII parts of the domain name will be converted,
> * i.e. it doesn't matter if you call it with a domain that's already in
> * ASCII.
> * @memberOf punycode
> * @param {String} input The domain name or email address to convert, as a
> * Unicode string.
> * @returns {String} The Punycode representation of the given domain name or
> * email address.
> */
> function toASCII(input) {
> return mapDomain(input, function(string) {
> return regexNonASCII.test(string)
> ? 'xn--' + encode(string)
> : string;
> });
> }
>
> /*--------------------------------------------------------------------------*/
>
> /** Define the public API */
> punycode = {
> /**
> * A string representing the current Punycode.js version number.
> * @memberOf punycode
> * @type String
> */
> 'version': '1.3.2',
> /**
> * An object of methods to convert from JavaScript's internal character
> * representation (UCS-2) to Unicode code points, and back.
> * @see <https://mathiasbynens.be/notes/javascript-encoding>
> * @memberOf punycode
> * @type Object
> */
> 'ucs2': {
> 'decode': ucs2decode,
> 'encode': ucs2encode
> },
> 'decode': decode,
> 'encode': encode,
> 'toASCII': toASCII,
> 'toUnicode': toUnicode
> };
>
> /** Expose `punycode` */
> // Some AMD build optimizers, like r.js, check for specific condition patterns
> // like the following:
> if (
> typeof define == 'function' &&
> typeof define.amd == 'object' &&
> define.amd
> ) {
> define('punycode', function() {
> return punycode;
> });
> } else if (freeExports && freeModule) {
> if (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+
> freeModule.exports = punycode;
> } else { // in Narwhal or RingoJS v0.7.0-
> for (key in punycode) {
> punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
> }
> }
> } else { // in Rhino or a web browser
> root.punycode = punycode;
> }
>
> }(this));
>
> }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
>
> },{}],4:[function(require,module,exports){
> // Copyright Joyent, Inc. and other Node contributors.
> //
> // Permission is hereby granted, free of charge, to any person obtaining a
> // copy of this software and associated documentation files (the
> // "Software"), to deal in the Software without restriction, including
> // without limitation the rights to use, copy, modify, merge, publish,
> // distribute, sublicense, and/or sell copies of the Software, and to permit
> // persons to whom the Software is furnished to do so, subject to the
> // following conditions:
> //
> // The above copyright notice and this permission notice shall be included
> // in all copies or substantial portions of the Software.
> //
> // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
> // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
> // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
> // USE OR OTHER DEALINGS IN THE SOFTWARE.
>
> 'use strict';
>
> // If obj.hasOwnProperty has been overridden, then calling
> // obj.hasOwnProperty(prop) will break.
> // See: https://github.com/joyent/node/issues/1707
> function hasOwnProperty(obj, prop) {
> return Object.prototype.hasOwnProperty.call(obj, prop);
> }
>
> module.exports = function(qs, sep, eq, options) {
> sep = sep || '&';
> eq = eq || '=';
> var obj = {};
>
> if (typeof qs !== 'string' || qs.length === 0) {
> return obj;
> }
>
> var regexp = /\+/g;
> qs = qs.split(sep);
>
> var maxKeys = 1000;
> if (options && typeof options.maxKeys === 'number') {
> maxKeys = options.maxKeys;
> }
>
> var len = qs.length;
> // maxKeys <= 0 means that we should not limit keys count
> if (maxKeys > 0 && len > maxKeys) {
> len = maxKeys;
> }
>
> for (var i = 0; i < len; ++i) {
> var x = qs[i].replace(regexp, '%20'),
> idx = x.indexOf(eq),
> kstr, vstr, k, v;
>
> if (idx >= 0) {
> kstr = x.substr(0, idx);
> vstr = x.substr(idx + 1);
> } else {
> kstr = x;
> vstr = '';
> }
>
> k = decodeURIComponent(kstr);
> v = decodeURIComponent(vstr);
>
> if (!hasOwnProperty(obj, k)) {
> obj[k] = v;
> } else if (isArray(obj[k])) {
> obj[k].push(v);
> } else {
> obj[k] = [obj[k], v];
> }
> }
>
> return obj;
> };
>
> var isArray = Array.isArray || function (xs) {
> return Object.prototype.toString.call(xs) === '[object Array]';
> };
>
> },{}],5:[function(require,module,exports){
> // Copyright Joyent, Inc. and other Node contributors.
> //
> // Permission is hereby granted, free of charge, to any person obtaining a
> // copy of this software and associated documentation files (the
> // "Software"), to deal in the Software without restriction, including
> // without limitation the rights to use, copy, modify, merge, publish,
> // distribute, sublicense, and/or sell copies of the Software, and to permit
> // persons to whom the Software is furnished to do so, subject to the
> // following conditions:
> //
> // The above copyright notice and this permission notice shall be included
> // in all copies or substantial portions of the Software.
> //
> // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
> // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
> // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
> // USE OR OTHER DEALINGS IN THE SOFTWARE.
>
> 'use strict';
>
> var stringifyPrimitive = function(v) {
> switch (typeof v) {
> case 'string':
> return v;
>
> case 'boolean':
> return v ? 'true' : 'false';
>
> case 'number':
> return isFinite(v) ? v : '';
>
> default:
> return '';
> }
> };
>
> module.exports = function(obj, sep, eq, name) {
> sep = sep || '&';
> eq = eq || '=';
> if (obj === null) {
> obj = undefined;
> }
>
> if (typeof obj === 'object') {
> return map(objectKeys(obj), function(k) {
> var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
> if (isArray(obj[k])) {
> return map(obj[k], function(v) {
> return ks + encodeURIComponent(stringifyPrimitive(v));
> }).join(sep);
> } else {
> return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
> }
> }).join(sep);
>
> }
>
> if (!name) return '';
> return encodeURIComponent(stringifyPrimitive(name)) + eq +
> encodeURIComponent(stringifyPrimitive(obj));
> };
>
> var isArray = Array.isArray || function (xs) {
> return Object.prototype.toString.call(xs) === '[object Array]';
> };
>
> function map (xs, f) {
> if (xs.map) return xs.map(f);
> var res = [];
> for (var i = 0; i < xs.length; i++) {
> res.push(f(xs[i], i));
> }
> return res;
> }
>
> var objectKeys = Object.keys || function (obj) {
> var res = [];
> for (var key in obj) {
> if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
> }
> return res;
> };
>
> },{}],6:[function(require,module,exports){
> 'use strict';
>
> exports.decode = exports.parse = require('./decode');
> exports.encode = exports.stringify = require('./encode');
>
> },{"./decode":4,"./encode":5}],7:[function(require,module,exports){
> // Copyright Joyent, Inc. and other Node contributors.
> //
> // Permission is hereby granted, free of charge, to any person obtaining a
> // copy of this software and associated documentation files (the
> // "Software"), to deal in the Software without restriction, including
> // without limitation the rights to use, copy, modify, merge, publish,
> // distribute, sublicense, and/or sell copies of the Software, and to permit
> // persons to whom the Software is furnished to do so, subject to the
> // following conditions:
> //
> // The above copyright notice and this permission notice shall be included
> // in all copies or substantial portions of the Software.
> //
> // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
> // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
> // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
> // USE OR OTHER DEALINGS IN THE SOFTWARE.
>
> var punycode = require('punycode');
>
> exports.parse = urlParse;
> exports.resolve = urlResolve;
> exports.resolveObject = urlResolveObject;
> exports.format = urlFormat;
>
> exports.Url = Url;
>
> function Url() {
> this.protocol = null;
> this.slashes = null;
> this.auth = null;
> this.host = null;
> this.port = null;
> this.hostname = null;
> this.hash = null;
> this.search = null;
> this.query = null;
> this.pathname = null;
> this.path = null;
> this.href = null;
> }
>
> // Reference: RFC 3986, RFC 1808, RFC 2396
>
> // define these here so at least they only have to be
> // compiled once on the first module load.
> var protocolPattern = /^([a-z0-9.+-]+:)/i,
> portPattern = /:[0-9]*$/,
>
> // RFC 2396: characters reserved for delimiting URLs.
> // We actually just auto-escape these.
> delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
>
> // RFC 2396: characters not allowed for various reasons.
> unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
>
> // Allowed by RFCs, but cause of XSS attacks. Always escape these.
> autoEscape = ['\''].concat(unwise),
> // Characters that are never ever allowed in a hostname.
> // Note that any invalid chars are also handled, but these
> // are the ones that are *expected* to be seen, so we fast-path
> // them.
> nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
> hostEndingChars = ['/', '?', '#'],
> hostnameMaxLen = 255,
> hostnamePartPattern = /^[a-z0-9A-Z_-]{0,63}$/,
> hostnamePartStart = /^([a-z0-9A-Z_-]{0,63})(.*)$/,
> // protocols that can allow "unsafe" and "unwise" chars.
> unsafeProtocol = {
> 'javascript': true,
> 'javascript:': true
> },
> // protocols that never have a hostname.
> hostlessProtocol = {
> 'javascript': true,
> 'javascript:': true
> },
> // protocols that always contain a // bit.
> slashedProtocol = {
> 'http': true,
> 'https': true,
> 'ftp': true,
> 'gopher': true,
> 'file': true,
> 'http:': true,
> 'https:': true,
> 'ftp:': true,
> 'gopher:': true,
> 'file:': true
> },
> querystring = require('querystring');
>
> function urlParse(url, parseQueryString, slashesDenoteHost) {
> if (url && isObject(url) && url instanceof Url) return url;
>
> var u = new Url;
> u.parse(url, parseQueryString, slashesDenoteHost);
> return u;
> }
>
> Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
> if (!isString(url)) {
> throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
> }
>
> var rest = url;
>
> // trim before proceeding.
> // This is to support parse stuff like " http://foo.com \n"
> rest = rest.trim();
>
> var proto = protocolPattern.exec(rest);
> if (proto) {
> proto = proto[0];
> var lowerProto = proto.toLowerCase();
> this.protocol = lowerProto;
> rest = rest.substr(proto.length);
> }
>
> // figure out if it's got a host
> // user@server is *always* interpreted as a hostname, and url
> // resolution will treat //foo/bar as host=foo,path=bar because that's
> // how the browser resolves relative URLs.
> if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
> var slashes = rest.substr(0, 2) === '//';
> if (slashes && !(proto && hostlessProtocol[proto])) {
> rest = rest.substr(2);
> this.slashes = true;
> }
> }
>
> if (!hostlessProtocol[proto] &&
> (slashes || (proto && !slashedProtocol[proto]))) {
>
> // there's a hostname.
> // the first instance of /, ?, ;, or # ends the host.
> //
> // If there is an @ in the hostname, then non-host chars *are* allowed
> // to the left of the last @ sign, unless some host-ending character
> // comes *before* the @-sign.
> // URLs are obnoxious.
> //
> // ex:
> // http://a@b@c/ => user:a@b host:c
> // http://a@b?@c => user:a host:c path:/?@c
>
> // v0.12 TODO(isaacs): This is not quite how Chrome does things.
> // Review our test case against browsers more comprehensively.
>
> // find the first instance of any hostEndingChars
> var hostEnd = -1;
> for (var i = 0; i < hostEndingChars.length; i++) {
> var hec = rest.indexOf(hostEndingChars[i]);
> if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
> hostEnd = hec;
> }
>
> // at this point, either we have an explicit point where the
> // auth portion cannot go past, or the last @ char is the decider.
> var auth, atSign;
> if (hostEnd === -1) {
> // atSign can be anywhere.
> atSign = rest.lastIndexOf('@');
> } else {
> // atSign must be in auth portion.
> // http://a@b/c@d => host:b auth:a path:/c@d
> atSign = rest.lastIndexOf('@', hostEnd);
> }
>
> // Now we have a portion which is definitely the auth.
> // Pull that off.
> if (atSign !== -1) {
> auth = rest.slice(0, atSign);
> rest = rest.slice(atSign + 1);
> this.auth = decodeURIComponent(auth);
> }
>
> // the host is the remaining to the left of the first non-host char
> hostEnd = -1;
> for (var i = 0; i < nonHostChars.length; i++) {
> var hec = rest.indexOf(nonHostChars[i]);
> if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
> hostEnd = hec;
> }
> // if we still have not hit it, then the entire thing is a host.
> if (hostEnd === -1)
> hostEnd = rest.length;
>
> this.host = rest.slice(0, hostEnd);
> rest = rest.slice(hostEnd);
>
> // pull out port.
> this.parseHost();
>
> // we've indicated that there is a hostname,
> // so even if it's empty, it has to be present.
> this.hostname = this.hostname || '';
>
> // if hostname begins with [ and ends with ]
> // assume that it's an IPv6 address.
> var ipv6Hostname = this.hostname[0] === '[' &&
> this.hostname[this.hostname.length - 1] === ']';
>
> // validate a little.
> if (!ipv6Hostname) {
> var hostparts = this.hostname.split(/\./);
> for (var i = 0, l = hostparts.length; i < l; i++) {
> var part = hostparts[i];
> if (!part) continue;
> if (!part.match(hostnamePartPattern)) {
> var newpart = '';
> for (var j = 0, k = part.length; j < k; j++) {
> if (part.charCodeAt(j) > 127) {
> // we replace non-ASCII char with a temporary placeholder
> // we need this to make sure size of hostname is not
> // broken by replacing non-ASCII by nothing
> newpart += 'x';
> } else {
> newpart += part[j];
> }
> }
> // we test again with ASCII char only
> if (!newpart.match(hostnamePartPattern)) {
> var validParts = hostparts.slice(0, i);
> var notHost = hostparts.slice(i + 1);
> var bit = part.match(hostnamePartStart);
> if (bit) {
> validParts.push(bit[1]);
> notHost.unshift(bit[2]);
> }
> if (notHost.length) {
> rest = '/' + notHost.join('.') + rest;
> }
> this.hostname = validParts.join('.');
> break;
> }
> }
> }
> }
>
> if (this.hostname.length > hostnameMaxLen) {
> this.hostname = '';
> } else {
> // hostnames are always lower case.
> this.hostname = this.hostname.toLowerCase();
> }
>
> if (!ipv6Hostname) {
> // IDNA Support: Returns a puny coded representation of "domain".
> // It only converts the part of the domain name that
> // has non ASCII characters. I.e. it dosent matter if
> // you call it with a domain that already is in ASCII.
> var domainArray = this.hostname.split('.');
> var newOut = [];
> for (var i = 0; i < domainArray.length; ++i) {
> var s = domainArray[i];
> newOut.push(s.match(/[^A-Za-z0-9_-]/) ?
> 'xn--' + punycode.encode(s) : s);
> }
> this.hostname = newOut.join('.');
> }
>
> var p = this.port ? ':' + this.port : '';
> var h = this.hostname || '';
> this.host = h + p;
> this.href += this.host;
>
> // strip [ and ] from the hostname
> // the host field still retains them, though
> if (ipv6Hostname) {
> this.hostname = this.hostname.substr(1, this.hostname.length - 2);
> if (rest[0] !== '/') {
> rest = '/' + rest;
> }
> }
> }
>
> // now rest is set to the post-host stuff.
> // chop off any delim chars.
> if (!unsafeProtocol[lowerProto]) {
>
> // First, make 100% sure that any "autoEscape" chars get
> // escaped, even if encodeURIComponent doesn't think they
> // need to be.
> for (var i = 0, l = autoEscape.length; i < l; i++) {
> var ae = autoEscape[i];
> var esc = encodeURIComponent(ae);
> if (esc === ae) {
> esc = escape(ae);
> }
> rest = rest.split(ae).join(esc);
> }
> }
>
>
> // chop off from the tail first.
> var hash = rest.indexOf('#');
> if (hash !== -1) {
> // got a fragment string.
> this.hash = rest.substr(hash);
> rest = rest.slice(0, hash);
> }
> var qm = rest.indexOf('?');
> if (qm !== -1) {
> this.search = rest.substr(qm);
> this.query = rest.substr(qm + 1);
> if (parseQueryString) {
> this.query = querystring.parse(this.query);
> }
> rest = rest.slice(0, qm);
> } else if (parseQueryString) {
> // no query string, but parseQueryString still requested
> this.search = '';
> this.query = {};
> }
> if (rest) this.pathname = rest;
> if (slashedProtocol[lowerProto] &&
> this.hostname && !this.pathname) {
> this.pathname = '/';
> }
>
> //to support http.request
> if (this.pathname || this.search) {
> var p = this.pathname || '';
> var s = this.search || '';
> this.path = p + s;
> }
>
> // finally, reconstruct the href based on what has been validated.
> this.href = this.format();
> return this;
> };
>
> // format a parsed object into a url string
> function urlFormat(obj) {
> // ensure it's an object, and not a string url.
> // If it's an obj, this is a no-op.
> // this way, you can call url_format() on strings
> // to clean up potentially wonky urls.
> if (isString(obj)) obj = urlParse(obj);
> if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
> return obj.format();
> }
>
> Url.prototype.format = function() {
> var auth = this.auth || '';
> if (auth) {
> auth = encodeURIComponent(auth);
> auth = auth.replace(/%3A/i, ':');
> auth += '@';
> }
>
> var protocol = this.protocol || '',
> pathname = this.pathname || '',
> hash = this.hash || '',
> host = false,
> query = '';
>
> if (this.host) {
> host = auth + this.host;
> } else if (this.hostname) {
> host = auth + (this.hostname.indexOf(':') === -1 ?
> this.hostname :
> '[' + this.hostname + ']');
> if (this.port) {
> host += ':' + this.port;
> }
> }
>
> if (this.query &&
> isObject(this.query) &&
> Object.keys(this.query).length) {
> query = querystring.stringify(this.query);
> }
>
> var search = this.search || (query && ('?' + query)) || '';
>
> if (protocol && protocol.substr(-1) !== ':') protocol += ':';
>
> // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
> // unless they had them to begin with.
> if (this.slashes ||
> (!protocol || slashedProtocol[protocol]) && host !== false) {
> host = '//' + (host || '');
> if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
> } else if (!host) {
> host = '';
> }
>
> if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
> if (search && search.charAt(0) !== '?') search = '?' + search;
>
> pathname = pathname.replace(/[?#]/g, function(match) {
> return encodeURIComponent(match);
> });
> search = search.replace('#', '%23');
>
> return protocol + host + pathname + search + hash;
> };
>
> function urlResolve(source, relative) {
> return urlParse(source, false, true).resolve(relative);
> }
>
> Url.prototype.resolve = function(relative) {
> return this.resolveObject(urlParse(relative, false, true)).format();
> };
>
> function urlResolveObject(source, relative) {
> if (!source) return relative;
> return urlParse(source, false, true).resolveObject(relative);
> }
>
> Url.prototype.resolveObject = function(relative) {
> if (isString(relative)) {
> var rel = new Url();
> rel.parse(relative, false, true);
> relative = rel;
> }
>
> var result = new Url();
> Object.keys(this).forEach(function(k) {
> result[k] = this[k];
> }, this);
>
> // hash is always overridden, no matter what.
> // even href="" will remove it.
> result.hash = relative.hash;
>
> // if the relative url is empty, then there's nothing left to do here.
> if (relative.href === '') {
> result.href = result.format();
> return result;
> }
>
> // hrefs like //foo/bar always cut to the protocol.
> if (relative.slashes && !relative.protocol) {
> // take everything except the protocol from relative
> Object.keys(relative).forEach(function(k) {
> if (k !== 'protocol')
> result[k] = relative[k];
> });
>
> //urlParse appends trailing / to urls like http://www.example.com
> if (slashedProtocol[result.protocol] &&
> result.hostname && !result.pathname) {
> result.path = result.pathname = '/';
> }
>
> result.href = result.format();
> return result;
> }
>
> if (relative.protocol && relative.protocol !== result.protocol) {
> // if it's a known url protocol, then changing
> // the protocol does weird things
> // first, if it's not file:, then we MUST have a host,
> // and if there was a path
> // to begin with, then we MUST have a path.
> // if it is file:, then the host is dropped,
> // because that's known to be hostless.
> // anything else is assumed to be absolute.
> if (!slashedProtocol[relative.protocol]) {
> Object.keys(relative).forEach(function(k) {
> result[k] = relative[k];
> });
> result.href = result.format();
> return result;
> }
>
> result.protocol = relative.protocol;
> if (!relative.host && !hostlessProtocol[relative.protocol]) {
> var relPath = (relative.pathname || '').split('/');
> while (relPath.length && !(relative.host = relPath.shift()));
> if (!relative.host) relative.host = '';
> if (!relative.hostname) relative.hostname = '';
> if (relPath[0] !== '') relPath.unshift('');
> if (relPath.length < 2) relPath.unshift('');
> result.pathname = relPath.join('/');
> } else {
> result.pathname = relative.pathname;
> }
> result.search = relative.search;
> result.query = relative.query;
> result.host = relative.host || '';
> result.auth = relative.auth;
> result.hostname = relative.hostname || relative.host;
> result.port = relative.port;
> // to support http.request
> if (result.pathname || result.search) {
> var p = result.pathname || '';
> var s = result.search || '';
> result.path = p + s;
> }
> result.slashes = result.slashes || relative.slashes;
> result.href = result.format();
> return result;
> }
>
> var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),
> isRelAbs = (
> relative.host ||
> relative.pathname && relative.pathname.charAt(0) === '/'
> ),
> mustEndAbs = (isRelAbs || isSourceAbs ||
> (result.host && relative.pathname)),
> removeAllDots = mustEndAbs,
> srcPath = result.pathname && result.pathname.split('/') || [],
> relPath = relative.pathname && relative.pathname.split('/') || [],
> psychotic = result.protocol && !slashedProtocol[result.protocol];
>
> // if the url is a non-slashed url, then relative
> // links like ../.. should be able
> // to crawl up to the hostname, as well. This is strange.
> // result.protocol has already been set by now.
> // Later on, put the first path part into the host field.
> if (psychotic) {
> result.hostname = '';
> result.port = null;
> if (result.host) {
> if (srcPath[0] === '') srcPath[0] = result.host;
> else srcPath.unshift(result.host);
> }
> result.host = '';
> if (relative.protocol) {
> relative.hostname = null;
> relative.port = null;
> if (relative.host) {
> if (relPath[0] === '') relPath[0] = relative.host;
> else relPath.unshift(relative.host);
> }
> relative.host = null;
> }
> mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
> }
>
> if (isRelAbs) {
> // it's absolute.
> result.host = (relative.host || relative.host === '') ?
> relative.host : result.host;
> result.hostname = (relative.hostname || relative.hostname === '') ?
> relative.hostname : result.hostname;
> result.search = relative.search;
> result.query = relative.query;
> srcPath = relPath;
> // fall through to the dot-handling below.
> } else if (relPath.length) {
> // it's relative
> // throw away the existing file, and take the new path instead.
> if (!srcPath) srcPath = [];
> srcPath.pop();
> srcPath = srcPath.concat(relPath);
> result.search = relative.search;
> result.query = relative.query;
> } else if (!isNullOrUndefined(relative.search)) {
> // just pull out the search.
> // like href='?foo'.
> // Put this after the other two cases because it simplifies the booleans
> if (psychotic) {
> result.hostname = result.host = srcPath.shift();
> //occationaly the auth can get stuck only in host
> //this especialy happens in cases like
> //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
> var authInHost = result.host && result.host.indexOf('@') > 0 ?
> result.host.split('@') : false;
> if (authInHost) {
> result.auth = authInHost.shift();
> result.host = result.hostname = authInHost.shift();
> }
> }
> result.search = relative.search;
> result.query = relative.query;
> //to support http.request
> if (!isNull(result.pathname) || !isNull(result.search)) {
> result.path = (result.pathname ? result.pathname : '') +
> (result.search ? result.search : '');
> }
> result.href = result.format();
> return result;
> }
>
> if (!srcPath.length) {
> // no path at all. easy.
> // we've already handled the other stuff above.
> result.pathname = null;
> //to support http.request
> if (result.search) {
> result.path = '/' + result.search;
> } else {
> result.path = null;
> }
> result.href = result.format();
> return result;
> }
>
> // if a url ENDs in . or .., then it must get a trailing slash.
> // however, if it ends in anything else non-slashy,
> // then it must NOT get a trailing slash.
> var last = srcPath.slice(-1)[0];
> var hasTrailingSlash = (
> (result.host || relative.host) && (last === '.' || last === '..') ||
> last === '');
>
> // strip single dots, resolve double dots to parent dir
> // if the path tries to go above the root, `up` ends up > 0
> var up = 0;
> for (var i = srcPath.length; i >= 0; i--) {
> last = srcPath[i];
> if (last == '.') {
> srcPath.splice(i, 1);
> } else if (last === '..') {
> srcPath.splice(i, 1);
> up++;
> } else if (up) {
> srcPath.splice(i, 1);
> up--;
> }
> }
>
> // if the path is allowed to go above the root, restore leading ..s
> if (!mustEndAbs && !removeAllDots) {
> for (; up--; up) {
> srcPath.unshift('..');
> }
> }
>
> if (mustEndAbs && srcPath[0] !== '' &&
> (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
> srcPath.unshift('');
> }
>
> if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
> srcPath.push('');
> }
>
> var isAbsolute = srcPath[0] === '' ||
> (srcPath[0] && srcPath[0].charAt(0) === '/');
>
> // put the host back
> if (psychotic) {
> result.hostname = result.host = isAbsolute ? '' :
> srcPath.length ? srcPath.shift() : '';
> //occationaly the auth can get stuck only in host
> //this especialy happens in cases like
> //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
> var authInHost = result.host && result.host.indexOf('@') > 0 ?
> result.host.split('@') : false;
> if (authInHost) {
> result.auth = authInHost.shift();
> result.host = result.hostname = authInHost.shift();
> }
> }
>
> mustEndAbs = mustEndAbs || (result.host && srcPath.length);
>
> if (mustEndAbs && !isAbsolute) {
> srcPath.unshift('');
> }
>
> if (!srcPath.length) {
> result.pathname = null;
> result.path = null;
> } else {
> result.pathname = srcPath.join('/');
> }
>
> //to support request.http
> if (!isNull(result.pathname) || !isNull(result.search)) {
> result.path = (result.pathname ? result.pathname : '') +
> (result.search ? result.search : '');
> }
> result.auth = relative.auth || result.auth;
> result.slashes = result.slashes || relative.slashes;
> result.href = result.format();
> return result;
> };
>
> Url.prototype.parseHost = function() {
> var host = this.host;
> var port = portPattern.exec(host);
> if (port) {
> port = port[0];
> if (port !== ':') {
> this.port = port.substr(1);
> }
> host = host.substr(0, host.length - port.length);
> }
> if (host) this.hostname = host;
> };
>
> function isString(arg) {
> return typeof arg === "string";
> }
>
> function isObject(arg) {
> return typeof arg === 'object' && arg !== null;
> }
>
> function isNull(arg) {
> return arg === null;
> }
> function isNullOrUndefined(arg) {
> return arg == null;
> }
>
> },{"punycode":3,"querystring":6}],8:[function(require,module,exports){
125c1548
< },{}],4:[function(require,module,exports){
---
> },{}],9:[function(require,module,exports){
716c2139
< },{"./support/isBuffer":3,"_process":2,"inherits":1}],5:[function(require,module,exports){
---
> },{"./support/isBuffer":8,"_process":2,"inherits":1}],10:[function(require,module,exports){
796c2219
< },{}],6:[function(require,module,exports){
---
> },{}],11:[function(require,module,exports){
826c2249
< },{"./collision_box_vertex_buffer":7,"./fill_vertex_buffer":8,"./glyph_vertex_buffer":9,"./icon_vertex_buffer":10,"./line_element_buffer":11,"./line_vertex_buffer":12,"./outline_elements_buffer":13,"./triangle_element_buffer":14}],7:[function(require,module,exports){
---
> },{"./collision_box_vertex_buffer":12,"./fill_vertex_buffer":13,"./glyph_vertex_buffer":14,"./icon_vertex_buffer":15,"./line_element_buffer":16,"./line_vertex_buffer":17,"./outline_elements_buffer":18,"./triangle_element_buffer":19}],12:[function(require,module,exports){
865c2288
< },{"../../util/util":99,"./buffer":5}],8:[function(require,module,exports){
---
> },{"../../util/util":104,"./buffer":10}],13:[function(require,module,exports){
892c2315
< },{"../../util/util":99,"./buffer":5}],9:[function(require,module,exports){
---
> },{"../../util/util":104,"./buffer":10}],14:[function(require,module,exports){
945c2368
< },{"../../util/util":99,"./buffer":5}],10:[function(require,module,exports){
---
> },{"../../util/util":104,"./buffer":10}],15:[function(require,module,exports){
996c2419
< },{"../../util/util":99,"./buffer":5}],11:[function(require,module,exports){
---
> },{"../../util/util":104,"./buffer":10}],16:[function(require,module,exports){
1025c2448
< },{"../../util/util":99,"./buffer":5}],12:[function(require,module,exports){
---
> },{"../../util/util":104,"./buffer":10}],17:[function(require,module,exports){
1073c2496
< },{"../../util/util":99,"./buffer":5}],13:[function(require,module,exports){
---
> },{"../../util/util":104,"./buffer":10}],18:[function(require,module,exports){
1101c2524
< },{"../../util/util":99,"./buffer":5}],14:[function(require,module,exports){
---
> },{"../../util/util":104,"./buffer":10}],19:[function(require,module,exports){
1130c2553
< },{"../../util/util":99,"./buffer":5}],15:[function(require,module,exports){
---
> },{"../../util/util":104,"./buffer":10}],20:[function(require,module,exports){
1170c2593
< },{"../style/layout_properties":52,"../style/style_declaration_set":58,"./fill_bucket":18,"./line_bucket":19,"./symbol_bucket":20,"feature-filter":101}],16:[function(require,module,exports){
---
> },{"../style/layout_properties":57,"../style/style_declaration_set":63,"./fill_bucket":23,"./line_bucket":24,"./symbol_bucket":25,"feature-filter":106}],21:[function(require,module,exports){
1202c2625
< },{}],17:[function(require,module,exports){
---
> },{}],22:[function(require,module,exports){
1328c2751
< },{"../util/util":99,"point-geometry":116,"rbush":117,"vector-tile":119}],18:[function(require,module,exports){
---
> },{"../util/util":104,"point-geometry":121,"rbush":122,"vector-tile":124}],23:[function(require,module,exports){
1403c2826
< },{"./element_groups":16}],19:[function(require,module,exports){
---
> },{"./element_groups":21}],24:[function(require,module,exports){
1684c3107
< },{"./element_groups":16}],20:[function(require,module,exports){
---
> },{"./element_groups":21}],25:[function(require,module,exports){
2134c3557
< },{"../symbol/anchor":61,"../symbol/clip_line":64,"../symbol/collision_feature":66,"../symbol/get_anchors":68,"../symbol/mergelines":71,"../symbol/quads":72,"../symbol/resolve_icons":73,"../symbol/resolve_text":74,"../symbol/shaping":75,"../util/token":98,"./element_groups":16,"point-geometry":116}],21:[function(require,module,exports){
---
> },{"../symbol/anchor":66,"../symbol/clip_line":69,"../symbol/collision_feature":71,"../symbol/get_anchors":73,"../symbol/mergelines":76,"../symbol/quads":77,"../symbol/resolve_icons":78,"../symbol/resolve_text":79,"../symbol/shaping":80,"../util/token":103,"./element_groups":21,"point-geometry":121}],26:[function(require,module,exports){
2213c3636
< },{}],22:[function(require,module,exports){
---
> },{}],27:[function(require,module,exports){
2272c3695
< },{"../util/util":99}],23:[function(require,module,exports){
---
> },{"../util/util":104}],28:[function(require,module,exports){
2419c3842
< },{"./lat_lng":22}],24:[function(require,module,exports){
---
> },{"./lat_lng":27}],29:[function(require,module,exports){
2779c4202
< },{"../util/interpolate":95,"../util/util":99,"./coordinate":21,"./lat_lng":22,"gl-matrix":107,"point-geometry":116}],25:[function(require,module,exports){
---
> },{"../util/interpolate":100,"../util/util":104,"./coordinate":26,"./lat_lng":27,"gl-matrix":112,"point-geometry":121}],30:[function(require,module,exports){
2912c4335
< },{}],26:[function(require,module,exports){
---
> },{}],31:[function(require,module,exports){
3000c4423
< },{"gl-matrix":107}],27:[function(require,module,exports){
---
> },{"gl-matrix":112}],32:[function(require,module,exports){
3036c4459
< },{}],28:[function(require,module,exports){
---
> },{}],33:[function(require,module,exports){
3075c4498
< },{"../lib/debugtext":25,"../util/browser":88}],29:[function(require,module,exports){
---
> },{"../lib/debugtext":30,"../util/browser":93}],34:[function(require,module,exports){
3245c4668
< },{"../util/browser":88,"gl-matrix":107}],30:[function(require,module,exports){
---
> },{"../util/browser":93,"gl-matrix":112}],35:[function(require,module,exports){
3401c4824
< },{"../util/browser":88,"gl-matrix":107}],31:[function(require,module,exports){
---
> },{"../util/browser":93,"gl-matrix":112}],36:[function(require,module,exports){
3512c4935
< },{"../util/util":99}],32:[function(require,module,exports){
---
> },{"../util/util":104}],37:[function(require,module,exports){
3691c5114
< },{"../util/browser":88,"./draw_collision_debug":27,"gl-matrix":107}],33:[function(require,module,exports){
---
> },{"../util/browser":93,"./draw_collision_debug":32,"gl-matrix":112}],38:[function(require,module,exports){
3742c5165
< },{"../util/browser":88,"gl-matrix":107}],34:[function(require,module,exports){
---
> },{"../util/browser":93,"gl-matrix":112}],39:[function(require,module,exports){
3810c5233
< },{}],35:[function(require,module,exports){
---
> },{}],40:[function(require,module,exports){
3911c5334
< },{"../util/util":99,"./shaders":38}],36:[function(require,module,exports){
---
> },{"../util/util":104,"./shaders":43}],41:[function(require,module,exports){
4083c5506
< },{}],37:[function(require,module,exports){
---
> },{}],42:[function(require,module,exports){
4096,4097c5519,5520
< module.exports = GLPainter;
< function GLPainter(gl, transform) {
---
> module.exports = Painter;
> function Painter(gl, transform) {
4114c5537
< GLPainter.prototype.resize = function(width, height) {
---
> Painter.prototype.resize = function(width, height) {
4124c5547
< GLPainter.prototype.setup = function() {
---
> Painter.prototype.setup = function() {
4230c5653
< GLPainter.prototype.clearColor = function() {
---
> Painter.prototype.clearColor = function() {
4240c5663
< GLPainter.prototype.clearStencil = function() {
---
> Painter.prototype.clearStencil = function() {
4247c5670
< GLPainter.prototype.drawClippingMask = function(tile) {
---
> Painter.prototype.drawClippingMask = function(tile) {
4279,4280c5702,5703
< GLPainter.prototype.prepareBuffers = function() {};
< GLPainter.prototype.bindDefaultFramebuffer = function() {
---
> Painter.prototype.prepareBuffers = function() {};
> Painter.prototype.bindDefaultFramebuffer = function() {
4295c5718
< GLPainter.prototype.render = function(style, options) {
---
> Painter.prototype.render = function(style, options) {
4326c5749
< GLPainter.prototype.drawTile = function(tile, layers) {
---
> Painter.prototype.drawTile = function(tile, layers) {
4335c5758
< GLPainter.prototype.drawLayers = function(layers, matrix, tile) {
---
> Painter.prototype.drawLayers = function(layers, matrix, tile) {
4351c5774
< GLPainter.prototype.drawStencilBuffer = function() {
---
> Painter.prototype.drawStencilBuffer = function() {
4370c5793
< GLPainter.prototype.translateMatrix = function(matrix, tile, translate, anchor) {
---
> Painter.prototype.translateMatrix = function(matrix, tile, translate, anchor) {
4394c5817
< GLPainter.prototype.saveTexture = function(texture) {
---
> Painter.prototype.saveTexture = function(texture) {
4404c5827
< GLPainter.prototype.getTexture = function(size) {
---
> Painter.prototype.getTexture = function(size) {
4409c5832
< },{"../util/browser":88,"./draw_background":26,"./draw_debug":28,"./draw_fill":29,"./draw_line":30,"./draw_raster":31,"./draw_symbol":32,"./draw_vertices":33,"./frame_history":34,"./gl_util":35,"gl-matrix":107}],38:[function(require,module,exports){
---
> },{"../util/browser":93,"./draw_background":31,"./draw_debug":33,"./draw_fill":34,"./draw_line":35,"./draw_raster":36,"./draw_symbol":37,"./draw_vertices":38,"./frame_history":39,"./gl_util":40,"gl-matrix":112}],43:[function(require,module,exports){
4430c5853
< },{}],39:[function(require,module,exports){
---
> },{}],44:[function(require,module,exports){
4540c5963,5964
< maxZoom: this.maxzoom
---
> maxZoom: this.maxzoom,
> parentHref: typeof window !== 'undefined' && window.location.href
4606c6030
< },{"../util/evented":93,"../util/util":99,"./source":42,"./tile_pyramid":45}],40:[function(require,module,exports){
---
> },{"../util/evented":98,"../util/util":104,"./source":47,"./tile_pyramid":50}],45:[function(require,module,exports){
4673c6097
< },{"point-geometry":116,"vector-tile":119}],41:[function(require,module,exports){
---
> },{"point-geometry":121,"vector-tile":124}],46:[function(require,module,exports){
4770c6194
< },{"../util/ajax":87,"../util/evented":93,"../util/mapbox":96,"../util/util":99,"./source":42}],42:[function(require,module,exports){
---
> },{"../util/ajax":92,"../util/evented":98,"../util/mapbox":101,"../util/util":104,"./source":47}],47:[function(require,module,exports){
4894c6318
< },{"../util/ajax":87,"../util/browser":88,"../util/mapbox":96,"../util/util":99,"./geojson_source":39,"./raster_tile_source":41,"./tile_coord":44,"./tile_pyramid":45,"./vector_tile_source":46,"./video_source":47}],43:[function(require,module,exports){
---
> },{"../util/ajax":92,"../util/browser":93,"../util/mapbox":101,"../util/util":104,"./geojson_source":44,"./raster_tile_source":46,"./tile_coord":49,"./tile_pyramid":50,"./vector_tile_source":51,"./video_source":52}],48:[function(require,module,exports){
5042c6466
< },{"../data/buffer/buffer_set":6,"../util/util":99,"gl-matrix":107}],44:[function(require,module,exports){
---
> },{"../data/buffer/buffer_set":11,"../util/util":104,"gl-matrix":112}],49:[function(require,module,exports){
5202c6626
< },{}],45:[function(require,module,exports){
---
> },{}],50:[function(require,module,exports){
5540c6964
< },{"../util/mru_cache":97,"../util/util":99,"./tile":43,"./tile_coord":44,"point-geometry":116}],46:[function(require,module,exports){
---
> },{"../util/mru_cache":102,"../util/util":104,"./tile":48,"./tile_coord":49,"point-geometry":121}],51:[function(require,module,exports){
5690c7114
< },{"../util/evented":93,"../util/util":99,"./source":42}],47:[function(require,module,exports){
---
> },{"../util/evented":98,"../util/util":104,"./source":47}],52:[function(require,module,exports){
5870c7294
< },{"../geo/coordinate":21,"../geo/lat_lng":22,"../util/ajax":87,"../util/evented":93,"../util/util":99,"./tile":43,"point-geometry":116}],48:[function(require,module,exports){
---
> },{"../geo/coordinate":26,"../geo/lat_lng":27,"../util/ajax":92,"../util/evented":98,"../util/util":104,"./tile":48,"point-geometry":121}],53:[function(require,module,exports){
5878a7303
> var url = require('url');
5883c7308,7310
< module.exports = Worker;
---
> module.exports = function(self) {
> return new Worker(self);
> };
5977c7404,7417
< if (typeof params.data === 'string') ajax.getJSON(params.data, indexData);
---
>
> // Not, because of same origin issues, urls must either include an
> // explicit origin or absolute path.
> // ie: /foo/bar.json or http://example.com/bar.json
> // but not ../foo/bar.json
> if (typeof params.data === 'string') {
> var geojsonUrl = params.data;
> if (geojsonUrl.indexOf('http') === -1) {
> // To fix same origin issues with the web worker, prefix the url
> // with the origin.
> geojsonUrl = url.resolve(params.parentHref, geojsonUrl);
> }
> ajax.getJSON(geojsonUrl, indexData);
> }
6012c7452
< },{"../util/actor":86,"../util/ajax":87,"../util/util":99,"./geojson_wrapper":40,"./worker_tile":49,"geojson-vt":104,"pbf":114,"vector-tile":119}],49:[function(require,module,exports){
---
> },{"../util/actor":91,"../util/ajax":92,"../util/util":104,"./geojson_wrapper":45,"./worker_tile":54,"geojson-vt":109,"pbf":119,"url":7,"vector-tile":124}],54:[function(require,module,exports){
6282c7722
< },{"../data/buffer/buffer_set":6,"../data/create_bucket":15,"../data/feature_tree":17,"../symbol/collision_tile":67}],50:[function(require,module,exports){
---
> },{"../data/buffer/buffer_set":11,"../data/create_bucket":20,"../data/feature_tree":22,"../symbol/collision_tile":72}],55:[function(require,module,exports){
6314c7754
< },{}],51:[function(require,module,exports){
---
> },{}],56:[function(require,module,exports){
6394c7834
< },{"../util/ajax":87,"../util/browser":88,"../util/evented":93}],52:[function(require,module,exports){
---
> },{"../util/ajax":92,"../util/browser":93,"../util/evented":98}],57:[function(require,module,exports){
6416c7856
< },{"./reference":54}],53:[function(require,module,exports){
---
> },{"./reference":59}],58:[function(require,module,exports){
6442c7882
< },{"./reference":54,"csscolorparser":100}],54:[function(require,module,exports){
---
> },{"./reference":59,"csscolorparser":105}],59:[function(require,module,exports){
6445c7885
< },{"mapbox-gl-style-spec/reference/latest":111}],55:[function(require,module,exports){
---
> },{"mapbox-gl-style-spec/reference/latest":116}],60:[function(require,module,exports){
6925c8365
< },{"../render/line_atlas":36,"../source/source":42,"../symbol/glyph_atlas":69,"../symbol/glyph_source":70,"../symbol/sprite_atlas":76,"../util/ajax":87,"../util/browser":88,"../util/dispatcher":90,"../util/evented":93,"../util/mapbox":96,"../util/util":99,"./animation_loop":50,"./image_sprite":51,"./style_layer":59,"mapbox-gl-style-spec/lib/validate/latest":109}],56:[function(require,module,exports){
---
> },{"../render/line_atlas":41,"../source/source":47,"../symbol/glyph_atlas":74,"../symbol/glyph_source":75,"../symbol/sprite_atlas":81,"../util/ajax":92,"../util/browser":93,"../util/dispatcher":95,"../util/evented":98,"../util/mapbox":101,"../util/util":104,"./animation_loop":55,"./image_sprite":56,"./style_layer":64,"mapbox-gl-style-spec/lib/validate/latest":114}],61:[function(require,module,exports){
6979c8419
< },{"../util/util":99}],57:[function(require,module,exports){
---
> },{"../util/util":104}],62:[function(require,module,exports){
7062c8502
< },{"../util/util":99,"csscolorparser":100,"mapbox-gl-function":108}],58:[function(require,module,exports){
---
> },{"../util/util":104,"csscolorparser":105,"mapbox-gl-function":113}],63:[function(require,module,exports){
7149c8589
< },{"../util/util":99,"./reference":54,"./style_constant":56,"./style_declaration":57}],59:[function(require,module,exports){
---
> },{"../util/util":104,"./reference":59,"./style_constant":61,"./style_declaration":62}],64:[function(require,module,exports){
7348c8788
< },{"../util/util":99,"./layout_properties":52,"./paint_properties":53,"./style_constant":56,"./style_declaration_set":58,"./style_transition":60}],60:[function(require,module,exports){
---
> },{"../util/util":104,"./layout_properties":57,"./paint_properties":58,"./style_constant":61,"./style_declaration_set":63,"./style_transition":65}],65:[function(require,module,exports){
7423c8863
< },{"../util/interpolate":95,"../util/util":99}],61:[function(require,module,exports){
---
> },{"../util/interpolate":100,"../util/util":104}],66:[function(require,module,exports){
7446c8886
< },{"point-geometry":116}],62:[function(require,module,exports){
---
> },{"point-geometry":121}],67:[function(require,module,exports){
7532c8972
< },{}],63:[function(require,module,exports){
---
> },{}],68:[function(require,module,exports){
7599c9039
< },{}],64:[function(require,module,exports){
---
> },{}],69:[function(require,module,exports){
7662c9102
< },{"point-geometry":116}],65:[function(require,module,exports){
---
> },{"point-geometry":121}],70:[function(require,module,exports){
7688c9128
< },{}],66:[function(require,module,exports){
---
> },{}],71:[function(require,module,exports){
7780c9220
< },{"./collision_box":65}],67:[function(require,module,exports){
---
> },{"./collision_box":70}],72:[function(require,module,exports){
7888c9328
< },{"rbush":117}],68:[function(require,module,exports){
---
> },{"rbush":122}],73:[function(require,module,exports){
7965c9405
< },{"../symbol/anchor":61,"../util/interpolate":95,"./check_max_angle":63}],69:[function(require,module,exports){
---
> },{"../symbol/anchor":66,"../util/interpolate":100,"./check_max_angle":68}],74:[function(require,module,exports){
8172c9612
< },{"./bin_pack":62}],70:[function(require,module,exports){
---
> },{"./bin_pack":67}],75:[function(require,module,exports){
8305c9745
< },{"../util/ajax":87,"../util/glyphs":94,"../util/mapbox":96,"pbf":114}],71:[function(require,module,exports){
---
> },{"../util/ajax":92,"../util/glyphs":99,"../util/mapbox":101,"pbf":119}],76:[function(require,module,exports){
8396c9836
< },{}],72:[function(require,module,exports){
---
> },{}],77:[function(require,module,exports){
8587c10027
< },{"../symbol/anchor":61,"point-geometry":116}],73:[function(require,module,exports){
---
> },{"../symbol/anchor":66,"point-geometry":121}],78:[function(require,module,exports){
8610c10050
< },{"../util/token":98}],74:[function(require,module,exports){
---
> },{"../util/token":103}],79:[function(require,module,exports){
8677c10117
< },{"../util/token":98}],75:[function(require,module,exports){
---
> },{"../util/token":103}],80:[function(require,module,exports){
8835c10275
< },{}],76:[function(require,module,exports){
---
> },{}],81:[function(require,module,exports){
9140c10580
< },{"./bin_pack":62}],77:[function(require,module,exports){
---
> },{"./bin_pack":67}],82:[function(require,module,exports){
9793c11233
< },{"../geo/lat_lng":22,"../geo/lat_lng_bounds":23,"../util/browser":88,"../util/interpolate":95,"../util/util":99,"point-geometry":116}],78:[function(require,module,exports){
---
> },{"../geo/lat_lng":27,"../geo/lat_lng_bounds":28,"../util/browser":93,"../util/interpolate":100,"../util/util":104,"point-geometry":121}],83:[function(require,module,exports){
9854c11294
< },{"../../util/dom":91,"../../util/util":99,"./control":79}],79:[function(require,module,exports){
---
> },{"../../util/dom":96,"../../util/util":104,"./control":84}],84:[function(require,module,exports){
9905c11345
< },{}],80:[function(require,module,exports){
---
> },{}],85:[function(require,module,exports){
10033c11473
< },{"../../util/dom":91,"../../util/util":99,"./control":79}],81:[function(require,module,exports){
---
> },{"../../util/dom":96,"../../util/util":104,"./control":84}],86:[function(require,module,exports){
10238c11678
< },{"../geo/lat_lng_bounds":23,"../util/dom":91,"../util/util":99,"./interaction":83,"point-geometry":116}],82:[function(require,module,exports){
---
> },{"../geo/lat_lng_bounds":28,"../util/dom":96,"../util/util":104,"./interaction":88,"point-geometry":121}],87:[function(require,module,exports){
10310c11750
< },{"../util/util":99}],83:[function(require,module,exports){
---
> },{"../util/util":104}],88:[function(require,module,exports){
10612c12052
< },{"../util/browser":88,"../util/evented":93,"point-geometry":116}],84:[function(require,module,exports){
---
> },{"../util/browser":93,"../util/evented":98,"point-geometry":121}],89:[function(require,module,exports){
10623c12063
< var GLPainter = require('../render/painter');
---
> var Painter = require('../render/painter');
11152c12592
< this.painter = new GLPainter(gl, this.transform);
---
> this.painter = new Painter(gl, this.transform);
11360c12800
< },{"../geo/lat_lng":22,"../geo/lat_lng_bounds":23,"../geo/transform":24,"../render/painter":37,"../style/animation_loop":50,"../style/style":55,"../util/browser":88,"../util/canvas":89,"../util/dom":91,"../util/evented":93,"../util/util":99,"./camera":77,"./control/attribution":78,"./handlers":81,"./hash":82,"point-geometry":116}],85:[function(require,module,exports){
---
> },{"../geo/lat_lng":27,"../geo/lat_lng_bounds":28,"../geo/transform":29,"../render/painter":42,"../style/animation_loop":55,"../style/style":60,"../util/browser":93,"../util/canvas":94,"../util/dom":96,"../util/evented":98,"../util/util":104,"./camera":82,"./control/attribution":83,"./handlers":86,"./hash":87,"point-geometry":121}],90:[function(require,module,exports){
11573c13013
< },{"../geo/lat_lng":22,"../util/dom":91,"../util/evented":93,"../util/util":99}],86:[function(require,module,exports){
---
> },{"../geo/lat_lng":27,"../util/dom":96,"../util/evented":98,"../util/util":104}],91:[function(require,module,exports){
11641c13081
< },{}],87:[function(require,module,exports){
---
> },{}],92:[function(require,module,exports){
11718c13158
< },{}],88:[function(require,module,exports){
---
> },{}],93:[function(require,module,exports){
11835c13275
< },{"./canvas":89}],89:[function(require,module,exports){
---
> },{"./canvas":94}],94:[function(require,module,exports){
11901c13341
< },{"../util":99}],90:[function(require,module,exports){
---
> },{"../util":104}],95:[function(require,module,exports){
11905,11908c13345
<
< var scripts = document.getElementsByTagName("script");
< var workerFile = (document.currentScript || scripts[scripts.length - 1]).getAttribute('src');
< var absolute = workerFile.indexOf('http') !== -1;
---
> var WebWorkify = require('webworkify');
11915,11928c13352,13353
<
< var url, blob, i;
<
< for (i = 0; i < length; i++) {
< // due to cross domain issues we can't load it directly with the url,
< // so create a blob and object url and load that
< if (absolute) {
< blob = new Blob(['importScripts("' + workerFile + '");'], {type: 'application/javascript'});
< url = window.URL.createObjectURL(blob);
< } else {
< url = workerFile;
< }
<
< var worker = new window.Worker(url);
---
> for (var i = 0; i < length; i++) {
> var worker = new WebWorkify(require('../../source/worker'));
11960c13385
< },{"../actor":86}],91:[function(require,module,exports){
---
> },{"../../source/worker":53,"../actor":91,"webworkify":128}],96:[function(require,module,exports){
12012c13437
< },{}],92:[function(require,module,exports){
---
> },{}],97:[function(require,module,exports){
12022c13447
< },{}],93:[function(require,module,exports){
---
> },{}],98:[function(require,module,exports){
12126c13551
< },{"./util":99}],94:[function(require,module,exports){
---
> },{"./util":104}],99:[function(require,module,exports){
12161c13586
< },{}],95:[function(require,module,exports){
---
> },{}],100:[function(require,module,exports){
12202c13627
< },{}],96:[function(require,module,exports){
---
> },{}],101:[function(require,module,exports){
12269c13694
< },{"./browser":88,"./config":92}],97:[function(require,module,exports){
---
> },{"./browser":93,"./config":97}],102:[function(require,module,exports){
12362c13787
< },{}],98:[function(require,module,exports){
---
> },{}],103:[function(require,module,exports){
12381c13806
< },{}],99:[function(require,module,exports){
---
> },{}],104:[function(require,module,exports){
12702c14127
< },{"unitbezier":118}],100:[function(require,module,exports){
---
> },{"unitbezier":123}],105:[function(require,module,exports){
12904c14329
< },{}],101:[function(require,module,exports){
---
> },{}],106:[function(require,module,exports){
12984c14409
< },{}],102:[function(require,module,exports){
---
> },{}],107:[function(require,module,exports){
13132c14557
< },{}],103:[function(require,module,exports){
---
> },{}],108:[function(require,module,exports){
13274c14699
< },{"./simplify":105}],104:[function(require,module,exports){
---
> },{"./simplify":110}],109:[function(require,module,exports){
13480c14905
< },{"./clip":102,"./convert":103,"./tile":106}],105:[function(require,module,exports){
---
> },{"./clip":107,"./convert":108,"./tile":111}],110:[function(require,module,exports){
13553c14978
< },{}],106:[function(require,module,exports){
---
> },{}],111:[function(require,module,exports){
13632c15057
< },{}],107:[function(require,module,exports){
---
> },{}],112:[function(require,module,exports){
17882c19307
< },{}],108:[function(require,module,exports){
---
> },{}],113:[function(require,module,exports){
17966c19391
< },{}],109:[function(require,module,exports){
---
> },{}],114:[function(require,module,exports){
17976c19401
< },{"../../reference/latest.js":111,"./parsed":110}],110:[function(require,module,exports){
---
> },{"../../reference/latest.js":116,"./parsed":115}],115:[function(require,module,exports){
18366c19791
< },{"csscolorparser":100,"util":4}],111:[function(require,module,exports){
---
> },{"csscolorparser":105,"util":9}],116:[function(require,module,exports){
18369c19794
< },{"./v7.json":112}],112:[function(require,module,exports){
---
> },{"./v7.json":117}],117:[function(require,module,exports){
19562c20987
< },{}],113:[function(require,module,exports){
---
> },{}],118:[function(require,module,exports){
19723c21148
< },{"ieee754":115}],114:[function(require,module,exports){
---
> },{"ieee754":120}],119:[function(require,module,exports){
20151c21576
< },{"./buffer":113}],115:[function(require,module,exports){
---
> },{"./buffer":118}],120:[function(require,module,exports){
20237c21662
< },{}],116:[function(require,module,exports){
---
> },{}],121:[function(require,module,exports){
20370c21795
< },{}],117:[function(require,module,exports){
---
> },{}],122:[function(require,module,exports){
20987c22412
< },{}],118:[function(require,module,exports){
---
> },{}],123:[function(require,module,exports){
21094c22519
< },{}],119:[function(require,module,exports){
---
> },{}],124:[function(require,module,exports){
21099c22524
< },{"./lib/vectortile.js":120,"./lib/vectortilefeature.js":121,"./lib/vectortilelayer.js":122}],120:[function(require,module,exports){
---
> },{"./lib/vectortile.js":125,"./lib/vectortilefeature.js":126,"./lib/vectortilelayer.js":127}],125:[function(require,module,exports){
21118c22543
< },{"./vectortilelayer":122}],121:[function(require,module,exports){
---
> },{"./vectortilelayer":127}],126:[function(require,module,exports){
21282c22707
< },{"point-geometry":116}],122:[function(require,module,exports){
---
> },{"point-geometry":121}],127:[function(require,module,exports){
21345c22770,22827
< },{"./vectortilefeature.js":121}],123:[function(require,module,exports){
---
> },{"./vectortilefeature.js":126}],128:[function(require,module,exports){
> var bundleFn = arguments[3];
> var sources = arguments[4];
> var cache = arguments[5];
>
> var stringify = JSON.stringify;
>
> module.exports = function (fn) {
> var keys = [];
> var wkey;
> var cacheKeys = Object.keys(cache);
>
> for (var i = 0, l = cacheKeys.length; i < l; i++) {
> var key = cacheKeys[i];
> if (cache[key].exports === fn) {
> wkey = key;
> break;
> }
> }
>
> if (!wkey) {
> wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);
> var wcache = {};
> for (var i = 0, l = cacheKeys.length; i < l; i++) {
> var key = cacheKeys[i];
> wcache[key] = key;
> }
> sources[wkey] = [
> Function(['require','module','exports'], '(' + fn + ')(self)'),
> wcache
> ];
> }
> var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);
>
> var scache = {}; scache[wkey] = wkey;
> sources[skey] = [
> Function(['require'],'require(' + stringify(wkey) + ')(self)'),
> scache
> ];
>
> var src = '(' + bundleFn + ')({'
> + Object.keys(sources).map(function (key) {
> return stringify(key) + ':['
> + sources[key][0]
> + ',' + stringify(sources[key][1]) + ']'
> ;
> }).join(',')
> + '},{},[' + stringify(skey) + '])'
> ;
>
> var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
>
> return new Worker(URL.createObjectURL(
> new Blob([src], { type: 'text/javascript' })
> ));
> };
>
> },{}],129:[function(require,module,exports){
21355,21359d22836
< if (typeof window === 'undefined') {
< new (require('./source/worker'))(self); /*eslint no-new: 0*/
< } else {
< // jshint -W079
< var mapboxgl = module.exports = window.mapboxgl = {};
21361,21364c22838,22839
< mapboxgl.Map = require('./ui/map');
< mapboxgl.Navigation = require('./ui/control/navigation');
< mapboxgl.Attribution = require('./ui/control/attribution');
< mapboxgl.Popup = require('./ui/popup');
---
> // jshint -W079
> var mapboxgl = module.exports = {};
21366,21367c22841,22844
< mapboxgl.GeoJSONSource = require('./source/geojson_source');
< mapboxgl.VideoSource = require('./source/video_source');
---
> mapboxgl.Map = require('./ui/map');
> mapboxgl.Navigation = require('./ui/control/navigation');
> mapboxgl.Attribution = require('./ui/control/attribution');
> mapboxgl.Popup = require('./ui/popup');
21369c22846,22847
< mapboxgl.Style = require('./style/style');
---
> mapboxgl.GeoJSONSource = require('./source/geojson_source');
> mapboxgl.VideoSource = require('./source/video_source');
21371,21373c22849
< mapboxgl.LatLng = require('./geo/lat_lng');
< mapboxgl.LatLngBounds = require('./geo/lat_lng_bounds');
< mapboxgl.Point = require('point-geometry');
---
> mapboxgl.Style = require('./style/style');
21375,21376c22851,22853
< mapboxgl.Evented = require('./util/evented');
< mapboxgl.util = require('./util/util');
---
> mapboxgl.LatLng = require('./geo/lat_lng');
> mapboxgl.LatLngBounds = require('./geo/lat_lng_bounds');
> mapboxgl.Point = require('point-geometry');
21378c22855,22856
< mapboxgl.supported = require('./util/browser').supported;
---
> mapboxgl.Evented = require('./util/evented');
> mapboxgl.util = require('./util/util');
21380,21382c22858
< var ajax = require('./util/ajax');
< mapboxgl.util.getJSON = ajax.getJSON;
< mapboxgl.util.getArrayBuffer = ajax.getArrayBuffer;
---
> mapboxgl.supported = require('./util/browser').supported;
21384,21385c22860,22862
< var config = require('./util/config');
< mapboxgl.config = config;
---
> var ajax = require('./util/ajax');
> mapboxgl.util.getJSON = ajax.getJSON;
> mapboxgl.util.getArrayBuffer = ajax.getArrayBuffer;
21387,21391c22864,22865
< Object.defineProperty(mapboxgl, 'accessToken', {
< get: function() { return config.ACCESS_TOKEN; },
< set: function(token) { config.ACCESS_TOKEN = token; }
< });
< }
---
> var config = require('./util/config');
> mapboxgl.config = config;
21393,21394c22867,22874
< },{"./geo/lat_lng":22,"./geo/lat_lng_bounds":23,"./source/geojson_source":39,"./source/video_source":47,"./source/worker":48,"./style/style":55,"./ui/control/attribution":78,"./ui/control/navigation":80,"./ui/map":84,"./ui/popup":85,"./util/ajax":87,"./util/browser":88,"./util/config":92,"./util/evented":93,"./util/util":99,"point-geometry":116}]},{},[123])
< //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy5udm0vdjAuMTAuMjYvbGliL25vZGVfbW9kdWxlcy9idWRvL25vZGVfbW9kdWxlcy93YXRjaGlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiLi4vLi4vLi4vLm52bS92MC4xMC4yNi9saWIvbm9kZV9tb2R1bGVzL2J1ZG8vbm9kZV9tb2R1bGVzL3dhdGNoaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwiLi4vLi4vLi4vLm52bS92MC4xMC4yNi9saWIvbm9kZV9tb2R1bGVzL2J1ZG8vbm9kZV9tb2R1bGVzL3dhdGNoaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCIuLi8uLi8uLi8ubnZtL3YwLjEwLjI2L2xpYi9ub2RlX21vZHVsZXMvYnVkby9ub2RlX21vZHVsZXMvd2F0Y2hpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCIuLi8uLi8uLi8ubnZtL3YwLjEwLjI2L2xpYi9ub2RlX21vZHVsZXMvYnVkby9ub2RlX21vZHVsZXMvd2F0Y2hpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsImpzL2RhdGEvYnVmZmVyL2J1ZmZlci5qcyIsImpzL2RhdGEvYnVmZmVyL2J1ZmZlcl9zZXQuanMiLCJqcy9kYXRhL2J1ZmZlci9jb2xsaXNpb25fYm94X3ZlcnRleF9idWZmZXIuanMiLCJqcy9kYXRhL2J1ZmZlci9maWxsX3ZlcnRleF9idWZmZXIuanMiLCJqcy9kYXRhL2J1ZmZlci9nbHlwaF92ZXJ0ZXhfYnVmZmVyLmpzIiwianMvZGF0YS9idWZmZXIvaWNvbl92ZXJ0ZXhfYnVmZmVyLmpzIiwianMvZGF0YS9idWZmZXIvbGluZV9lbGVtZW50X2J1ZmZlci5qcyIsImpzL2RhdGEvYnVmZmVyL2xpbmVfdmVydGV4X2J1ZmZlci5qcyIsImpzL2RhdGEvYnVmZmVyL291dGxpbmVfZWxlbWVudHNfYnVmZmVyLmpzIiwianMvZGF0YS9idWZmZXIvdHJpYW5nbGVfZWxlbWVudF9idWZmZXIuanMiLCJqcy9kYXRhL2NyZWF0ZV9idWNrZXQuanMiLCJqcy9kYXRhL2VsZW1lbnRfZ3JvdXBzLmpzIiwianMvZGF0YS9mZWF0dXJlX3RyZWUuanMiLCJqcy9kYXRhL2ZpbGxfYnVja2V0LmpzIiwianMvZGF0YS9saW5lX2J1Y2tldC5qcyIsImpzL2RhdGEvc3ltYm9sX2J1Y2tldC5qcyIsImpzL2dlby9jb29yZGluYXRlLmpzIiwianMvZ2VvL2xhdF9sbmcuanMiLCJqcy9nZW8vbGF0X2xuZ19ib3VuZHMuanMiLCJqcy9nZW8vdHJhbnNmb3JtLmpzIiwianMvbGliL2RlYnVndGV4dC5qcyIsImpzL3JlbmRlci9kcmF3X2JhY2tncm91bmQuanMiLCJqcy9yZW5kZXIvZHJhd19jb2xsaXNpb25fZGVidWcuanMiLCJqcy9yZW5kZXIvZHJhd19kZWJ1Zy5qcyIsImpzL3JlbmRlci9kcmF3X2ZpbGwuanMiLCJqcy9yZW5kZXIvZHJhd19saW5lLmpzIiwianMvcmVuZGVyL2RyYXdfcmFzdGVyLmpzIiwianMvcmVuZGVyL2RyYXdfc3ltYm9sLmpzIiwianMvcmVuZGVyL2RyYXdfdmVydGljZXMuanMiLCJqcy9yZW5kZXIvZnJhbWVfaGlzdG9yeS5qcyIsImpzL3JlbmRlci9nbF91dGlsLmpzIiwianMvcmVuZGVyL2xpbmVfYXRsYXMuanMiLCJqcy9yZW5kZXIvcGFpbnRlci5qcyIsImpzL3JlbmRlci9zaGFkZXJzLmpzIiwianMvc291cmNlL2dlb2pzb25fc291cmNlLmpzIiwianMvc291cmNlL2dlb2pzb25fd3JhcHBlci5qcyIsImpzL3NvdXJjZS9yYXN0ZXJfdGlsZV9zb3VyY2UuanMiLCJqcy9zb3VyY2Uvc291cmNlLmpzIiwianMvc291cmNlL3RpbGUuanMiLCJqcy9zb3VyY2UvdGlsZV9jb29yZC5qcyIsImpzL3NvdXJjZS90aWxlX3B5cmFtaWQuanMiLCJqcy9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlLmpzIiwianMvc291cmNlL3ZpZGVvX3NvdXJjZS5qcyIsImpzL3NvdXJjZS93b3JrZXIuanMiLCJqcy9zb3VyY2Uvd29ya2VyX3RpbGUuanMiLCJqcy9zdHlsZS9hbmltYXRpb25fbG9vcC5qcyIsImpzL3N0eWxlL2ltYWdlX3Nwcml0ZS5qcyIsImpzL3N0eWxlL2xheW91dF9wcm9wZXJ0aWVzLmpzIiwianMvc3R5bGUvcGFpbnRfcHJvcGVydGllcy5qcyIsImpzL3N0eWxlL3JlZmVyZW5jZS5qcyIsImpzL3N0eWxlL3N0eWxlLmpzIiwianMvc3R5bGUvc3R5bGVfY29uc3RhbnQuanMiLCJqcy9zdHlsZS9zdHlsZV9kZWNsYXJhdGlvbi5qcyIsImpzL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uX3NldC5qcyIsImpzL3N0eWxlL3N0eWxlX2xheWVyLmpzIiwianMvc3R5bGUvc3R5bGVfdHJhbnNpdGlvbi5qcyIsImpzL3N5bWJvbC9hbmNob3IuanMiLCJqcy9zeW1ib2wvYmluX3BhY2suanMiLCJqcy9zeW1ib2wvY2hlY2tfbWF4X2FuZ2xlLmpzIiwianMvc3ltYm9sL2NsaXBfbGluZS5qcyIsImpzL3N5bWJvbC9jb2xsaXNpb25fYm94LmpzIiwianMvc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlLmpzIiwianMvc3ltYm9sL2NvbGxpc2lvbl90aWxlLmpzIiwianMvc3ltYm9sL2dldF9hbmNob3JzLmpzIiwianMvc3ltYm9sL2dseXBoX2F0bGFzLmpzIiwianMvc3ltYm9sL2dseXBoX3NvdXJjZS5qcyIsImpzL3N5bWJvbC9tZXJnZWxpbmVzLmpzIiwianMvc3ltYm9sL3F1YWRzLmpzIiwianMvc3ltYm9sL3Jlc29sdmVfaWNvbnMuanMiLCJqcy9zeW1ib2wvcmVzb2x2ZV90ZXh0LmpzIiwianMvc3ltYm9sL3NoYXBpbmcuanMiLCJqcy9zeW1ib2wvc3ByaXRlX2F0bGFzLmpzIiwianMvdWkvY2FtZXJhLmpzIiwianMvdWkvY29udHJvbC9hdHRyaWJ1dGlvbi5qcyIsImpzL3VpL2NvbnRyb2wvY29udHJvbC5qcyIsImpzL3VpL2NvbnRyb2wvbmF2aWdhdGlvbi5qcyIsImpzL3VpL2hhbmRsZXJzLmpzIiwianMvdWkvaGFzaC5qcyIsImpzL3VpL2ludGVyYWN0aW9uLmpzIiwianMvdWkvbWFwLmpzIiwianMvdWkvcG9wdXAuanMiLCJqcy91dGlsL2FjdG9yLmpzIiwianMvdXRpbC9icm93c2VyL2FqYXguanMiLCJqcy91dGlsL2Jyb3dzZXIvYnJvd3Nlci5qcyIsImpzL3V0aWwvYnJvd3Nlci9jYW52YXMuanMiLCJqcy91dGlsL2Jyb3dzZXIvZGlzcGF0Y2hlci5qcyIsImpzL3V0aWwvYnJvd3Nlci9kb20uanMiLCJqcy91dGlsL2NvbmZpZy5qcyIsImpzL3V0aWwvZXZlbnRlZC5qcyIsImpzL3V0aWwvZ2x5cGhzLmpzIiwianMvdXRpbC9pbnRlcnBvbGF0ZS5qcyIsImpzL3V0aWwvbWFwYm94LmpzIiwianMvdXRpbC9tcnVfY2FjaGUuanMiLCJqcy91dGlsL3Rva2VuLmpzIiwianMvdXRpbC91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2Nzc2NvbG9ycGFyc2VyL2Nzc2NvbG9ycGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2ZlYXR1cmUtZmlsdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9kaXN0L2dsLW1hdHJpeC5qcyIsIm5vZGVfbW9kdWxlcy9tYXBib3gtZ2wtZnVuY3Rpb24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL2xhdGVzdC5qcyIsIm5vZGVfbW9kdWxlcy9tYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGUvcGFyc2VkLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvcmVmZXJlbmNlL3Y3Lmpzb24iLCJub2RlX21vZHVsZXMvcGJmL2J1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGJmL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BvaW50LWdlb21ldHJ5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JidXNoL3JidXNoLmpzIiwibm9kZV9tb2R1bGVzL3VuaXRiZXppZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGUuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMiLCJqcy9tYXBib3gtZ2wuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOWRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDck1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM29CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeHBJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwWUE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2cUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2YUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdm1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6R0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG4vLyBUT0RPKHNodHlsbWFuKVxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gYSBzaW1wbGUgd3JhcHBlciBhcm91bmQgYSBzaW5nbGUgYXJyYXlidWZmZXJcblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXI7XG5cbmZ1bmN0aW9uIEJ1ZmZlcihidWZmZXIpIHtcbiAgICBpZiAoIWJ1ZmZlcikge1xuICAgICAgICB0aGlzLmFycmF5ID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuZGVmYXVsdExlbmd0aCk7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kZWZhdWx0TGVuZ3RoO1xuICAgICAgICB0aGlzLnNldHVwVmlld3MoKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHdlIG9ubHkgcmVjcmVhdGUgYnVmZmVycyBhZnRlciByZWNlaXZpbmcgdGhlbSBmcm9tIHdvcmtlcnMgZm9yIGJpbmRpbmcgdG8gZ2wsXG4gICAgICAgIC8vIHNvIHdlIG9ubHkgbmVlZCB0aGVzZSAyIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy5hcnJheSA9IGJ1ZmZlci5hcnJheTtcbiAgICAgICAgdGhpcy5wb3MgPSBidWZmZXIucG9zO1xuICAgIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZSA9IHtcbiAgICBwb3M6IDAsXG4gICAgaXRlbVNpemU6IDQsIC8vIGJ5dGVzIGluIG9uZSBpdGVtXG4gICAgZGVmYXVsdExlbmd0aDogODE5MiwgLy8gaW5pdGlhbCBidWZmZXIgc2l6ZVxuICAgIGFycmF5VHlwZTogJ0FSUkFZX0JVRkZFUicsIC8vIGdsIGJ1ZmZlciB0eXBlXG5cbiAgICBnZXQgaW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyAvIHRoaXMuaXRlbVNpemU7XG4gICAgfSxcblxuICAgIHNldHVwVmlld3M6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBzZXQgdXAgdmlld3MgZm9yIGVhY2ggdHlwZSB0byBhZGQgZGF0YSBvZiBkaWZmZXJlbnQgdHlwZXMgdG8gdGhlIHNhbWUgYnVmZmVyXG4gICAgICAgIHRoaXMudWJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBuZXcgSW50OEFycmF5KHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLnVzaG9ydHMgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuc2hvcnRzID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8vIGJpbmRzIHRoZSBidWZmZXIgdG8gYSB3ZWJnbCBjb250ZXh0XG4gICAgYmluZDogZnVuY3Rpb24oZ2wpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBnbFt0aGlzLmFycmF5VHlwZV07XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgICAgICBnbC5iaW5kQnVmZmVyKHR5cGUsIHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEodHlwZSwgdGhpcy5hcnJheS5zbGljZSgwLCB0aGlzLnBvcyksIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgICAgICAgICAgLy8gZHVtcCBhcnJheSBidWZmZXIgb25jZSBpdCdzIGJvdW5kIHRvIGdsXG4gICAgICAgICAgICB0aGlzLmFycmF5ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIodHlwZSwgdGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKGdsKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBpbmNyZWFzZSB0aGUgYnVmZmVyIHNpemUgYnkgNTAlIGlmIGEgbmV3IGl0ZW0gZG9lc24ndCBmaXRcbiAgICByZXNpemU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPCB0aGlzLnBvcyArIHRoaXMuaXRlbVNpemUpIHtcblxuICAgICAgICAgICAgd2hpbGUgKHRoaXMubGVuZ3RoIDwgdGhpcy5wb3MgKyB0aGlzLml0ZW1TaXplKSB7XG4gICAgICAgICAgICAgICAgLy8gaW5jcmVhc2UgdGhlIGxlbmd0aCBieSA1MCUgYnV0IGtlZXAgaXQgZXZlblxuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gTWF0aC5yb3VuZCh0aGlzLmxlbmd0aCAqIDEuNSAvIDIpICogMjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYXJyYXkgYnVmZmVycyBjYW4ndCBiZSByZXNpemVkLCBzbyB3ZSBjcmVhdGUgYSBuZXcgb25lIGFuZCByZXNldCBhbGwgYnl0ZXMgdGhlcmVcbiAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5sZW5ndGgpO1xuXG4gICAgICAgICAgICB2YXIgdWJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheSk7XG4gICAgICAgICAgICB1Ynl0ZXMuc2V0KHRoaXMudWJ5dGVzKTtcblxuICAgICAgICAgICAgdGhpcy5zZXR1cFZpZXdzKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTGluZVZlcnRleEJ1ZmZlciA9IHJlcXVpcmUoJy4vbGluZV92ZXJ0ZXhfYnVmZmVyJyk7XG52YXIgTGluZUVsZW1lbnRCdWZmZXIgPSByZXF1aXJlKCcuL2xpbmVfZWxlbWVudF9idWZmZXInKTtcbnZhciBGaWxsVmVydGV4QnVmZmVyID0gcmVxdWlyZSgnLi9maWxsX3ZlcnRleF9idWZmZXInKTtcbnZhciBGaWxsRWxlbWVudEJ1ZmZlciA9IHJlcXVpcmUoJy4vdHJpYW5nbGVfZWxlbWVudF9idWZmZXInKTtcbnZhciBPdXRsaW5lRWxlbWVudEJ1ZmZlciA9IHJlcXVpcmUoJy4vb3V0bGluZV9lbGVtZW50c19idWZmZXInKTtcbnZhciBHbHlwaFZlcnRleEJ1ZmZlciA9IHJlcXVpcmUoJy4vZ2x5cGhfdmVydGV4X2J1ZmZlcicpO1xudmFyIEdseXBoRWxlbWVudEJ1ZmZlciA9IHJlcXVpcmUoJy4vdHJpYW5nbGVfZWxlbWVudF9idWZmZXInKTtcbnZhciBJY29uVmVydGV4QnVmZmVyID0gcmVxdWlyZSgnLi9pY29uX3ZlcnRleF9idWZmZXInKTtcbnZhciBJY29uRWxlbWVudEJ1ZmZlciA9IHJlcXVpcmUoJy4vdHJpYW5nbGVfZWxlbWVudF9idWZmZXInKTtcbnZhciBDb2xsaXNpb25Cb3hWZXJ0ZXhCdWZmZXIgPSByZXF1aXJlKCcuL2NvbGxpc2lvbl9ib3hfdmVydGV4X2J1ZmZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJ1ZmZlcnNldCkge1xuICAgIGJ1ZmZlcnNldCA9IGJ1ZmZlcnNldCB8fCB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnbHlwaFZlcnRleDogbmV3IEdseXBoVmVydGV4QnVmZmVyKGJ1ZmZlcnNldC5nbHlwaFZlcnRleCksXG4gICAgICAgIGdseXBoRWxlbWVudDogbmV3IEdseXBoRWxlbWVudEJ1ZmZlcihidWZmZXJzZXQuZ2x5cGhFbGVtZW50KSxcbiAgICAgICAgaWNvblZlcnRleDogbmV3IEljb25WZXJ0ZXhCdWZmZXIoYnVmZmVyc2V0Lmljb25WZXJ0ZXgpLFxuICAgICAgICBpY29uRWxlbWVudDogbmV3IEljb25FbGVtZW50QnVmZmVyKGJ1ZmZlcnNldC5pY29uRWxlbWVudCksXG4gICAgICAgIGZpbGxWZXJ0ZXg6IG5ldyBGaWxsVmVydGV4QnVmZmVyKGJ1ZmZlcnNldC5maWxsVmVydGV4KSxcbiAgICAgICAgZmlsbEVsZW1lbnQ6IG5ldyBGaWxsRWxlbWVudEJ1ZmZlcihidWZmZXJzZXQuZmlsbEVsZW1lbnQpLFxuICAgICAgICBvdXRsaW5lRWxlbWVudDogbmV3IE91dGxpbmVFbGVtZW50QnVmZmVyKGJ1ZmZlcnNldC5vdXRsaW5lRWxlbWVudCksXG4gICAgICAgIGxpbmVWZXJ0ZXg6IG5ldyBMaW5lVmVydGV4QnVmZmVyKGJ1ZmZlcnNldC5saW5lVmVydGV4KSxcbiAgICAgICAgbGluZUVsZW1lbnQ6IG5ldyBMaW5lRWxlbWVudEJ1ZmZlcihidWZmZXJzZXQubGluZUVsZW1lbnQpLFxuICAgICAgICBjb2xsaXNpb25Cb3hWZXJ0ZXg6IG5ldyBDb2xsaXNpb25Cb3hWZXJ0ZXhCdWZmZXIoYnVmZmVyc2V0LmNvbGxpc2lvbkJveFZlcnRleClcbiAgICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxpc2lvbkJveFZlcnRleEJ1ZmZlcjtcblxuZnVuY3Rpb24gQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyKGJ1ZmZlcikge1xuICAgIEJ1ZmZlci5jYWxsKHRoaXMsIGJ1ZmZlcik7XG59XG5cbkNvbGxpc2lvbkJveFZlcnRleEJ1ZmZlci5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoQnVmZmVyLCB7XG4gICAgaXRlbVNpemU6IDEyLCAvLyBieXRlcyBwZXIgdmVydGV4ICgyICogc2hvcnQgKyAxICogc2hvcnQgKyAyICogYnl0ZSA9IDggYnl0ZXMpXG4gICAgZGVmYXVsdExlbmd0aDogMzI3NjgsXG5cbiAgICAvLyBhZGQgYSB2ZXJ0ZXggdG8gdGhpcyBidWZmZXI7XG4gICAgLy8geCwgeSAtIHZlcnRleCBwb3NpdGlvblxuICAgIC8vIGV4LCBleSAtIGV4dHJ1ZGUgbm9ybWFsXG4gICAgYWRkOiBmdW5jdGlvbihwb2ludCwgZXh0cnVkZSwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSkge1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICBwb3MyID0gcG9zIC8gMixcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5pbmRleDtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAwXSA9IHBvaW50Lng7XG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAxXSA9IHBvaW50Lnk7XG5cbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDJdID0gTWF0aC5yb3VuZChleHRydWRlLngpO1xuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgM10gPSBNYXRoLnJvdW5kKGV4dHJ1ZGUueSk7XG4gICAgICAgIHRoaXMudWJ5dGVzW3BvcyArIDhdID0gTWF0aC5mbG9vcihtYXhab29tICogMTApO1xuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyA5XSA9IE1hdGguZmxvb3IocGxhY2VtZW50Wm9vbSAqIDEwKTtcblxuICAgICAgICB0aGlzLnBvcyArPSB0aGlzLml0ZW1TaXplO1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGaWxsVmVydGV4QnVmZmVyO1xuXG5mdW5jdGlvbiBGaWxsVmVydGV4QnVmZmVyKGJ1ZmZlcikge1xuICAgIEJ1ZmZlci5jYWxsKHRoaXMsIGJ1ZmZlcik7XG59XG5cbkZpbGxWZXJ0ZXhCdWZmZXIucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEJ1ZmZlciwge1xuICAgIGl0ZW1TaXplOiA0LCAvLyBieXRlcyBwZXIgdmVydGV4ICgyICogc2hvcnQgPT0gNCBieXRlcylcblxuICAgIGFkZDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICB2YXIgcG9zMiA9IHRoaXMucG9zIC8gMjtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAwXSA9IHg7XG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAxXSA9IHk7XG5cbiAgICAgICAgdGhpcy5wb3MgKz0gdGhpcy5pdGVtU2l6ZTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdseXBoVmVydGV4QnVmZmVyO1xuXG5mdW5jdGlvbiBHbHlwaFZlcnRleEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5cbkdseXBoVmVydGV4QnVmZmVyLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChCdWZmZXIsIHtcbiAgICBkZWZhdWx0TGVuZ3RoOiAyMDQ4ICogMTYsXG4gICAgaXRlbVNpemU6IDE2LFxuXG4gICAgYWRkOiBmdW5jdGlvbih4LCB5LCBveCwgb3ksIHR4LCB0eSwgbWluem9vbSwgbWF4em9vbSwgbGFiZWxtaW56b29tKSB7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcyxcbiAgICAgICAgICAgIHBvczIgPSBwb3MgLyAyO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDBdID0geDtcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDFdID0geTtcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDJdID0gTWF0aC5yb3VuZChveCAqIDY0KTsgLy8gdXNlIDEvNjQgcGl4ZWxzIGZvciBwbGFjZW1lbnRcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDNdID0gTWF0aC5yb3VuZChveSAqIDY0KTtcblxuICAgICAgICAvLyBhX2RhdGExXG4gICAgICAgIHRoaXMudWJ5dGVzW3BvcyArIDhdIC8qIHRleCAqLyA9IE1hdGguZmxvb3IodHggLyA0KTtcbiAgICAgICAgdGhpcy51Ynl0ZXNbcG9zICsgOV0gLyogdGV4ICovID0gTWF0aC5mbG9vcih0eSAvIDQpO1xuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyAxMF0gLyogbGFiZWxtaW56b29tICovID0gTWF0aC5mbG9vcigobGFiZWxtaW56b29tKSAqIDEwKTtcblxuICAgICAgICAvLyBhX2RhdGEyXG4gICAgICAgIHRoaXMudWJ5dGVzW3BvcyArIDEyXSAvKiBtaW56b29tICovID0gTWF0aC5mbG9vcigobWluem9vbSkgKiAxMCk7IC8vIDEvMTAgem9vbSBsZXZlbHM6IHoxNiA9PSAxNjAuXG4gICAgICAgIHRoaXMudWJ5dGVzW3BvcyArIDEzXSAvKiBtYXh6b29tICovID0gTWF0aC5mbG9vcihNYXRoLm1pbihtYXh6b29tLCAyNSkgKiAxMCk7IC8vIDEvMTAgem9vbSBsZXZlbHM6IHoxNiA9PSAxNjAuXG5cbiAgICAgICAgdGhpcy5wb3MgKz0gdGhpcy5pdGVtU2l6ZTtcbiAgICB9LFxuXG4gICAgYmluZDogZnVuY3Rpb24oZ2wsIHNoYWRlciwgb2Zmc2V0KSB7XG4gICAgICAgIEJ1ZmZlci5wcm90b3R5cGUuYmluZC5jYWxsKHRoaXMsIGdsKTtcblxuICAgICAgICB2YXIgc3RyaWRlID0gdGhpcy5pdGVtU2l6ZTtcblxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX3BvcywgMiwgZ2wuU0hPUlQsIGZhbHNlLCBzdHJpZGUsIG9mZnNldCArIDApO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX29mZnNldCwgMiwgZ2wuU0hPUlQsIGZhbHNlLCBzdHJpZGUsIG9mZnNldCArIDQpO1xuXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoc2hhZGVyLmFfZGF0YTEsIDQsIGdsLlVOU0lHTkVEX0JZVEUsIGZhbHNlLCBzdHJpZGUsIG9mZnNldCArIDgpO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX2RhdGEyLCAyLCBnbC5VTlNJR05FRF9CWVRFLCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyAxMik7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaFZlcnRleEJ1ZmZlcjtcblxuZnVuY3Rpb24gR2x5cGhWZXJ0ZXhCdWZmZXIoYnVmZmVyKSB7XG4gICAgQnVmZmVyLmNhbGwodGhpcywgYnVmZmVyKTtcbn1cblxuR2x5cGhWZXJ0ZXhCdWZmZXIucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEJ1ZmZlciwge1xuICAgIGRlZmF1bHRMZW5ndGg6IDIwNDggKiAxNixcbiAgICBpdGVtU2l6ZTogMTYsXG5cbiAgICBhZGQ6IGZ1bmN0aW9uKHgsIHksIG94LCBveSwgdHgsIHR5LCBtaW56b29tLCBtYXh6b29tLCBsYWJlbG1pbnpvb20pIHtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgICAgcG9zMiA9IHBvcyAvIDI7XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMF0gPSB4O1xuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMV0gPSB5O1xuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMl0gPSBNYXRoLnJvdW5kKG94ICogNjQpOyAvLyB1c2UgMS82NCBwaXhlbHMgZm9yIHBsYWNlbWVudFxuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgM10gPSBNYXRoLnJvdW5kKG95ICogNjQpO1xuXG4gICAgICAgIC8vIGFfZGF0YTFcbiAgICAgICAgdGhpcy51Ynl0ZXNbcG9zICsgOF0gLyogdGV4ICovID0gdHggLyA0O1xuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyA5XSAvKiB0ZXggKi8gPSB0eSAvIDQ7XG4gICAgICAgIHRoaXMudWJ5dGVzW3BvcyArIDEwXSAvKiBsYWJlbG1pbnpvb20gKi8gPSBNYXRoLmZsb29yKChsYWJlbG1pbnpvb20gfHwgMCkgKiAxMCk7XG5cbiAgICAgICAgLy8gYV9kYXRhMlxuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyAxMl0gLyogbWluem9vbSAqLyA9IE1hdGguZmxvb3IoKG1pbnpvb20gfHwgMCkgKiAxMCk7IC8vIDEvMTAgem9vbSBsZXZlbHM6IHoxNiA9PSAxNjAuXG4gICAgICAgIHRoaXMudWJ5dGVzW3BvcyArIDEzXSAvKiBtYXh6b29tICovID0gTWF0aC5mbG9vcihNYXRoLm1pbihtYXh6b29tIHx8IDI1LCAyNSkgKiAxMCk7IC8vIDEvMTAgem9vbSBsZXZlbHM6IHoxNiA9PSAxNjAuXG5cbiAgICAgICAgdGhpcy5wb3MgKz0gdGhpcy5pdGVtU2l6ZTtcbiAgICB9LFxuXG4gICAgYmluZDogZnVuY3Rpb24oZ2wsIHNoYWRlciwgb2Zmc2V0KSB7XG4gICAgICAgIEJ1ZmZlci5wcm90b3R5cGUuYmluZC5jYWxsKHRoaXMsIGdsKTtcblxuICAgICAgICB2YXIgc3RyaWRlID0gdGhpcy5pdGVtU2l6ZTtcblxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX3BvcywgMiwgZ2wuU0hPUlQsIGZhbHNlLCBzdHJpZGUsIG9mZnNldCArIDApO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX29mZnNldCwgMiwgZ2wuU0hPUlQsIGZhbHNlLCBzdHJpZGUsIG9mZnNldCArIDQpO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX2RhdGExLCA0LCBnbC5VTlNJR05FRF9CWVRFLCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyA4KTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9kYXRhMiwgMiwgZ2wuVU5TSUdORURfQllURSwgZmFsc2UsIHN0cmlkZSwgb2Zmc2V0ICsgMTIpO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGluZUVsZW1lbnRCdWZmZXI7XG5cbmZ1bmN0aW9uIExpbmVFbGVtZW50QnVmZmVyKGJ1ZmZlcikge1xuICAgIEJ1ZmZlci5jYWxsKHRoaXMsIGJ1ZmZlcik7XG59XG5cbkxpbmVFbGVtZW50QnVmZmVyLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChCdWZmZXIsIHtcbiAgICBpdGVtU2l6ZTogNiwgLy8gYnl0ZXMgcGVyIHRyaWFuZ2xlICgzICogdW5zaWduZWQgc2hvcnQgPT0gNiBieXRlcylcbiAgICBhcnJheVR5cGU6ICdFTEVNRU5UX0FSUkFZX0JVRkZFUicsXG5cbiAgICBhZGQ6IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgICAgdmFyIHBvczIgPSB0aGlzLnBvcyAvIDI7XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICB0aGlzLnVzaG9ydHNbcG9zMiArIDBdID0gYTtcbiAgICAgICAgdGhpcy51c2hvcnRzW3BvczIgKyAxXSA9IGI7XG4gICAgICAgIHRoaXMudXNob3J0c1twb3MyICsgMl0gPSBjO1xuXG4gICAgICAgIHRoaXMucG9zICs9IHRoaXMuaXRlbVNpemU7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5lVmVydGV4QnVmZmVyO1xuXG5mdW5jdGlvbiBMaW5lVmVydGV4QnVmZmVyKGJ1ZmZlcikge1xuICAgIEJ1ZmZlci5jYWxsKHRoaXMsIGJ1ZmZlcik7XG59XG5cbi8vIHNjYWxlIHRoZSBleHRydXNpb24gdmVjdG9yIHNvIHRoYXQgdGhlIG5vcm1hbCBsZW5ndGggaXMgdGhpcyB2YWx1ZS5cbi8vIGNvbnRhaW5zIHRoZSBcInRleHR1cmVcIiBub3JtYWxzICgtMS4uMSkuIHRoaXMgaXMgZGlzdGluY3QgZnJvbSB0aGUgZXh0cnVkZVxuLy8gbm9ybWFscyBmb3IgbGluZSBqb2lucywgYmVjYXVzZSB0aGUgeC12YWx1ZSByZW1haW5zIDAgZm9yIHRoZSB0ZXh0dXJlXG4vLyBub3JtYWwgYXJyYXksIHdoaWxlIHRoZSBleHRydWRlIG5vcm1hbCBhY3R1YWxseSBtb3ZlcyB0aGUgdmVydGV4IHRvIGNyZWF0ZVxuLy8gdGhlIGFjdXRlL2JldmVsbGVkIGxpbmUgam9pbi5cbkxpbmVWZXJ0ZXhCdWZmZXIuZXh0cnVkZVNjYWxlID0gNjM7XG5cbkxpbmVWZXJ0ZXhCdWZmZXIucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEJ1ZmZlciwge1xuICAgIGl0ZW1TaXplOiA4LCAvLyBieXRlcyBwZXIgdmVydGV4ICgyICogc2hvcnQgKyAxICogc2hvcnQgKyAyICogYnl0ZSA9IDggYnl0ZXMpXG4gICAgZGVmYXVsdExlbmd0aDogMzI3NjgsXG5cbiAgICAvLyBhZGQgYSB2ZXJ0ZXggdG8gdGhpcyBidWZmZXI7XG4gICAgLy8geCwgeSAtIHZlcnRleCBwb3NpdGlvblxuICAgIC8vIGV4LCBleSAtIGV4dHJ1ZGUgbm9ybWFsXG4gICAgLy8gdHgsIHR5IC0gdGV4dHVyZSBub3JtYWxcbiAgICBhZGQ6IGZ1bmN0aW9uKHBvaW50LCBleHRydWRlLCB0eCwgdHksIGxpbmVzb2Zhcikge1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICBwb3MyID0gcG9zIC8gMixcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5pbmRleCxcbiAgICAgICAgICAgIGV4dHJ1ZGVTY2FsZSA9IExpbmVWZXJ0ZXhCdWZmZXIuZXh0cnVkZVNjYWxlO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDBdID0gKE1hdGguZmxvb3IocG9pbnQueCkgKiAyKSB8IHR4O1xuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMV0gPSAoTWF0aC5mbG9vcihwb2ludC55KSAqIDIpIHwgdHk7XG5cbiAgICAgICAgdGhpcy5ieXRlc1twb3MgKyA0XSA9IE1hdGgucm91bmQoZXh0cnVkZVNjYWxlICogZXh0cnVkZS54KTtcbiAgICAgICAgdGhpcy5ieXRlc1twb3MgKyA1XSA9IE1hdGgucm91bmQoZXh0cnVkZVNjYWxlICogZXh0cnVkZS55KTtcbiAgICAgICAgdGhpcy5ieXRlc1twb3MgKyA2XSA9IChsaW5lc29mYXIgfHwgMCkgLyAxMjg7XG4gICAgICAgIHRoaXMuYnl0ZXNbcG9zICsgN10gPSAobGluZXNvZmFyIHx8IDApICUgMTI4O1xuXG4gICAgICAgIHRoaXMucG9zICs9IHRoaXMuaXRlbVNpemU7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE91dGxpbmVFbGVtZW50c0J1ZmZlcjtcblxuZnVuY3Rpb24gT3V0bGluZUVsZW1lbnRzQnVmZmVyKGJ1ZmZlcikge1xuICAgIEJ1ZmZlci5jYWxsKHRoaXMsIGJ1ZmZlcik7XG59XG5cbk91dGxpbmVFbGVtZW50c0J1ZmZlci5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoQnVmZmVyLCB7XG4gICAgaXRlbVNpemU6IDQsIC8vIGJ5dGVzIHBlciBsaW5lICgyICogdW5zaWduZWQgc2hvcnQgPT0gNCBieXRlcylcbiAgICBhcnJheVR5cGU6ICdFTEVNRU5UX0FSUkFZX0JVRkZFUicsXG5cbiAgICBhZGQ6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgdmFyIHBvczIgPSB0aGlzLnBvcyAvIDI7XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICB0aGlzLnVzaG9ydHNbcG9zMiArIDBdID0gYTtcbiAgICAgICAgdGhpcy51c2hvcnRzW3BvczIgKyAxXSA9IGI7XG5cbiAgICAgICAgdGhpcy5wb3MgKz0gdGhpcy5pdGVtU2l6ZTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyaWFuZ2xlRWxlbWVudHNCdWZmZXI7XG5cbmZ1bmN0aW9uIFRyaWFuZ2xlRWxlbWVudHNCdWZmZXIoYnVmZmVyKSB7XG4gICAgQnVmZmVyLmNhbGwodGhpcywgYnVmZmVyKTtcbn1cblxuVHJpYW5nbGVFbGVtZW50c0J1ZmZlci5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoQnVmZmVyLCB7XG4gICAgaXRlbVNpemU6IDYsIC8vIGJ5dGVzIHBlciB0cmlhbmdsZSAoMyAqIHVuc2lnbmVkIHNob3J0ID09IDYgYnl0ZXMpXG4gICAgYXJyYXlUeXBlOiAnRUxFTUVOVF9BUlJBWV9CVUZGRVInLFxuXG4gICAgYWRkOiBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICAgIHZhciBwb3MyID0gdGhpcy5wb3MgLyAyO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy51c2hvcnRzW3BvczIgKyAwXSA9IGE7XG4gICAgICAgIHRoaXMudXNob3J0c1twb3MyICsgMV0gPSBiO1xuICAgICAgICB0aGlzLnVzaG9ydHNbcG9zMiArIDJdID0gYztcblxuICAgICAgICB0aGlzLnBvcyArPSB0aGlzLml0ZW1TaXplO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUJ1Y2tldDtcblxudmFyIExpbmVCdWNrZXQgPSByZXF1aXJlKCcuL2xpbmVfYnVja2V0Jyk7XG52YXIgRmlsbEJ1Y2tldCA9IHJlcXVpcmUoJy4vZmlsbF9idWNrZXQnKTtcbnZhciBTeW1ib2xCdWNrZXQgPSByZXF1aXJlKCcuL3N5bWJvbF9idWNrZXQnKTtcbnZhciBMYXlvdXRQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vc3R5bGUvbGF5b3V0X3Byb3BlcnRpZXMnKTtcbnZhciBmZWF0dXJlRmlsdGVyID0gcmVxdWlyZSgnZmVhdHVyZS1maWx0ZXInKTtcbnZhciBTdHlsZURlY2xhcmF0aW9uU2V0ID0gcmVxdWlyZSgnLi4vc3R5bGUvc3R5bGVfZGVjbGFyYXRpb25fc2V0Jyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1Y2tldChsYXllciwgYnVmZmVycywgY29sbGlzaW9uLCB6LCBvdmVyc2NhbGluZywgY29sbGlzaW9uRGVidWcpIHtcbiAgICB2YXIgdmFsdWVzID0gbmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoJ2xheW91dCcsIGxheWVyLnR5cGUsIGxheWVyLmxheW91dCwge30pLnZhbHVlcygpLFxuICAgICAgICBmYWtlWm9vbUhpc3RvcnkgPSB7IGxhc3RJbnRlZ2VyWm9vbTogSW5maW5pdHksIGxhc3RJbnRlZ2VyWm9vbVRpbWU6IDAsIGxhc3Rab29tOiAwIH0sXG4gICAgICAgIGxheW91dCA9IHt9O1xuXG4gICAgZm9yICh2YXIgayBpbiB2YWx1ZXMpIHtcbiAgICAgICAgbGF5b3V0W2tdID0gdmFsdWVzW2tdLmNhbGN1bGF0ZSh6LCBmYWtlWm9vbUhpc3RvcnkpO1xuICAgIH1cblxuICAgIHZhciBCdWNrZXRDbGFzcyA9XG4gICAgICAgIGxheWVyLnR5cGUgPT09ICdsaW5lJyA/IExpbmVCdWNrZXQgOlxuICAgICAgICBsYXllci50eXBlID09PSAnZmlsbCcgPyBGaWxsQnVja2V0IDpcbiAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ3N5bWJvbCcgPyBTeW1ib2xCdWNrZXQgOiBudWxsO1xuXG4gICAgdmFyIGJ1Y2tldCA9IG5ldyBCdWNrZXRDbGFzcyhidWZmZXJzLCBuZXcgTGF5b3V0UHJvcGVydGllc1tsYXllci50eXBlXShsYXlvdXQpLCBjb2xsaXNpb24sIG92ZXJzY2FsaW5nLCBjb2xsaXNpb25EZWJ1Zyk7XG5cbiAgICBidWNrZXQuaWQgPSBsYXllci5pZDtcbiAgICBidWNrZXQudHlwZSA9IGxheWVyLnR5cGU7XG4gICAgYnVja2V0Wydzb3VyY2UtbGF5ZXInXSA9IGxheWVyWydzb3VyY2UtbGF5ZXInXTtcbiAgICBidWNrZXQuaW50ZXJhY3RpdmUgPSBsYXllci5pbnRlcmFjdGl2ZTtcbiAgICBidWNrZXQubWluWm9vbSA9IGxheWVyLm1pbnpvb207XG4gICAgYnVja2V0Lm1heFpvb20gPSBsYXllci5tYXh6b29tO1xuICAgIGJ1Y2tldC5maWx0ZXIgPSBmZWF0dXJlRmlsdGVyKGxheWVyLmZpbHRlcik7XG4gICAgYnVja2V0LmZlYXR1cmVzID0gW107XG5cbiAgICByZXR1cm4gYnVja2V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnRHcm91cHM7XG5cbmZ1bmN0aW9uIEVsZW1lbnRHcm91cHModmVydGV4QnVmZmVyLCBlbGVtZW50QnVmZmVyLCBzZWNvbmRFbGVtZW50QnVmZmVyKSB7XG5cbiAgICB0aGlzLnZlcnRleEJ1ZmZlciA9IHZlcnRleEJ1ZmZlcjtcbiAgICB0aGlzLmVsZW1lbnRCdWZmZXIgPSBlbGVtZW50QnVmZmVyO1xuICAgIHRoaXMuc2Vjb25kRWxlbWVudEJ1ZmZlciA9IHNlY29uZEVsZW1lbnRCdWZmZXI7XG4gICAgdGhpcy5ncm91cHMgPSBbXTtcbn1cblxuRWxlbWVudEdyb3Vwcy5wcm90b3R5cGUubWFrZVJvb21Gb3IgPSBmdW5jdGlvbihudW1WZXJ0aWNlcykge1xuICAgIGlmICghdGhpcy5jdXJyZW50IHx8IHRoaXMuY3VycmVudC52ZXJ0ZXhMZW5ndGggKyBudW1WZXJ0aWNlcyA+IDY1NTM1KSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBFbGVtZW50R3JvdXAodGhpcy52ZXJ0ZXhCdWZmZXIuaW5kZXgsXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50QnVmZmVyICYmIHRoaXMuZWxlbWVudEJ1ZmZlci5pbmRleCxcbiAgICAgICAgICAgICAgICB0aGlzLnNlY29uZEVsZW1lbnRCdWZmZXIgJiYgdGhpcy5zZWNvbmRFbGVtZW50QnVmZmVyLmluZGV4KTtcbiAgICAgICAgdGhpcy5ncm91cHMucHVzaCh0aGlzLmN1cnJlbnQpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIEVsZW1lbnRHcm91cCh2ZXJ0ZXhTdGFydEluZGV4LCBlbGVtZW50U3RhcnRJbmRleCwgc2Vjb25kRWxlbWVudFN0YXJ0SW5kZXgpIHtcbiAgICAvLyB0aGUgb2Zmc2V0IGludG8gdGhlIHZlcnRleCBidWZmZXIgb2YgdGhlIGZpcnN0IHZlcnRleCBpbiB0aGlzIGdyb3VwXG4gICAgdGhpcy52ZXJ0ZXhTdGFydEluZGV4ID0gdmVydGV4U3RhcnRJbmRleDtcbiAgICB0aGlzLmVsZW1lbnRTdGFydEluZGV4ID0gZWxlbWVudFN0YXJ0SW5kZXg7XG4gICAgdGhpcy5zZWNvbmRFbGVtZW50U3RhcnRJbmRleCA9IHNlY29uZEVsZW1lbnRTdGFydEluZGV4O1xuICAgIHRoaXMuZWxlbWVudExlbmd0aCA9IDA7XG4gICAgdGhpcy52ZXJ0ZXhMZW5ndGggPSAwO1xuICAgIHRoaXMuc2Vjb25kRWxlbWVudExlbmd0aCA9IDA7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByYnVzaCA9IHJlcXVpcmUoJ3JidXNoJyk7XG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xudmFyIHZ0ID0gcmVxdWlyZSgndmVjdG9yLXRpbGUnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmVhdHVyZVRyZWU7XG5cbmZ1bmN0aW9uIEZlYXR1cmVUcmVlKGNvb3JkLCBvdmVyc2NhbGluZykge1xuICAgIHRoaXMueCA9IGNvb3JkLng7XG4gICAgdGhpcy55ID0gY29vcmQueTtcbiAgICB0aGlzLnogPSBjb29yZC56IC0gTWF0aC5sb2cob3ZlcnNjYWxpbmcpIC8gTWF0aC5MTjI7XG4gICAgdGhpcy5ydHJlZSA9IHJidXNoKDkpO1xuICAgIHRoaXMudG9CZUluc2VydGVkID0gW107XG59XG5cbkZlYXR1cmVUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihiYm94LCBsYXllcnMsIGZlYXR1cmUpIHtcbiAgICBiYm94LmxheWVycyA9IGxheWVycztcbiAgICBiYm94LmZlYXR1cmUgPSBmZWF0dXJlO1xuICAgIHRoaXMudG9CZUluc2VydGVkLnB1c2goYmJveCk7XG59O1xuXG4vLyBidWxrIGluc2VydCBpbnRvIHRyZWVcbkZlYXR1cmVUcmVlLnByb3RvdHlwZS5fbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucnRyZWUubG9hZCh0aGlzLnRvQmVJbnNlcnRlZCk7XG4gICAgdGhpcy50b0JlSW5zZXJ0ZWQgPSBbXTtcbn07XG5cbi8vIEZpbmRzIGZlYXR1cmVzIGluIHRoaXMgdGlsZSBhdCBhIHBhcnRpY3VsYXIgcG9zaXRpb24uXG5GZWF0dXJlVHJlZS5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbihhcmdzLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnRvQmVJbnNlcnRlZC5sZW5ndGgpIHRoaXMuX2xvYWQoKTtcblxuICAgIHZhciBwYXJhbXMgPSBhcmdzLnBhcmFtcyB8fCB7fSxcbiAgICAgICAgcmFkaXVzID0gKHBhcmFtcy5yYWRpdXMgfHwgMCkgKiA0MDk2IC8gYXJncy5zY2FsZSxcbiAgICAgICAgeCA9IGFyZ3MueCxcbiAgICAgICAgeSA9IGFyZ3MueSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB2YXIgbWF0Y2hpbmcgPSB0aGlzLnJ0cmVlLnNlYXJjaChbIHggLSByYWRpdXMsIHkgLSByYWRpdXMsIHggKyByYWRpdXMsIHkgKyByYWRpdXMgXSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IG1hdGNoaW5nW2ldLmZlYXR1cmUsXG4gICAgICAgICAgICBsYXllcnMgPSBtYXRjaGluZ1tpXS5sYXllcnMsXG4gICAgICAgICAgICB0eXBlID0gdnQuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXTtcblxuICAgICAgICBpZiAocGFyYW1zLiR0eXBlICYmIHR5cGUgIT09IHBhcmFtcy4kdHlwZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWdlb21ldHJ5Q29udGFpbnNQb2ludChmZWF0dXJlLmxvYWRHZW9tZXRyeSgpLCB0eXBlLCBuZXcgUG9pbnQoeCwgeSksIHJhZGl1cykpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICB2YXIgZ2VvSlNPTiA9IGZlYXR1cmUudG9HZW9KU09OKHRoaXMueCwgdGhpcy55LCB0aGlzLnopO1xuICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxheWVycy5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgdmFyIGxheWVyID0gbGF5ZXJzW2xdO1xuXG4gICAgICAgICAgICBpZiAocGFyYW1zLmxheWVyICYmIGxheWVyICE9PSBwYXJhbXMubGF5ZXIuaWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHV0aWwuZXh0ZW5kKHtsYXllcjogbGF5ZXJ9LCBnZW9KU09OKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xufTtcblxuZnVuY3Rpb24gZ2VvbWV0cnlDb250YWluc1BvaW50KHJpbmdzLCB0eXBlLCBwLCByYWRpdXMpIHtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ1BvaW50JyA/IHBvaW50Q29udGFpbnNQb2ludChyaW5ncywgcCwgcmFkaXVzKSA6XG4gICAgICAgICAgIHR5cGUgPT09ICdMaW5lU3RyaW5nJyA/IGxpbmVDb250YWluc1BvaW50KHJpbmdzLCBwLCByYWRpdXMpIDpcbiAgICAgICAgICAgdHlwZSA9PT0gJ1BvbHlnb24nID8gcG9seUNvbnRhaW5zUG9pbnQocmluZ3MsIHApIHx8IGxpbmVDb250YWluc1BvaW50KHJpbmdzLCBwLCByYWRpdXMpIDogZmFsc2U7XG59XG5cbi8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNTAxNzI1LzMzMTM3OS5cbmZ1bmN0aW9uIGRpc3RUb1NlZ21lbnRTcXVhcmVkKHAsIHYsIHcpIHtcbiAgICB2YXIgbDIgPSB2LmRpc3RTcXIodyk7XG4gICAgaWYgKGwyID09PSAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIHZhciB0ID0gKChwLnggLSB2LngpICogKHcueCAtIHYueCkgKyAocC55IC0gdi55KSAqICh3LnkgLSB2LnkpKSAvIGwyO1xuICAgIGlmICh0IDwgMCkgcmV0dXJuIHAuZGlzdFNxcih2KTtcbiAgICBpZiAodCA+IDEpIHJldHVybiBwLmRpc3RTcXIodyk7XG4gICAgcmV0dXJuIHAuZGlzdFNxcih3LnN1Yih2KS5fbXVsdCh0KS5fYWRkKHYpKTtcbn1cblxuZnVuY3Rpb24gbGluZUNvbnRhaW5zUG9pbnQocmluZ3MsIHAsIHJhZGl1cykge1xuICAgIHZhciByID0gcmFkaXVzICogcmFkaXVzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmluZyA9IHJpbmdzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIC8vIEZpbmQgbGluZSBzZWdtZW50cyB0aGF0IGhhdmUgYSBkaXN0YW5jZSA8PSByYWRpdXNeMiB0byBwXG4gICAgICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHRyZWF0IHRoZSBsaW5lIGFzIFwiY29udGFpbmluZyBwb2ludCBwXCIuXG4gICAgICAgICAgICB2YXIgdiA9IHJpbmdbaiAtIDFdLCB3ID0gcmluZ1tqXTtcbiAgICAgICAgICAgIGlmIChkaXN0VG9TZWdtZW50U3F1YXJlZChwLCB2LCB3KSA8IHIpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gcG9pbnQgaW4gcG9seWdvbiByYXkgY2FzdGluZyBhbGdvcml0aG1cbmZ1bmN0aW9uIHBvbHlDb250YWluc1BvaW50KHJpbmdzLCBwKSB7XG4gICAgdmFyIGMgPSBmYWxzZSxcbiAgICAgICAgcmluZywgcDEsIHAyO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCByaW5ncy5sZW5ndGg7IGsrKykge1xuICAgICAgICByaW5nID0gcmluZ3Nba107XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gcmluZy5sZW5ndGggLSAxOyBpIDwgcmluZy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgICAgIGlmICgoKHAxLnkgPiBwLnkpICE9PSAocDIueSA+IHAueSkpICYmIChwLnggPCAocDIueCAtIHAxLngpICogKHAueSAtIHAxLnkpIC8gKHAyLnkgLSBwMS55KSArIHAxLngpKSB7XG4gICAgICAgICAgICAgICAgYyA9ICFjO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiBwb2ludENvbnRhaW5zUG9pbnQocmluZ3MsIHAsIHJhZGl1cykge1xuICAgIHZhciByID0gcmFkaXVzICogcmFkaXVzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmluZyA9IHJpbmdzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChyaW5nW2pdLmRpc3RTcXIocCkgPD0gcikgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRWxlbWVudEdyb3VwcyA9IHJlcXVpcmUoJy4vZWxlbWVudF9ncm91cHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGaWxsQnVja2V0O1xuXG5mdW5jdGlvbiBGaWxsQnVja2V0KGJ1ZmZlcnMpIHtcbiAgICB0aGlzLmJ1ZmZlcnMgPSBidWZmZXJzO1xuICAgIHRoaXMuZWxlbWVudEdyb3VwcyA9IG5ldyBFbGVtZW50R3JvdXBzKGJ1ZmZlcnMuZmlsbFZlcnRleCwgYnVmZmVycy5maWxsRWxlbWVudCwgYnVmZmVycy5vdXRsaW5lRWxlbWVudCk7XG59XG5cbkZpbGxCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gdGhpcy5mZWF0dXJlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV07XG4gICAgICAgIHRoaXMuYWRkRmVhdHVyZShmZWF0dXJlLmxvYWRHZW9tZXRyeSgpKTtcbiAgICB9XG59O1xuXG5GaWxsQnVja2V0LnByb3RvdHlwZS5hZGRGZWF0dXJlID0gZnVuY3Rpb24obGluZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkRmlsbChsaW5lc1tpXSk7XG4gICAgfVxufTtcblxuRmlsbEJ1Y2tldC5wcm90b3R5cGUuYWRkRmlsbCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7XG4gICAgaWYgKHZlcnRpY2VzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgLy9jb25zb2xlLndhcm4oJ2EgZmlsbCBtdXN0IGhhdmUgYXQgbGVhc3QgdGhyZWUgdmVydGljZXMnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzIHdlJ3JlIGdvaW5nIHRvIHByb2R1Y2Ugc28gdGhhdCB3ZVxuICAgIC8vIGNhbiByZXNpemUgdGhlIGJ1ZmZlciBiZWZvcmVoYW5kLCBvciBkZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBsaW5lXG4gICAgLy8gd29uJ3QgZml0IGludG8gdGhlIGJ1ZmZlciBhbnltb3JlLlxuICAgIC8vIEluIG9yZGVyIHRvIGJlIGFibGUgdG8gdXNlIHRoZSB2ZXJ0ZXggYnVmZmVyIGZvciBkcmF3aW5nIHRoZSBhbnRpYWxpYXNlZFxuICAgIC8vIG91dGxpbmVzLCB3ZSBzZXBhcmF0ZSBhbGwgcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgZGVnZW5lcmF0ZSAob3V0LW9mLVxuICAgIC8vIHZpZXdwbGFuZSkgdmVydGV4LlxuXG4gICAgdmFyIGxlbiA9IHZlcnRpY2VzLmxlbmd0aDtcblxuICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBnZW9tZXRyeSBidWZmZXIgY2FuIGhvbGQgYWxsIHRoZSByZXF1aXJlZCB2ZXJ0aWNlcy5cbiAgICB0aGlzLmVsZW1lbnRHcm91cHMubWFrZVJvb21Gb3IobGVuICsgMSk7XG4gICAgdmFyIGVsZW1lbnRHcm91cCA9IHRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50O1xuXG4gICAgdmFyIGZpbGxWZXJ0ZXggPSB0aGlzLmJ1ZmZlcnMuZmlsbFZlcnRleDtcbiAgICB2YXIgZmlsbEVsZW1lbnQgPSB0aGlzLmJ1ZmZlcnMuZmlsbEVsZW1lbnQ7XG4gICAgdmFyIG91dGxpbmVFbGVtZW50ID0gdGhpcy5idWZmZXJzLm91dGxpbmVFbGVtZW50O1xuXG4gICAgLy8gV2UncmUgZ2VuZXJhdGluZyB0cmlhbmdsZSBmYW5zLCBzbyB3ZSBhbHdheXMgc3RhcnQgd2l0aCB0aGUgZmlyc3QgY29vcmRpbmF0ZSBpbiB0aGlzIHBvbHlnb24uXG4gICAgdmFyIGZpcnN0SW5kZXggPSBmaWxsVmVydGV4LmluZGV4IC0gZWxlbWVudEdyb3VwLnZlcnRleFN0YXJ0SW5kZXgsXG4gICAgICAgIHByZXZJbmRleCwgY3VycmVudEluZGV4LCBjdXJyZW50VmVydGV4O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjdXJyZW50SW5kZXggPSBmaWxsVmVydGV4LmluZGV4IC0gZWxlbWVudEdyb3VwLnZlcnRleFN0YXJ0SW5kZXg7XG4gICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICBmaWxsVmVydGV4LmFkZChjdXJyZW50VmVydGV4LngsIGN1cnJlbnRWZXJ0ZXgueSk7XG4gICAgICAgIGVsZW1lbnRHcm91cC52ZXJ0ZXhMZW5ndGgrKztcblxuICAgICAgICAvLyBPbmx5IGFkZCB0cmlhbmdsZXMgdGhhdCBoYXZlIGRpc3RpbmN0IHZlcnRpY2VzLlxuICAgICAgICBpZiAoaSA+PSAyICYmIChjdXJyZW50VmVydGV4LnggIT09IHZlcnRpY2VzWzBdLnggfHwgY3VycmVudFZlcnRleC55ICE9PSB2ZXJ0aWNlc1swXS55KSkge1xuICAgICAgICAgICAgZmlsbEVsZW1lbnQuYWRkKGZpcnN0SW5kZXgsIHByZXZJbmRleCwgY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIGVsZW1lbnRHcm91cC5lbGVtZW50TGVuZ3RoKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaSA+PSAxKSB7XG4gICAgICAgICAgICBvdXRsaW5lRWxlbWVudC5hZGQocHJldkluZGV4LCBjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgZWxlbWVudEdyb3VwLnNlY29uZEVsZW1lbnRMZW5ndGgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRWxlbWVudEdyb3VwcyA9IHJlcXVpcmUoJy4vZWxlbWVudF9ncm91cHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5lQnVja2V0O1xuXG5mdW5jdGlvbiBMaW5lQnVja2V0KGJ1ZmZlcnMsIGxheW91dFByb3BlcnRpZXMpIHtcbiAgICB0aGlzLmJ1ZmZlcnMgPSBidWZmZXJzO1xuICAgIHRoaXMuZWxlbWVudEdyb3VwcyA9IG5ldyBFbGVtZW50R3JvdXBzKGJ1ZmZlcnMubGluZVZlcnRleCwgYnVmZmVycy5saW5lRWxlbWVudCk7XG4gICAgdGhpcy5sYXlvdXRQcm9wZXJ0aWVzID0gbGF5b3V0UHJvcGVydGllcztcbn1cblxuTGluZUJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSB0aGlzLmZlYXR1cmVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTtcbiAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUubG9hZEdlb21ldHJ5KCkpO1xuICAgIH1cbn07XG5cbkxpbmVCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmUgPSBmdW5jdGlvbihsaW5lcykge1xuICAgIHZhciBsYXlvdXRQcm9wZXJ0aWVzID0gdGhpcy5sYXlvdXRQcm9wZXJ0aWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5hZGRMaW5lKGxpbmVzW2ldLFxuICAgICAgICAgICAgbGF5b3V0UHJvcGVydGllc1snbGluZS1qb2luJ10sXG4gICAgICAgICAgICBsYXlvdXRQcm9wZXJ0aWVzWydsaW5lLWNhcCddLFxuICAgICAgICAgICAgbGF5b3V0UHJvcGVydGllc1snbGluZS1taXRlci1saW1pdCddLFxuICAgICAgICAgICAgbGF5b3V0UHJvcGVydGllc1snbGluZS1yb3VuZC1saW1pdCddKTtcbiAgICB9XG59O1xuXG5MaW5lQnVja2V0LnByb3RvdHlwZS5hZGRMaW5lID0gZnVuY3Rpb24odmVydGljZXMsIGpvaW4sIGNhcCwgbWl0ZXJMaW1pdCwgcm91bmRMaW1pdCkge1xuXG4gICAgdmFyIGxlbiA9IHZlcnRpY2VzLmxlbmd0aDtcbiAgICAvLyBJZiB0aGUgbGluZSBoYXMgZHVwbGljYXRlIHZlcnRpY2VzIGF0IHRoZSBlbmQsIGFkanVzdCBsZW5ndGggdG8gcmVtb3ZlIHRoZW0uXG4gICAgd2hpbGUgKGxlbiA+IDIgJiYgdmVydGljZXNbbGVuIC0gMV0uZXF1YWxzKHZlcnRpY2VzW2xlbiAtIDJdKSkge1xuICAgICAgICBsZW4tLTtcbiAgICB9XG5cbiAgICBpZiAodmVydGljZXMubGVuZ3RoIDwgMikge1xuICAgICAgICAvL2NvbnNvbGUud2FybignYSBsaW5lIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gdmVydGljZXMnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChqb2luID09PSAnYmV2ZWwnKSBtaXRlckxpbWl0ID0gMS4wNTtcblxuICAgIHZhciBmaXJzdFZlcnRleCA9IHZlcnRpY2VzWzBdLFxuICAgICAgICBsYXN0VmVydGV4ID0gdmVydGljZXNbbGVuIC0gMV0sXG4gICAgICAgIGNsb3NlZCA9IGZpcnN0VmVydGV4LmVxdWFscyhsYXN0VmVydGV4KTtcblxuICAgIC8vIHdlIGNvdWxkIGJlIG1vcmUgcHJlY2lzZSwgYnV0IGl0IHdvdWxkIG9ubHkgc2F2ZSBhIG5lZ2xpZ2libGUgYW1vdW50IG9mIHNwYWNlXG4gICAgdGhpcy5lbGVtZW50R3JvdXBzLm1ha2VSb29tRm9yKGxlbiAqIDQpO1xuXG4gICAgaWYgKGxlbiA9PT0gMiAmJiBjbG9zZWQpIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCdhIGxpbmUgbWF5IG5vdCBoYXZlIGNvaW5jaWRlbnQgcG9pbnRzJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYmVnaW5DYXAgPSBjYXAsXG4gICAgICAgIGVuZENhcCA9IGNsb3NlZCA/ICdidXR0JyA6IGNhcCxcbiAgICAgICAgZmxpcCA9IDEsXG4gICAgICAgIGRpc3RhbmNlID0gMCxcbiAgICAgICAgc3RhcnRPZkxpbmUgPSB0cnVlLFxuICAgICAgICBjdXJyZW50VmVydGV4LCBwcmV2VmVydGV4LCBuZXh0VmVydGV4LCBwcmV2Tm9ybWFsLCBuZXh0Tm9ybWFsLCBvZmZzZXRBLCBvZmZzZXRCO1xuXG4gICAgLy8gdGhlIGxhc3QgdGhyZWUgdmVydGljZXMgYWRkZWRcbiAgICB0aGlzLmUxID0gdGhpcy5lMiA9IHRoaXMuZTMgPSAtMTtcblxuICAgIGlmIChjbG9zZWQpIHtcbiAgICAgICAgY3VycmVudFZlcnRleCA9IHZlcnRpY2VzW2xlbiAtIDJdO1xuICAgICAgICBuZXh0Tm9ybWFsID0gZmlyc3RWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXgpLl91bml0KCkuX3BlcnAoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cbiAgICAgICAgbmV4dFZlcnRleCA9IGNsb3NlZCAmJiBpID09PSBsZW4gLSAxID9cbiAgICAgICAgICAgIHZlcnRpY2VzWzFdIDogLy8gaWYgdGhlIGxpbmUgaXMgY2xvc2VkLCB3ZSB0cmVhdCB0aGUgbGFzdCB2ZXJ0ZXggbGlrZSB0aGUgZmlyc3RcbiAgICAgICAgICAgIHZlcnRpY2VzW2kgKyAxXTsgLy8ganVzdCB0aGUgbmV4dCB2ZXJ0ZXhcblxuICAgICAgICAvLyBpZiB0d28gY29uc2VjdXRpdmUgdmVydGljZXMgZXhpc3QsIHNraXAgdGhlIGN1cnJlbnQgb25lXG4gICAgICAgIGlmIChuZXh0VmVydGV4ICYmIHZlcnRpY2VzW2ldLmVxdWFscyhuZXh0VmVydGV4KSkgY29udGludWU7XG5cbiAgICAgICAgaWYgKG5leHROb3JtYWwpIHByZXZOb3JtYWwgPSBuZXh0Tm9ybWFsO1xuICAgICAgICBpZiAoY3VycmVudFZlcnRleCkgcHJldlZlcnRleCA9IGN1cnJlbnRWZXJ0ZXg7XG5cbiAgICAgICAgY3VycmVudFZlcnRleCA9IHZlcnRpY2VzW2ldO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBob3cgZmFyIGFsb25nIHRoZSBsaW5lIHRoZSBjdXJyZW50VmVydGV4IGlzXG4gICAgICAgIGlmIChwcmV2VmVydGV4KSBkaXN0YW5jZSArPSBjdXJyZW50VmVydGV4LmRpc3QocHJldlZlcnRleCk7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBub3JtYWwgdG93YXJkcyB0aGUgbmV4dCB2ZXJ0ZXggaW4gdGhpcyBsaW5lLiBJbiBjYXNlXG4gICAgICAgIC8vIHRoZXJlIGlzIG5vIG5leHQgdmVydGV4LCBwcmV0ZW5kIHRoYXQgdGhlIGxpbmUgaXMgY29udGludWluZyBzdHJhaWdodCxcbiAgICAgICAgLy8gbWVhbmluZyB0aGF0IHdlIGFyZSBqdXN0IHVzaW5nIHRoZSBwcmV2aW91cyBub3JtYWwuXG4gICAgICAgIG5leHROb3JtYWwgPSBuZXh0VmVydGV4ID8gbmV4dFZlcnRleC5zdWIoY3VycmVudFZlcnRleCkuX3VuaXQoKS5fcGVycCgpIDogcHJldk5vcm1hbDtcblxuICAgICAgICAvLyBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgcHJldmlvdXMgbm9ybWFsLCB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgYVxuICAgICAgICAvLyBub24tY2xvc2VkIGxpbmUsIHNvIHdlJ3JlIGRvaW5nIGEgc3RyYWlnaHQgXCJqb2luXCIuXG4gICAgICAgIHByZXZOb3JtYWwgPSBwcmV2Tm9ybWFsIHx8IG5leHROb3JtYWw7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBub3JtYWwgb2YgdGhlIGpvaW4gZXh0cnVzaW9uLiBJdCBpcyB0aGUgYW5nbGUgYmlzZWN0b3JcbiAgICAgICAgLy8gb2YgdGhlIHNlZ21lbnRzIGJldHdlZW4gdGhlIHByZXZpb3VzIGxpbmUgYW5kIHRoZSBuZXh0IGxpbmUuXG4gICAgICAgIHZhciBqb2luTm9ybWFsID0gcHJldk5vcm1hbC5hZGQobmV4dE5vcm1hbCkuX3VuaXQoKTtcblxuICAgICAgICAvKiAgam9pbk5vcm1hbCAgICAgcHJldk5vcm1hbFxuICAgICAgICAgKiAgICAgICAgICAgICDihpYgICAgICDihpFcbiAgICAgICAgICogICAgICAgICAgICAgICAgLl9fX19fX19fLiBwcmV2VmVydGV4XG4gICAgICAgICAqICAgICAgICAgICAgICAgIHxcbiAgICAgICAgICogbmV4dE5vcm1hbCAg4oaQICB8ICBjdXJyZW50VmVydGV4XG4gICAgICAgICAqICAgICAgICAgICAgICAgIHxcbiAgICAgICAgICogICAgIG5leHRWZXJ0ZXggIVxuICAgICAgICAgKlxuICAgICAgICAgKi9cblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbWl0ZXIgKHRoZSByYXRpbyBvZiB0aGUgbWl0ZXIgdG8gdGhlIHdpZHRoKS5cbiAgICAgICAgLy8gRmluZCB0aGUgY29zaW5lIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBuZXh0IGFuZCBqb2luIG5vcm1hbHNcbiAgICAgICAgLy8gdXNpbmcgZG90IHByb2R1Y3QuIFRoZSBpbnZlcnNlIG9mIHRoYXQgaXMgdGhlIG1pdGVyIGxlbmd0aC5cbiAgICAgICAgdmFyIGNvc0hhbGZBbmdsZSA9IGpvaW5Ob3JtYWwueCAqIG5leHROb3JtYWwueCArIGpvaW5Ob3JtYWwueSAqIG5leHROb3JtYWwueTtcbiAgICAgICAgdmFyIG1pdGVyTGVuZ3RoID0gMSAvIGNvc0hhbGZBbmdsZTtcblxuICAgICAgICAvLyBUaGUgam9pbiBpZiBhIG1pZGRsZSB2ZXJ0ZXgsIG90aGVyd2lzZSB0aGUgY2FwLlxuICAgICAgICB2YXIgbWlkZGxlVmVydGV4ID0gcHJldlZlcnRleCAmJiBuZXh0VmVydGV4O1xuICAgICAgICB2YXIgY3VycmVudEpvaW4gPSBtaWRkbGVWZXJ0ZXggPyBqb2luIDogbmV4dFZlcnRleCA/IGJlZ2luQ2FwIDogZW5kQ2FwO1xuXG4gICAgICAgIGlmIChtaWRkbGVWZXJ0ZXggJiYgY3VycmVudEpvaW4gPT09ICdyb3VuZCcgJiYgbWl0ZXJMZW5ndGggPCByb3VuZExpbWl0KSB7XG4gICAgICAgICAgICBjdXJyZW50Sm9pbiA9ICdtaXRlcic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdtaXRlcicgJiYgbWl0ZXJMZW5ndGggPiBtaXRlckxpbWl0KSB7XG4gICAgICAgICAgICBjdXJyZW50Sm9pbiA9ICdiZXZlbCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdiZXZlbCcpIHtcbiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGV4dHJ1ZGUgbGVuZ3RoIGlzIDEyOCAvIDYzID0gMiB0aW1lcyB0aGUgd2lkdGggb2YgdGhlIGxpbmVcbiAgICAgICAgICAgIC8vIHNvIGlmIG1pdGVyTGVuZ3RoID49IDIgd2UgbmVlZCB0byBkcmF3IGEgZGlmZmVyZW50IHR5cGUgb2YgYmV2ZWwgd2hlcmUuXG4gICAgICAgICAgICBpZiAobWl0ZXJMZW5ndGggPiAyKSBjdXJyZW50Sm9pbiA9ICdmbGlwYmV2ZWwnO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbWl0ZXJMZW5ndGggaXMgcmVhbGx5IHNtYWxsIGFuZCB0aGUgbGluZSBiZXZlbCB3b3VsZG4ndCBiZSB2aXNpYmxlLFxuICAgICAgICAgICAgLy8ganVzdCBkcmF3IGEgbWl0ZXIgam9pbiB0byBzYXZlIGEgdHJpYW5nbGUuXG4gICAgICAgICAgICBpZiAobWl0ZXJMZW5ndGggPCBtaXRlckxpbWl0KSBjdXJyZW50Sm9pbiA9ICdtaXRlcic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdtaXRlcicpIHtcbiAgICAgICAgICAgIGpvaW5Ob3JtYWwuX211bHQobWl0ZXJMZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBqb2luTm9ybWFsLCAwLCAwLCBmYWxzZSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2ZsaXBiZXZlbCcpIHtcbiAgICAgICAgICAgIC8vIG1pdGVyIGlzIHRvbyBiaWcsIGZsaXAgdGhlIGRpcmVjdGlvbiB0byBtYWtlIGEgYmV2ZWxlZCBqb2luXG5cbiAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA+IDEwMCkge1xuICAgICAgICAgICAgICAgIC8vIEFsbW9zdCBwYXJhbGxlbCBsaW5lc1xuICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwgPSBuZXh0Tm9ybWFsLmNsb25lKCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IHByZXZOb3JtYWwueCAqIG5leHROb3JtYWwueSAtIHByZXZOb3JtYWwueSAqIG5leHROb3JtYWwueCA+IDAgPyAtMSA6IDE7XG4gICAgICAgICAgICAgICAgdmFyIGJldmVsTGVuZ3RoID0gbWl0ZXJMZW5ndGggKiBwcmV2Tm9ybWFsLmFkZChuZXh0Tm9ybWFsKS5tYWcoKSAvIHByZXZOb3JtYWwuc3ViKG5leHROb3JtYWwpLm1hZygpO1xuICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwuX3BlcnAoKS5fbXVsdChiZXZlbExlbmd0aCAqIGRpcmVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIGpvaW5Ob3JtYWwsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgIGZsaXAgPSAtZmxpcDtcblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnYmV2ZWwnKSB7XG4gICAgICAgICAgICB2YXIgZGlyID0gcHJldk5vcm1hbC54ICogbmV4dE5vcm1hbC55IC0gcHJldk5vcm1hbC55ICogbmV4dE5vcm1hbC54O1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IC1NYXRoLnNxcnQobWl0ZXJMZW5ndGggKiBtaXRlckxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgaWYgKGZsaXAgKiBkaXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0QiA9IDA7XG4gICAgICAgICAgICAgICAgb2Zmc2V0QSA9IG9mZnNldDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0QSA9IDA7XG4gICAgICAgICAgICAgICAgb2Zmc2V0QiA9IG9mZnNldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgc2VnbWVudCB3aXRoIGEgYmV2ZWxcbiAgICAgICAgICAgIGlmICghc3RhcnRPZkxpbmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIHByZXZOb3JtYWwsIG9mZnNldEEsIG9mZnNldEIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50XG4gICAgICAgICAgICBpZiAobmV4dFZlcnRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgbmV4dE5vcm1hbCwgLW9mZnNldEEsIC1vZmZzZXRCLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2J1dHQnKSB7XG4gICAgICAgICAgICBpZiAoIXN0YXJ0T2ZMaW5lKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgc2VnbWVudCB3aXRoIGEgYnV0dFxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgcHJldk5vcm1hbCwgMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTdGFydCBuZXh0IHNlZ21lbnQgd2l0aCBhIGJ1dHRcbiAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBuZXh0Tm9ybWFsLCAwLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ3NxdWFyZScpIHtcblxuICAgICAgICAgICAgaWYgKCFzdGFydE9mTGluZSkge1xuICAgICAgICAgICAgICAgIC8vIENsb3NlIHByZXZpb3VzIHNlZ21lbnQgd2l0aCBhIHNxdWFyZSBjYXBcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIHByZXZOb3JtYWwsIDEsIDEsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIC8vIFRoZSBzZWdtZW50IGlzIGRvbmUuIFVuc2V0IHZlcnRpY2VzIHRvIGRpc2Nvbm5lY3Qgc2VnbWVudHMuXG4gICAgICAgICAgICAgICAgdGhpcy5lMSA9IHRoaXMuZTIgPSAtMTtcbiAgICAgICAgICAgICAgICBmbGlwID0gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50XG4gICAgICAgICAgICBpZiAobmV4dFZlcnRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgbmV4dE5vcm1hbCwgLTEsIC0xLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ3JvdW5kJykge1xuXG4gICAgICAgICAgICBpZiAoIXN0YXJ0T2ZMaW5lKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgc2VnbWVudCB3aXRoIGJ1dHRcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIHByZXZOb3JtYWwsIDAsIDAsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCByb3VuZCBjYXAgb3IgbGluZWpvaW4gYXQgZW5kIG9mIHNlZ21lbnRcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIHByZXZOb3JtYWwsIDEsIDEsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhlIHNlZ21lbnQgaXMgZG9uZS4gVW5zZXQgdmVydGljZXMgdG8gZGlzY29ubmVjdCBzZWdtZW50cy5cbiAgICAgICAgICAgICAgICB0aGlzLmUxID0gdGhpcy5lMiA9IC0xO1xuICAgICAgICAgICAgICAgIGZsaXAgPSAxO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJlZ2luQ2FwID09PSAncm91bmQnKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIHJvdW5kIGNhcCBiZWZvcmUgZmlyc3Qgc2VnbWVudFxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgbmV4dE5vcm1hbCwgLTEsIC0xLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50IHdpdGggYSBidXR0XG4gICAgICAgICAgICBpZiAobmV4dFZlcnRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgbmV4dE5vcm1hbCwgMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRPZkxpbmUgPSBmYWxzZTtcbiAgICB9XG5cblxufTtcblxuLyoqXG4gKiBBZGQgdHdvIHZlcnRpY2VzIHRvIHRoZSBidWZmZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdXJyZW50VmVydGV4IHRoZSBsaW5lIHZlcnRleCB0byBhZGQgYnVmZmVyIHZlcnRpY2VzIGZvclxuICogQHBhcmFtIHtOdW1iZXJ9IGZsaXAgLTEgaWYgdGhlIHZlcnRpY2VzIHNob3VsZCBiZSBmbGlwcGVkLCAxIG90aGVyd2lzZVxuICogQHBhcmFtIHtOdW1iZXJ9IGRpc3RhbmNlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBiZWdnaW5pbmcgb2YgdGhlIGxpbmUgdG8gdGhlIHZlcnRleFxuICogQHBhcmFtIHtOdW1iZXJ9IGVuZExlZnQgZXh0cnVkZSB0byBzaGlmdCB0aGUgbGVmdCB2ZXJ0ZXggYWxvbmcgdGhlIGxpbmVcbiAqIEBwYXJhbSB7TnVtYmVyfSBlbmRSaWdodCBleHRydWRlIHRvIHNoaWZ0IHRoZSBsZWZ0IHZlcnRleCBhbG9uZyB0aGUgbGluZVxuICogQHBhcmFtIHtCb29sZWFufSByb3VuZCB3aGV0aGVyIHRoaXMgaXMgYSByb3VuZCBjYXBcbiAqL1xuTGluZUJ1Y2tldC5wcm90b3R5cGUuYWRkQ3VycmVudFZlcnRleCA9IGZ1bmN0aW9uKGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBub3JtYWwsIGVuZExlZnQsIGVuZFJpZ2h0LCByb3VuZCkge1xuICAgIHZhciB0eCA9IHJvdW5kID8gMSA6IDA7XG4gICAgdmFyIGV4dHJ1ZGU7XG5cbiAgICB2YXIgbGluZVZlcnRleCA9IHRoaXMuYnVmZmVycy5saW5lVmVydGV4O1xuICAgIHZhciBsaW5lRWxlbWVudCA9IHRoaXMuYnVmZmVycy5saW5lRWxlbWVudDtcbiAgICB2YXIgZWxlbWVudEdyb3VwID0gdGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQ7XG4gICAgdmFyIHZlcnRleFN0YXJ0SW5kZXggPSB0aGlzLmVsZW1lbnRHcm91cHMuY3VycmVudC52ZXJ0ZXhTdGFydEluZGV4O1xuXG4gICAgZXh0cnVkZSA9IG5vcm1hbC5tdWx0KGZsaXApO1xuICAgIGlmIChlbmRMZWZ0KSBleHRydWRlLl9zdWIobm9ybWFsLnBlcnAoKS5fbXVsdChlbmRMZWZ0KSk7XG4gICAgdGhpcy5lMyA9IGxpbmVWZXJ0ZXguYWRkKGN1cnJlbnRWZXJ0ZXgsIGV4dHJ1ZGUsIHR4LCAwLCBkaXN0YW5jZSkgLSB2ZXJ0ZXhTdGFydEluZGV4O1xuICAgIGlmICh0aGlzLmUxID49IDAgJiYgdGhpcy5lMiA+PSAwKSB7XG4gICAgICAgIGxpbmVFbGVtZW50LmFkZCh0aGlzLmUxLCB0aGlzLmUyLCB0aGlzLmUzKTtcbiAgICAgICAgZWxlbWVudEdyb3VwLmVsZW1lbnRMZW5ndGgrKztcbiAgICB9XG4gICAgdGhpcy5lMSA9IHRoaXMuZTI7XG4gICAgdGhpcy5lMiA9IHRoaXMuZTM7XG5cbiAgICBleHRydWRlID0gbm9ybWFsLm11bHQoLWZsaXApO1xuICAgIGlmIChlbmRSaWdodCkgZXh0cnVkZS5fc3ViKG5vcm1hbC5wZXJwKCkuX211bHQoZW5kUmlnaHQpKTtcbiAgICB0aGlzLmUzID0gbGluZVZlcnRleC5hZGQoY3VycmVudFZlcnRleCwgZXh0cnVkZSwgdHgsIDEsIGRpc3RhbmNlKSAtIHZlcnRleFN0YXJ0SW5kZXg7XG4gICAgaWYgKHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDApIHtcbiAgICAgICAgbGluZUVsZW1lbnQuYWRkKHRoaXMuZTEsIHRoaXMuZTIsIHRoaXMuZTMpO1xuICAgICAgICBlbGVtZW50R3JvdXAuZWxlbWVudExlbmd0aCsrO1xuICAgIH1cbiAgICB0aGlzLmUxID0gdGhpcy5lMjtcbiAgICB0aGlzLmUyID0gdGhpcy5lMztcblxuICAgIGVsZW1lbnRHcm91cC52ZXJ0ZXhMZW5ndGggKz0gMjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBFbGVtZW50R3JvdXBzID0gcmVxdWlyZSgnLi9lbGVtZW50X2dyb3VwcycpO1xudmFyIEFuY2hvciA9IHJlcXVpcmUoJy4uL3N5bWJvbC9hbmNob3InKTtcbnZhciBnZXRBbmNob3JzID0gcmVxdWlyZSgnLi4vc3ltYm9sL2dldF9hbmNob3JzJyk7XG52YXIgcmVzb2x2ZVRva2VucyA9IHJlcXVpcmUoJy4uL3V0aWwvdG9rZW4nKTtcbnZhciBRdWFkcyA9IHJlcXVpcmUoJy4uL3N5bWJvbC9xdWFkcycpO1xudmFyIFNoYXBpbmcgPSByZXF1aXJlKCcuLi9zeW1ib2wvc2hhcGluZycpO1xudmFyIHJlc29sdmVUZXh0ID0gcmVxdWlyZSgnLi4vc3ltYm9sL3Jlc29sdmVfdGV4dCcpO1xudmFyIHJlc29sdmVJY29ucyA9IHJlcXVpcmUoJy4uL3N5bWJvbC9yZXNvbHZlX2ljb25zJyk7XG52YXIgbWVyZ2VMaW5lcyA9IHJlcXVpcmUoJy4uL3N5bWJvbC9tZXJnZWxpbmVzJyk7XG52YXIgc2hhcGVUZXh0ID0gU2hhcGluZy5zaGFwZVRleHQ7XG52YXIgc2hhcGVJY29uID0gU2hhcGluZy5zaGFwZUljb247XG52YXIgZ2V0R2x5cGhRdWFkcyA9IFF1YWRzLmdldEdseXBoUXVhZHM7XG52YXIgZ2V0SWNvblF1YWRzID0gUXVhZHMuZ2V0SWNvblF1YWRzO1xudmFyIGNsaXBMaW5lID0gcmVxdWlyZSgnLi4vc3ltYm9sL2NsaXBfbGluZScpO1xudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxudmFyIENvbGxpc2lvbkZlYXR1cmUgPSByZXF1aXJlKCcuLi9zeW1ib2wvY29sbGlzaW9uX2ZlYXR1cmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2xCdWNrZXQ7XG5cbmZ1bmN0aW9uIFN5bWJvbEJ1Y2tldChidWZmZXJzLCBsYXlvdXRQcm9wZXJ0aWVzLCBjb2xsaXNpb24sIG92ZXJzY2FsaW5nLCBjb2xsaXNpb25EZWJ1Zykge1xuICAgIHRoaXMuYnVmZmVycyA9IGJ1ZmZlcnM7XG4gICAgdGhpcy5sYXlvdXRQcm9wZXJ0aWVzID0gbGF5b3V0UHJvcGVydGllcztcbiAgICB0aGlzLmNvbGxpc2lvbiA9IGNvbGxpc2lvbjtcbiAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3ZlcnNjYWxpbmc7XG4gICAgdGhpcy5jb2xsaXNpb25EZWJ1ZyA9IGNvbGxpc2lvbkRlYnVnO1xuXG4gICAgdGhpcy5zeW1ib2xJbnN0YW5jZXMgPSBbXTtcblxufVxuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxheW91dCA9IHRoaXMubGF5b3V0UHJvcGVydGllcztcbiAgICB2YXIgZmVhdHVyZXMgPSB0aGlzLmZlYXR1cmVzO1xuICAgIHZhciB0ZXh0RmVhdHVyZXMgPSB0aGlzLnRleHRGZWF0dXJlcztcblxuICAgIHZhciBob3Jpem9udGFsQWxpZ24gPSAwLjUsXG4gICAgICAgIHZlcnRpY2FsQWxpZ24gPSAwLjU7XG5cbiAgICBzd2l0Y2ggKGxheW91dFsndGV4dC1hbmNob3InXSkge1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgICAgICBob3Jpem9udGFsQWxpZ24gPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbiA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGxheW91dFsndGV4dC1hbmNob3InXSkge1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICBjYXNlICd0b3AtcmlnaHQnOlxuICAgICAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBqdXN0aWZ5ID0gbGF5b3V0Wyd0ZXh0LWp1c3RpZnknXSA9PT0gJ3JpZ2h0JyA/IDEgOlxuICAgICAgICBsYXlvdXRbJ3RleHQtanVzdGlmeSddID09PSAnbGVmdCcgPyAwIDpcbiAgICAgICAgMC41O1xuXG4gICAgdmFyIG9uZUVtID0gMjQ7XG4gICAgdmFyIGxpbmVIZWlnaHQgPSBsYXlvdXRbJ3RleHQtbGluZS1oZWlnaHQnXSAqIG9uZUVtO1xuICAgIHZhciBtYXhXaWR0aCA9IGxheW91dFsnc3ltYm9sLXBsYWNlbWVudCddICE9PSAnbGluZScgPyBsYXlvdXRbJ3RleHQtbWF4LXdpZHRoJ10gKiBvbmVFbSA6IDA7XG4gICAgdmFyIHNwYWNpbmcgPSBsYXlvdXRbJ3RleHQtbGV0dGVyLXNwYWNpbmcnXSAqIG9uZUVtO1xuICAgIHZhciB0ZXh0T2Zmc2V0ID0gW2xheW91dFsndGV4dC1vZmZzZXQnXVswXSAqIG9uZUVtLCBsYXlvdXRbJ3RleHQtb2Zmc2V0J11bMV0gKiBvbmVFbV07XG4gICAgdmFyIGZvbnRzdGFjayA9IGxheW91dFsndGV4dC1mb250J107XG5cbiAgICB2YXIgZ2VvbWV0cmllcyA9IFtdO1xuICAgIGZvciAodmFyIGcgPSAwOyBnIDwgZmVhdHVyZXMubGVuZ3RoOyBnKyspIHtcbiAgICAgICAgZ2VvbWV0cmllcy5wdXNoKGZlYXR1cmVzW2ddLmxvYWRHZW9tZXRyeSgpKTtcbiAgICB9XG5cbiAgICBpZiAobGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gPT09ICdsaW5lJykge1xuICAgICAgICAvLyBNZXJnZSBhZGphY2VudCBsaW5lcyB3aXRoIHRoZSBzYW1lIHRleHQgdG8gaW1wcm92ZSBsYWJlbGxpbmcuXG4gICAgICAgIC8vIEl0J3MgYmV0dGVyIHRvIHBsYWNlIGxhYmVscyBvbiBvbmUgbG9uZyBsaW5lIHRoYW4gb24gbWFueSBzaG9ydCBzZWdtZW50cy5cbiAgICAgICAgdmFyIG1lcmdlZCA9IG1lcmdlTGluZXMoZmVhdHVyZXMsIHRleHRGZWF0dXJlcywgZ2VvbWV0cmllcyk7XG5cbiAgICAgICAgZ2VvbWV0cmllcyA9IG1lcmdlZC5nZW9tZXRyaWVzO1xuICAgICAgICBmZWF0dXJlcyA9IG1lcmdlZC5mZWF0dXJlcztcbiAgICAgICAgdGV4dEZlYXR1cmVzID0gbWVyZ2VkLnRleHRGZWF0dXJlcztcbiAgICB9XG5cbiAgICB2YXIgc2hhcGVkVGV4dCwgc2hhcGVkSWNvbjtcblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZmVhdHVyZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKCFnZW9tZXRyaWVzW2tdKSBjb250aW51ZTtcblxuICAgICAgICBpZiAodGV4dEZlYXR1cmVzW2tdKSB7XG4gICAgICAgICAgICBzaGFwZWRUZXh0ID0gc2hhcGVUZXh0KHRleHRGZWF0dXJlc1trXSwgdGhpcy5zdGFja3NbZm9udHN0YWNrXSwgbWF4V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQsIGhvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbiwganVzdGlmeSwgc3BhY2luZywgdGV4dE9mZnNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaGFwZWRUZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXlvdXRbJ2ljb24taW1hZ2UnXSkge1xuICAgICAgICAgICAgdmFyIGljb25OYW1lID0gcmVzb2x2ZVRva2VucyhmZWF0dXJlc1trXS5wcm9wZXJ0aWVzLCBsYXlvdXRbJ2ljb24taW1hZ2UnXSk7XG4gICAgICAgICAgICB2YXIgaW1hZ2UgPSB0aGlzLmljb25zW2ljb25OYW1lXTtcbiAgICAgICAgICAgIHNoYXBlZEljb24gPSBzaGFwZUljb24oaW1hZ2UsIGxheW91dCk7XG5cbiAgICAgICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNkZkljb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZGZJY29ucyA9IGltYWdlLnNkZjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2RmSWNvbnMgIT09IGltYWdlLnNkZikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1N0eWxlIHNoZWV0IHdhcm5pbmc6IENhbm5vdCBtaXggU0RGIGFuZCBub24tU0RGIGljb25zIGluIG9uZSBidWNrZXQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaGFwZWRJY29uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaGFwZWRUZXh0IHx8IHNoYXBlZEljb24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmVhdHVyZShnZW9tZXRyaWVzW2tdLCBzaGFwZWRUZXh0LCBzaGFwZWRJY29uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucGxhY2VGZWF0dXJlcyh0aGlzLmJ1ZmZlcnMsIHRoaXMuY29sbGlzaW9uRGVidWcpO1xufTtcblxuU3ltYm9sQnVja2V0LnByb3RvdHlwZS5hZGRGZWF0dXJlID0gZnVuY3Rpb24obGluZXMsIHNoYXBlZFRleHQsIHNoYXBlZEljb24pIHtcbiAgICB2YXIgbGF5b3V0ID0gdGhpcy5sYXlvdXRQcm9wZXJ0aWVzO1xuICAgIHZhciBjb2xsaXNpb24gPSB0aGlzLmNvbGxpc2lvbjtcblxuICAgIHZhciBnbHlwaFNpemUgPSAyNDtcblxuICAgIHZhciBmb250U2NhbGUgPSBsYXlvdXRbJ3RleHQtbWF4LXNpemUnXSAvIGdseXBoU2l6ZSxcbiAgICAgICAgdGV4dEJveFNjYWxlID0gY29sbGlzaW9uLnRpbGVQaXhlbFJhdGlvICogZm9udFNjYWxlLFxuICAgICAgICBpY29uQm94U2NhbGUgPSBjb2xsaXNpb24udGlsZVBpeGVsUmF0aW8gKiBsYXlvdXRbJ2ljb24tbWF4LXNpemUnXSxcbiAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UgPSBjb2xsaXNpb24udGlsZVBpeGVsUmF0aW8gKiBsYXlvdXRbJ3N5bWJvbC1taW4tZGlzdGFuY2UnXSxcbiAgICAgICAgYXZvaWRFZGdlcyA9IGxheW91dFsnc3ltYm9sLWF2b2lkLWVkZ2VzJ10sXG4gICAgICAgIHRleHRQYWRkaW5nID0gbGF5b3V0Wyd0ZXh0LXBhZGRpbmcnXSAqIGNvbGxpc2lvbi50aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgaWNvblBhZGRpbmcgPSBsYXlvdXRbJ2ljb24tcGFkZGluZyddICogY29sbGlzaW9uLnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICB0ZXh0TWF4QW5nbGUgPSBsYXlvdXRbJ3RleHQtbWF4LWFuZ2xlJ10gLyAxODAgKiBNYXRoLlBJLFxuICAgICAgICB0ZXh0QWxvbmdMaW5lID0gbGF5b3V0Wyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnLFxuICAgICAgICBpY29uQWxvbmdMaW5lID0gbGF5b3V0WydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnLFxuICAgICAgICBtYXlPdmVybGFwID0gbGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSB8fCBsYXlvdXRbJ2ljb24tYWxsb3ctb3ZlcmxhcCddIHx8XG4gICAgICAgICAgICBsYXlvdXRbJ3RleHQtaWdub3JlLXBsYWNlbWVudCddIHx8IGxheW91dFsnaWNvbi1pZ25vcmUtcGxhY2VtZW50J107XG5cbiAgICBpZiAobGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gPT09ICdsaW5lJykge1xuICAgICAgICBsaW5lcyA9IGNsaXBMaW5lKGxpbmVzLCAwLCAwLCA0MDk2LCA0MDk2KTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gbGluZXNbaV07XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBhbmNob3IgcG9pbnRzIGFyb3VuZCB3aGljaCB5b3Ugd2FudCB0byBwbGFjZSBsYWJlbHNcbiAgICAgICAgdmFyIGFuY2hvcnMgPSBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnID9cbiAgICAgICAgICAgIGdldEFuY2hvcnMobGluZSwgc3ltYm9sTWluRGlzdGFuY2UsIHRleHRNYXhBbmdsZSwgc2hhcGVkVGV4dCwgZ2x5cGhTaXplLCB0ZXh0Qm94U2NhbGUsIHRoaXMub3ZlcnNjYWxpbmcpIDpcbiAgICAgICAgICAgIFsgbmV3IEFuY2hvcihsaW5lWzBdLngsIGxpbmVbMF0ueSwgMCkgXTtcblxuICAgICAgICAvLyBGb3IgZWFjaCBwb3RlbnRpYWwgbGFiZWwsIGNyZWF0ZSB0aGUgcGxhY2VtZW50IGZlYXR1cmVzIHVzZWQgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbnMsIGFuZCB0aGUgcXVhZHMgdXNlIGZvciByZW5kZXJpbmcuXG4gICAgICAgIGZvciAodmFyIGogPSAwLCBsZW4gPSBhbmNob3JzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICB2YXIgYW5jaG9yID0gYW5jaG9yc1tqXTtcblxuICAgICAgICAgICAgdmFyIGluc2lkZSA9ICEoYW5jaG9yLnggPCAwIHx8IGFuY2hvci54ID4gNDA5NiB8fCBhbmNob3IueSA8IDAgfHwgYW5jaG9yLnkgPiA0MDk2KTtcblxuICAgICAgICAgICAgaWYgKGF2b2lkRWRnZXMgJiYgIWluc2lkZSkgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIE5vcm1hbGx5IHN5bWJvbCBsYXllcnMgYXJlIGRyYXduIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMuIE9ubHkgc3ltYm9sc1xuICAgICAgICAgICAgLy8gd2l0aCB0aGVpciBhbmNob3JzIHdpdGhpbiB0aGUgdGlsZSBib3VuZGFyaWVzIGFyZSBhZGRlZCB0byB0aGUgYnVmZmVyc1xuICAgICAgICAgICAgLy8gdG8gcHJldmVudCBzeW1ib2xzIGZyb20gYmVpbmcgZHJhd24gdHdpY2UuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gU3ltYm9scyBpbiBsYXllcnMgd2l0aCBvdmVybGFwIGFyZSBzb3J0ZWQgaW4gdGhlIHkgZGlyZWN0aW9uIHNvIHRoYXRcbiAgICAgICAgICAgIC8vIHN5bWJvbHMgbG93ZXIgb24gdGhlIGNhbnZhcyBhcmUgZHJhd24gb24gdG9wIG9mIHN5bWJvbHMgbmVhciB0aGUgdG9wLlxuICAgICAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhpcyBvcmRlciBhY3Jvc3MgdGlsZSBib3VuZGFyaWVzIHRoZXNlIHN5bWJvbHMgY2FuJ3RcbiAgICAgICAgICAgIC8vIGJlIGRyYXduIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMuIEluc3RlYWQgdGhleSBuZWVkIHRvIGJlIGluY2x1ZGVkIGluXG4gICAgICAgICAgICAvLyB0aGUgYnVmZmVycyBmb3IgYm90aCB0aWxlcyBhbmQgY2xpcHBlZCB0byB0aWxlIGJvdW5kYXJpZXMgYXQgZHJhdyB0aW1lLlxuICAgICAgICAgICAgdmFyIGFkZFRvQnVmZmVycyA9IGluc2lkZSB8fCBtYXlPdmVybGFwO1xuXG4gICAgICAgICAgICB0aGlzLnN5bWJvbEluc3RhbmNlcy5wdXNoKG5ldyBTeW1ib2xJbnN0YW5jZShhbmNob3IsIGxpbmUsIHNoYXBlZFRleHQsIHNoYXBlZEljb24sIGxheW91dCwgYWRkVG9CdWZmZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEJveFNjYWxlLCB0ZXh0UGFkZGluZywgdGV4dEFsb25nTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25Cb3hTY2FsZSwgaWNvblBhZGRpbmcsIGljb25BbG9uZ0xpbmUpKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cblN5bWJvbEJ1Y2tldC5wcm90b3R5cGUucGxhY2VGZWF0dXJlcyA9IGZ1bmN0aW9uKGJ1ZmZlcnMsIGNvbGxpc2lvbkRlYnVnKSB7XG5cbiAgICAvLyBDYWxjdWxhdGUgd2hpY2ggbGFiZWxzIGNhbiBiZSBzaG93biBhbmQgd2hlbiB0aGV5IGNhbiBiZSBzaG93biBhbmRcbiAgICAvLyBjcmVhdGUgdGhlIGJ1ZmVycyB1c2VkIGZvciByZW5kZXJpbmcuXG5cbiAgICB0aGlzLmJ1ZmZlcnMgPSBidWZmZXJzO1xuXG4gICAgdmFyIGVsZW1lbnRHcm91cHMgPSB0aGlzLmVsZW1lbnRHcm91cHMgPSB7XG4gICAgICAgIHRleHQ6IG5ldyBFbGVtZW50R3JvdXBzKGJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgsIGJ1ZmZlcnMuZ2x5cGhFbGVtZW50KSxcbiAgICAgICAgaWNvbjogbmV3IEVsZW1lbnRHcm91cHMoYnVmZmVycy5pY29uVmVydGV4LCBidWZmZXJzLmljb25FbGVtZW50KSxcbiAgICAgICAgc2RmSWNvbnM6IHRoaXMuc2RmSWNvbnNcbiAgICB9O1xuXG4gICAgdmFyIGxheW91dCA9IHRoaXMubGF5b3V0UHJvcGVydGllcztcbiAgICB2YXIgY29sbGlzaW9uID0gdGhpcy5jb2xsaXNpb247XG4gICAgdmFyIG1heFNjYWxlID0gdGhpcy5jb2xsaXNpb24ubWF4U2NhbGU7XG5cbiAgICB2YXIgdGV4dEFsb25nTGluZSA9IGxheW91dFsndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9PT0gJ21hcCcgJiYgbGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gPT09ICdsaW5lJztcbiAgICB2YXIgaWNvbkFsb25nTGluZSA9IGxheW91dFsnaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9PT0gJ21hcCcgJiYgbGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gPT09ICdsaW5lJztcblxuICAgIHZhciBtYXlPdmVybGFwID0gbGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSB8fCBsYXlvdXRbJ2ljb24tYWxsb3ctb3ZlcmxhcCddIHx8XG4gICAgICAgIGxheW91dFsndGV4dC1pZ25vcmUtcGxhY2VtZW50J10gfHwgbGF5b3V0WydpY29uLWlnbm9yZS1wbGFjZW1lbnQnXTtcblxuICAgIC8vIFNvcnQgc3ltYm9scyBieSB0aGVpciB5IHBvc2l0aW9uIG9uIHRoZSBjYW52YXMgc28gdGhhdCB0aGV5IGxvd2VyIHN5bWJvbHNcbiAgICAvLyBhcmUgZHJhd24gb24gdG9wIG9mIGhpZ2hlciBzeW1ib2xzLlxuICAgIC8vIERvbid0IHNvcnQgc3ltYm9scyB0aGF0IHdvbid0IG92ZXJsYXAgYmVjYXVzZSBpdCBpc24ndCBuZWNlc3NhcnkgYW5kXG4gICAgLy8gYmVjYXVzZSBpdCBjYXVzZXMgbW9yZSBsYWJlbHMgdG8gcG9wIGluIGFuZCBvdXQgd2hlbiByb3RhdGluZy5cbiAgICBpZiAobWF5T3ZlcmxhcCkge1xuICAgICAgICB2YXIgYW5nbGUgPSB0aGlzLmNvbGxpc2lvbi5hbmdsZTtcbiAgICAgICAgdmFyIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcblxuICAgICAgICB0aGlzLnN5bWJvbEluc3RhbmNlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgIHZhciBhUm90YXRlZCA9IHNpbiAqIGEueCArIGNvcyAqIGEueTtcbiAgICAgICAgICAgIHZhciBiUm90YXRlZCA9IHNpbiAqIGIueCArIGNvcyAqIGIueTtcbiAgICAgICAgICAgIHJldHVybiBiUm90YXRlZCAtIGFSb3RhdGVkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwID0gMDsgcCA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgIHZhciBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzW3BdO1xuICAgICAgICB2YXIgaGFzVGV4dCA9IHN5bWJvbEluc3RhbmNlLmhhc1RleHQ7XG4gICAgICAgIHZhciBoYXNJY29uID0gc3ltYm9sSW5zdGFuY2UuaGFzSWNvbjtcblxuICAgICAgICB2YXIgaWNvbldpdGhvdXRUZXh0ID0gbGF5b3V0Wyd0ZXh0LW9wdGlvbmFsJ10gfHwgIWhhc1RleHQsXG4gICAgICAgICAgICB0ZXh0V2l0aG91dEljb24gPSBsYXlvdXRbJ2ljb24tb3B0aW9uYWwnXSB8fCAhaGFzSWNvbjtcblxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgc2NhbGVzIGF0IHdoaWNoIHRoZSB0ZXh0IGFuZCBpY29uIGNhbiBiZSBwbGFjZWQgd2l0aG91dCBjb2xsaXNpb24uXG5cbiAgICAgICAgdmFyIGdseXBoU2NhbGUgPSBoYXNUZXh0ICYmICFsYXlvdXRbJ3RleHQtYWxsb3ctb3ZlcmxhcCddID9cbiAgICAgICAgICAgIGNvbGxpc2lvbi5wbGFjZUZlYXR1cmUoc3ltYm9sSW5zdGFuY2UudGV4dENvbGxpc2lvbkZlYXR1cmUpIDogY29sbGlzaW9uLm1pblNjYWxlO1xuXG4gICAgICAgIHZhciBpY29uU2NhbGUgPSBoYXNJY29uICYmICFsYXlvdXRbJ2ljb24tYWxsb3ctb3ZlcmxhcCddID9cbiAgICAgICAgICAgIGNvbGxpc2lvbi5wbGFjZUZlYXR1cmUoc3ltYm9sSW5zdGFuY2UuaWNvbkNvbGxpc2lvbkZlYXR1cmUpIDogY29sbGlzaW9uLm1pblNjYWxlO1xuXG5cbiAgICAgICAgLy8gQ29tYmluZSB0aGUgc2NhbGVzIGZvciBpY29ucyBhbmQgdGV4dC5cblxuICAgICAgICBpZiAoIWljb25XaXRob3V0VGV4dCAmJiAhdGV4dFdpdGhvdXRJY29uKSB7XG4gICAgICAgICAgICBpY29uU2NhbGUgPSBnbHlwaFNjYWxlID0gTWF0aC5tYXgoaWNvblNjYWxlLCBnbHlwaFNjYWxlKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGV4dFdpdGhvdXRJY29uICYmIGdseXBoU2NhbGUpIHtcbiAgICAgICAgICAgIGdseXBoU2NhbGUgPSBNYXRoLm1heChpY29uU2NhbGUsIGdseXBoU2NhbGUpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpY29uV2l0aG91dFRleHQgJiYgaWNvblNjYWxlKSB7XG4gICAgICAgICAgICBpY29uU2NhbGUgPSBNYXRoLm1heChpY29uU2NhbGUsIGdseXBoU2NhbGUpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyBJbnNlcnQgZmluYWwgcGxhY2VtZW50IGludG8gY29sbGlzaW9uIHRyZWUgYW5kIGFkZCBnbHlwaHMvaWNvbnMgdG8gYnVmZmVyc1xuXG4gICAgICAgIGlmIChoYXNUZXh0KSB7XG4gICAgICAgICAgICBpZiAoIWxheW91dFsndGV4dC1pZ25vcmUtcGxhY2VtZW50J10pIHtcbiAgICAgICAgICAgICAgICBjb2xsaXNpb24uaW5zZXJ0RmVhdHVyZShzeW1ib2xJbnN0YW5jZS50ZXh0Q29sbGlzaW9uRmVhdHVyZSwgZ2x5cGhTY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2x5cGhTY2FsZSA8PSBtYXhTY2FsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkU3ltYm9scyhidWZmZXJzLmdseXBoVmVydGV4LCBidWZmZXJzLmdseXBoRWxlbWVudCwgZWxlbWVudEdyb3Vwcy50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuZ2x5cGhRdWFkcywgZ2x5cGhTY2FsZSwgbGF5b3V0Wyd0ZXh0LWtlZXAtdXByaWdodCddLCB0ZXh0QWxvbmdMaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNJY29uKSB7XG4gICAgICAgICAgICBpZiAoIWxheW91dFsnaWNvbi1pZ25vcmUtcGxhY2VtZW50J10pIHtcbiAgICAgICAgICAgICAgICBjb2xsaXNpb24uaW5zZXJ0RmVhdHVyZShzeW1ib2xJbnN0YW5jZS5pY29uQ29sbGlzaW9uRmVhdHVyZSwgaWNvblNjYWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpY29uU2NhbGUgPD0gbWF4U2NhbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFN5bWJvbHMoYnVmZmVycy5pY29uVmVydGV4LCBidWZmZXJzLmljb25FbGVtZW50LCBlbGVtZW50R3JvdXBzLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5pY29uUXVhZHMsIGljb25TY2FsZSwgbGF5b3V0WydpY29uLWtlZXAtdXByaWdodCddLCBpY29uQWxvbmdMaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgaWYgKGNvbGxpc2lvbkRlYnVnKSB0aGlzLmFkZFRvRGVidWdCdWZmZXJzKCk7XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZFN5bWJvbHMgPSBmdW5jdGlvbih2ZXJ0ZXgsIGVsZW1lbnQsIGVsZW1lbnRHcm91cHMsIHF1YWRzLCBzY2FsZSwga2VlcFVwcmlnaHQsIGFsb25nTGluZSkge1xuXG4gICAgZWxlbWVudEdyb3Vwcy5tYWtlUm9vbUZvcig0ICogcXVhZHMubGVuZ3RoKTtcbiAgICB2YXIgZWxlbWVudEdyb3VwID0gZWxlbWVudEdyb3Vwcy5jdXJyZW50O1xuXG4gICAgdmFyIHpvb20gPSB0aGlzLmNvbGxpc2lvbi56b29tO1xuICAgIHZhciBwbGFjZW1lbnRab29tID0gTWF0aC5tYXgoTWF0aC5sb2coc2NhbGUpIC8gTWF0aC5MTjIgKyB6b29tLCAwKTtcbiAgICB2YXIgcGxhY2VtZW50QW5nbGUgPSB0aGlzLmNvbGxpc2lvbi5hbmdsZSArIE1hdGguUEk7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IHF1YWRzLmxlbmd0aDsgaysrKSB7XG5cbiAgICAgICAgdmFyIHN5bWJvbCA9IHF1YWRzW2tdLFxuICAgICAgICAgICAgYW5nbGUgPSBzeW1ib2wuYW5nbGU7XG5cbiAgICAgICAgLy8gZHJvcCB1cHNpZGUgZG93biB2ZXJzaW9ucyBvZiBnbHlwaHNcbiAgICAgICAgdmFyIGEgPSAoYW5nbGUgKyBwbGFjZW1lbnRBbmdsZSkgJSAoTWF0aC5QSSAqIDIpO1xuICAgICAgICBpZiAoa2VlcFVwcmlnaHQgJiYgYWxvbmdMaW5lICYmIChhIDw9IE1hdGguUEkgLyAyIHx8IGEgPiBNYXRoLlBJICogMyAvIDIpKSBjb250aW51ZTtcblxuICAgICAgICB2YXIgdGwgPSBzeW1ib2wudGwsXG4gICAgICAgICAgICB0ciA9IHN5bWJvbC50cixcbiAgICAgICAgICAgIGJsID0gc3ltYm9sLmJsLFxuICAgICAgICAgICAgYnIgPSBzeW1ib2wuYnIsXG4gICAgICAgICAgICB0ZXggPSBzeW1ib2wudGV4LFxuICAgICAgICAgICAgYW5jaG9yID0gc3ltYm9sLmFuY2hvcixcblxuICAgICAgICAgICAgbWluWm9vbSA9IE1hdGgubWF4KHpvb20gKyBNYXRoLmxvZyhzeW1ib2wubWluU2NhbGUpIC8gTWF0aC5MTjIsIHBsYWNlbWVudFpvb20pLFxuICAgICAgICAgICAgbWF4Wm9vbSA9IE1hdGgubWluKHpvb20gKyBNYXRoLmxvZyhzeW1ib2wubWF4U2NhbGUpIC8gTWF0aC5MTjIsIDI1KTtcblxuICAgICAgICBpZiAobWF4Wm9vbSA8PSBtaW5ab29tKSBjb250aW51ZTtcblxuICAgICAgICAvLyBMb3dlciBtaW4gem9vbSBzbyB0aGF0IHdoaWxlIGZhZGluZyBvdXQgdGhlIGxhYmVsIGl0IGNhbiBiZSBzaG93biBvdXRzaWRlIG9mIGNvbGxpc2lvbi1mcmVlIHpvb20gbGV2ZWxzXG4gICAgICAgIGlmIChtaW5ab29tID09PSBwbGFjZW1lbnRab29tKSBtaW5ab29tID0gMDtcblxuICAgICAgICB2YXIgdHJpYW5nbGVJbmRleCA9IHZlcnRleC5pbmRleCAtIGVsZW1lbnRHcm91cC52ZXJ0ZXhTdGFydEluZGV4O1xuXG4gICAgICAgIHZlcnRleC5hZGQoYW5jaG9yLngsIGFuY2hvci55LCB0bC54LCB0bC55LCB0ZXgueCwgdGV4LnksIG1pblpvb20sIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICB2ZXJ0ZXguYWRkKGFuY2hvci54LCBhbmNob3IueSwgdHIueCwgdHIueSwgdGV4LnggKyB0ZXgudywgdGV4LnksIG1pblpvb20sIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICB2ZXJ0ZXguYWRkKGFuY2hvci54LCBhbmNob3IueSwgYmwueCwgYmwueSwgdGV4LngsIHRleC55ICsgdGV4LmgsIG1pblpvb20sIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICB2ZXJ0ZXguYWRkKGFuY2hvci54LCBhbmNob3IueSwgYnIueCwgYnIueSwgdGV4LnggKyB0ZXgudywgdGV4LnkgKyB0ZXguaCwgbWluWm9vbSwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgIGVsZW1lbnRHcm91cC52ZXJ0ZXhMZW5ndGggKz0gNDtcblxuICAgICAgICBlbGVtZW50LmFkZCh0cmlhbmdsZUluZGV4LCB0cmlhbmdsZUluZGV4ICsgMSwgdHJpYW5nbGVJbmRleCArIDIpO1xuICAgICAgICBlbGVtZW50LmFkZCh0cmlhbmdsZUluZGV4ICsgMSwgdHJpYW5nbGVJbmRleCArIDIsIHRyaWFuZ2xlSW5kZXggKyAzKTtcbiAgICAgICAgZWxlbWVudEdyb3VwLmVsZW1lbnRMZW5ndGggKz0gMjtcbiAgICB9XG5cbn07XG5cblN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuZ2V0RGVwZW5kZW5jaWVzID0gZnVuY3Rpb24odGlsZSwgYWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpcnN0ZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuZ2V0VGV4dERlcGVuZGVuY2llcyh0aWxlLCBhY3RvciwgZG9uZSk7XG4gICAgdGhpcy5nZXRJY29uRGVwZW5kZW5jaWVzKHRpbGUsIGFjdG9yLCBkb25lKTtcbiAgICBmdW5jdGlvbiBkb25lKGVycikge1xuICAgICAgICBpZiAoZXJyIHx8IGZpcnN0ZG9uZSkgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIGZpcnN0ZG9uZSA9IHRydWU7XG4gICAgfVxufTtcblxuU3ltYm9sQnVja2V0LnByb3RvdHlwZS5nZXRJY29uRGVwZW5kZW5jaWVzID0gZnVuY3Rpb24odGlsZSwgYWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMubGF5b3V0UHJvcGVydGllc1snaWNvbi1pbWFnZSddKSB7XG4gICAgICAgIHZhciBmZWF0dXJlcyA9IHRoaXMuZmVhdHVyZXM7XG4gICAgICAgIHZhciBpY29ucyA9IHJlc29sdmVJY29ucyhmZWF0dXJlcywgdGhpcy5sYXlvdXRQcm9wZXJ0aWVzKTtcblxuICAgICAgICBpZiAoaWNvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhY3Rvci5zZW5kKCdnZXQgaWNvbnMnLCB7IGljb25zOiBpY29ucyB9LCBzZXRJY29ucy5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEljb25zKGVyciwgbmV3aWNvbnMpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIHRoaXMuaWNvbnMgPSBuZXdpY29ucztcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmdldFRleHREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbih0aWxlLCBhY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmVhdHVyZXMgPSB0aGlzLmZlYXR1cmVzO1xuICAgIHZhciBmb250c3RhY2sgPSB0aGlzLmxheW91dFByb3BlcnRpZXNbJ3RleHQtZm9udCddO1xuXG4gICAgdmFyIHN0YWNrcyA9IHRoaXMuc3RhY2tzID0gdGlsZS5zdGFja3M7XG4gICAgaWYgKHN0YWNrc1tmb250c3RhY2tdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhY2tzW2ZvbnRzdGFja10gPSB7fTtcbiAgICB9XG4gICAgdmFyIHN0YWNrID0gc3RhY2tzW2ZvbnRzdGFja107XG5cbiAgICB2YXIgZGF0YSA9IHJlc29sdmVUZXh0KGZlYXR1cmVzLCB0aGlzLmxheW91dFByb3BlcnRpZXMsIHN0YWNrKTtcbiAgICB0aGlzLnRleHRGZWF0dXJlcyA9IGRhdGEudGV4dEZlYXR1cmVzO1xuXG4gICAgYWN0b3Iuc2VuZCgnZ2V0IGdseXBocycsIHtcbiAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgZm9udHN0YWNrOiBmb250c3RhY2ssXG4gICAgICAgIGNvZGVwb2ludHM6IGRhdGEuY29kZXBvaW50c1xuICAgIH0sIGZ1bmN0aW9uKGVyciwgbmV3c3RhY2spIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG5cbiAgICAgICAgZm9yICh2YXIgY29kZXBvaW50IGluIG5ld3N0YWNrKSB7XG4gICAgICAgICAgICBzdGFja1tjb2RlcG9pbnRdID0gbmV3c3RhY2tbY29kZXBvaW50XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSk7XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZFRvRGVidWdCdWZmZXJzID0gZnVuY3Rpb24oKSB7XG5cbiAgICB0aGlzLmVsZW1lbnRHcm91cHMuY29sbGlzaW9uQm94ID0gbmV3IEVsZW1lbnRHcm91cHModGhpcy5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleCk7XG4gICAgdGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveC5tYWtlUm9vbUZvcigwKTtcbiAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleDtcbiAgICB2YXIgYW5nbGUgPSAtdGhpcy5jb2xsaXNpb24uYW5nbGU7XG4gICAgdmFyIHlTdHJldGNoID0gdGhpcy5jb2xsaXNpb24ueVN0cmV0Y2g7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZmVhdHVyZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzW2pdW2kgPT09IDAgPyAndGV4dENvbGxpc2lvbkZlYXR1cmUnIDogJ2ljb25Db2xsaXNpb25GZWF0dXJlJ107XG4gICAgICAgICAgICBpZiAoIWZlYXR1cmUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdmFyIGJveGVzID0gZmVhdHVyZS5ib3hlcztcblxuICAgICAgICAgICAgZm9yICh2YXIgYiA9IDA7IGIgPCBib3hlcy5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgIHZhciBib3ggPSBib3hlc1tiXTtcbiAgICAgICAgICAgICAgICB2YXIgYW5jaG9yID0gYm94LmFuY2hvcjtcblxuICAgICAgICAgICAgICAgIHZhciB0bCA9IG5ldyBQb2ludChib3gueDEsIGJveC55MSAqIHlTdHJldGNoKS5fcm90YXRlKGFuZ2xlKTtcbiAgICAgICAgICAgICAgICB2YXIgdHIgPSBuZXcgUG9pbnQoYm94LngyLCBib3gueTEgKiB5U3RyZXRjaCkuX3JvdGF0ZShhbmdsZSk7XG4gICAgICAgICAgICAgICAgdmFyIGJsID0gbmV3IFBvaW50KGJveC54MSwgYm94LnkyICogeVN0cmV0Y2gpLl9yb3RhdGUoYW5nbGUpO1xuICAgICAgICAgICAgICAgIHZhciBiciA9IG5ldyBQb2ludChib3gueDIsIGJveC55MiAqIHlTdHJldGNoKS5fcm90YXRlKGFuZ2xlKTtcblxuICAgICAgICAgICAgICAgIHZhciBtYXhab29tID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjUsIHRoaXMuY29sbGlzaW9uLnpvb20gKyBNYXRoLmxvZyhib3gubWF4U2NhbGUpIC8gTWF0aC5MTjIpKTtcbiAgICAgICAgICAgICAgICB2YXIgcGxhY2VtZW50Wm9vbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1LCB0aGlzLmNvbGxpc2lvbi56b29tICsgTWF0aC5sb2coYm94LnBsYWNlbWVudFNjYWxlKSAvIE1hdGguTE4yKSk7XG5cbiAgICAgICAgICAgICAgICBidWZmZXIuYWRkKGFuY2hvciwgdGwsIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQoYW5jaG9yLCB0ciwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLmFkZChhbmNob3IsIHRyLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgICAgICAgICBidWZmZXIuYWRkKGFuY2hvciwgYnIsIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQoYW5jaG9yLCBiciwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLmFkZChhbmNob3IsIGJsLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgICAgICAgICBidWZmZXIuYWRkKGFuY2hvciwgYmwsIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQoYW5jaG9yLCB0bCwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRHcm91cHMuY29sbGlzaW9uQm94LmN1cnJlbnQudmVydGV4TGVuZ3RoICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5mdW5jdGlvbiBTeW1ib2xJbnN0YW5jZShhbmNob3IsIGxpbmUsIHNoYXBlZFRleHQsIHNoYXBlZEljb24sIGxheW91dCwgYWRkVG9CdWZmZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEJveFNjYWxlLCB0ZXh0UGFkZGluZywgdGV4dEFsb25nTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25Cb3hTY2FsZSwgaWNvblBhZGRpbmcsIGljb25BbG9uZ0xpbmUpIHtcblxuICAgIHRoaXMueCA9IGFuY2hvci54O1xuICAgIHRoaXMueSA9IGFuY2hvci55O1xuICAgIHRoaXMuaGFzVGV4dCA9ICEhc2hhcGVkVGV4dDtcbiAgICB0aGlzLmhhc0ljb24gPSAhIXNoYXBlZEljb247XG5cbiAgICBpZiAodGhpcy5oYXNUZXh0KSB7XG4gICAgICAgIHRoaXMuZ2x5cGhRdWFkcyA9IGFkZFRvQnVmZmVycyA/IGdldEdseXBoUXVhZHMoYW5jaG9yLCBzaGFwZWRUZXh0LCB0ZXh0Qm94U2NhbGUsIGxpbmUsIGxheW91dCwgdGV4dEFsb25nTGluZSkgOiBbXTtcbiAgICAgICAgdGhpcy50ZXh0Q29sbGlzaW9uRmVhdHVyZSA9IG5ldyBDb2xsaXNpb25GZWF0dXJlKGxpbmUsIGFuY2hvciwgc2hhcGVkVGV4dCwgdGV4dEJveFNjYWxlLCB0ZXh0UGFkZGluZywgdGV4dEFsb25nTGluZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzSWNvbikge1xuICAgICAgICB0aGlzLmljb25RdWFkcyA9IGFkZFRvQnVmZmVycyA/IGdldEljb25RdWFkcyhhbmNob3IsIHNoYXBlZEljb24sIGljb25Cb3hTY2FsZSwgbGluZSwgbGF5b3V0LCBpY29uQWxvbmdMaW5lKSA6IFtdO1xuICAgICAgICB0aGlzLmljb25Db2xsaXNpb25GZWF0dXJlID0gbmV3IENvbGxpc2lvbkZlYXR1cmUobGluZSwgYW5jaG9yLCBzaGFwZWRJY29uLCBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCBpY29uQWxvbmdMaW5lKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29vcmRpbmF0ZTtcblxuLyoqXG4gKiBBIGNvb3JkaW5hdGUgaXMgYSBjb2x1bW4sIHJvdywgem9vbSBjb21iaW5hdGlvbiwgb2Z0ZW4gdXNlZFxuICogYXMgdGhlIGRhdGEgY29tcG9uZW50IG9mIGEgdGlsZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gY29sdW1uXG4gKiBAcGFyYW0ge051bWJlcn0gcm93XG4gKiBAcGFyYW0ge051bWJlcn0gem9vbVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gQ29vcmRpbmF0ZShjb2x1bW4sIHJvdywgem9vbSkge1xuICAgIHRoaXMuY29sdW1uID0gY29sdW1uO1xuICAgIHRoaXMucm93ID0gcm93O1xuICAgIHRoaXMuem9vbSA9IHpvb207XG59XG5cbkNvb3JkaW5hdGUucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY2xvbmUgb2YgdGhpcyBjb29yZGluYXRlIHRoYXQgY2FuIGJlIG11dGF0ZWQgd2l0aG91dFxuICAgICAqIGNoYW5naW5nIHRoZSBvcmlnaW5hbCBjb29yZGluYXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Q29vcmRpbmF0ZX0gY2xvbmVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIHZhciBjb29yZCA9IG5ldyBDb29yZGluYXRlKDAsIDAsIDApO1xuICAgICAqIHZhciBjMiA9IGNvb3JkLmNsb25lKCk7XG4gICAgICogLy8gc2luY2UgY29vcmQgaXMgY2xvbmVkLCBtb2RpZnlpbmcgYSBwcm9wZXJ0eSBvZiBjMiBkb2VzXG4gICAgICogLy8gbm90IG1vZGlmeSBpdC5cbiAgICAgKiBjMi56b29tID0gMjtcbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29vcmRpbmF0ZSh0aGlzLmNvbHVtbiwgdGhpcy5yb3csIHRoaXMuem9vbSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFpvb20gdGhpcyBjb29yZGluYXRlIHRvIGEgZ2l2ZW4gem9vbSBsZXZlbC4gVGhpcyByZXR1cm5zIGEgbmV3XG4gICAgICogY29vcmRpbmF0ZSBvYmplY3QsIG5vdCBtdXRhdGluZyB0aGUgb2xkIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB6b29tXG4gICAgICogQHJldHVybnMge0Nvb3JkaW5hdGV9IHpvb21lZCBjb29yZGluYXRlXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBjb29yZCA9IG5ldyBDb29yZGluYXRlKDAsIDAsIDApO1xuICAgICAqIHZhciBjMiA9IGNvb3JkLnpvb21UbygxKTtcbiAgICAgKiBjMiAvLyBlcXVhbHMgbmV3IENvb3JkaW5hdGUoMCwgMCwgMSk7XG4gICAgICovXG4gICAgem9vbVRvOiBmdW5jdGlvbih6b29tKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3pvb21Ubyh6b29tKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHRoZSBjb2x1bW4gYW5kIHJvdyB2YWx1ZXMgb2YgdGhpcyBjb29yZGluYXRlIGZyb20gdGhvc2VcbiAgICAgKiBvZiBhbm90aGVyIGNvb3JkaW5hdGUuIFRoZSBvdGhlciBjb29yZGluYXQgd2lsbCBiZSB6b29tZWQgdG8gdGhlXG4gICAgICogc2FtZSBsZXZlbCBhcyBgdGhpc2AgYmVmb3JlIHRoZSBzdWJ0cmFjdGlvbiBvY2N1cnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gYyBvdGhlciBjb29yZGluYXRlXG4gICAgICogQHJldHVybnMge0Nvb3JkaW5hdGV9IHJlc3VsdFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3ViOiBmdW5jdGlvbihjKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3N1YihjKTsgfSxcblxuICAgIF96b29tVG86IGZ1bmN0aW9uKHpvb20pIHtcbiAgICAgICAgdmFyIHNjYWxlID0gTWF0aC5wb3coMiwgem9vbSAtIHRoaXMuem9vbSk7XG4gICAgICAgIHRoaXMuY29sdW1uICo9IHNjYWxlO1xuICAgICAgICB0aGlzLnJvdyAqPSBzY2FsZTtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9zdWI6IGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgYyA9IGMuem9vbVRvKHRoaXMuem9vbSk7XG4gICAgICAgIHRoaXMuY29sdW1uIC09IGMuY29sdW1uO1xuICAgICAgICB0aGlzLnJvdyAtPSBjLnJvdztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBMYXRMbmc7XG5cbnZhciB3cmFwID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJykud3JhcDtcblxuLyoqXG4gKiBDcmVhdGUgYSBsYXRpdHVkZSwgbG9uZ2l0dWRlIG9iamVjdCBmcm9tIGEgZ2l2ZW4gbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBwYWlyIGluIGRlZ3JlZXMuXG4gKlxuICogQGNsYXNzIExhdExuZ1xuICogQGNsYXNzZGVzYyBBIHJlcHJlc2VudGF0aW9uIG9mIGEgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBwb2ludCwgaW4gZGVncmVlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsYXQgbGF0aXR1ZGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBsbmcgbG9uZ2l0dWRlXG4gKiBAZXhhbXBsZVxuICogdmFyIGxhdGxuZyA9IG5ldyBtYXBib3hnbC5MYXRMbmcoMzcuNzYsIC0xMjIuNDQpO1xuICovXG5mdW5jdGlvbiBMYXRMbmcobGF0LCBsbmcpIHtcbiAgICBpZiAoaXNOYU4obGF0KSB8fCBpc05hTihsbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBMYXRMbmcgb2JqZWN0OiAoJyArIGxhdCArICcsICcgKyBsbmcgKyAnKScpO1xuICAgIH1cbiAgICB0aGlzLmxhdCA9ICtsYXQ7XG4gICAgdGhpcy5sbmcgPSArbG5nO1xufVxuXG4vKipcbiAqIFJldHVybiBhIG5ldyBgTGF0TG5nYCBvYmplY3Qgd2hvc2UgbG9uZ2l0dWRlIGlzIHdyYXBwZWQgdG8gdGhlIHJhbmdlICgtMTgwLCAxODApLlxuICpcbiAqIEByZXR1cm5zIHtMYXRMbmd9IHdyYXBwZWQgTGF0TG5nIG9iamVjdFxuICogQGV4YW1wbGVcbiAqIHZhciBwb2ludCA9IG1hcGJveGdsLkxhdExuZygwLCAyMDApO1xuICogdmFyIHdyYXBwZWQgPSBwb2ludC53cmFwKCk7XG4gKiB3cmFwcGVkLmxuZzsgLy8gPSAtMTYwXG4gKi9cbkxhdExuZy5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IExhdExuZyh0aGlzLmxhdCwgd3JhcCh0aGlzLmxuZywgLTE4MCwgMTgwKSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgYW4gYXJyYXkgdG8gYSBgTGF0TG5nYCBvYmplY3QsIG9yIHJldHVybiBhbiBleGlzdGluZyBgTGF0TG5nYCBvYmplY3RcbiAqIHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj58TGF0TG5nfSBpbnB1dCBgaW5wdXRgIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtMYXRMbmd9IExhdExuZyBvYmplY3Qgb3Igb3JpZ2luYWwgaW5wdXRcbiAqIEBleGFtcGxlXG4gKiB2YXIgbGwgPSBtYXBib3hnbC5MYXRMbmcuY29udmVydChbMTAsIDEwXSk7XG4gKiB2YXIgbGwyID0gbmV3IG1hcGJveGdsLkxhdExuZygxMCwgMTApO1xuICogbGwgLy8gPSBsbDJcbiAqL1xuTGF0TG5nLmNvbnZlcnQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBMYXRMbmcpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXRMbmcoaW5wdXRbMF0sIGlucHV0WzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBMYXRMbmdCb3VuZHM7XG5cbnZhciBMYXRMbmcgPSByZXF1aXJlKCcuL2xhdF9sbmcnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYm91bmRpbmcgYm94IGZyb20gdGhlIGdpdmVuIHBhaXIgb2YgcG9pbnRzLiBJZiBwYXJhbWV0ZXJlcyBhcmUgb21pdHRlZCwgYSBgbnVsbGAgYm91bmRpbmcgYm94IGlzIGNyZWF0ZWQuXG4gKlxuICogQGNsYXNzIExhdExuZ0JvdW5kc1xuICogQGNsYXNzZGVzYyBBIHJlcHJlc2VudGF0aW9uIG9mIHJlY3Rhbmd1bGFyIGJveCBvbiB0aGUgZWFydGgsIGRlZmluZWQgYnkgaXRzIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IHBvaW50cyBpbiBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlLlxuICogQHBhcmFtIHtMYXRMbmd9IHN3IHNvdXRod2VzdFxuICogQHBhcmFtIHtMYXRMbmd9IG5lIG5vcnRoZWFzdFxuICogQGV4YW1wbGVcbiAqIHZhciBzdyA9IG5ldyBtYXBib3hnbC5MYXRMbmcoMCwgMCk7XG4gKiB2YXIgbmUgPSBuZXcgbWFwYm94Z2wuTGF0TG5nKDEwLCAtMTApO1xuICogdmFyIGJvdW5kcyA9IG5ldyBtYXBib3hnbC5MYXRMbmdCb3VuZHMoc3csIG5lKTtcbiAqXG4gKi9cbmZ1bmN0aW9uIExhdExuZ0JvdW5kcyhzdywgbmUpIHtcbiAgICBpZiAoIXN3KSByZXR1cm47XG5cbiAgICB2YXIgbGF0bG5ncyA9IG5lID8gW3N3LCBuZV0gOiBzdztcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsYXRsbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHRoaXMuZXh0ZW5kKGxhdGxuZ3NbaV0pO1xuICAgIH1cbn1cblxuTGF0TG5nQm91bmRzLnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIEV4dGVuZCB0aGUgYm91bmRzIHRvIGluY2x1ZGUgYSBnaXZlbiBMYXRMbmcgb3IgTGF0TG5nQm91bmRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMYXRMbmd8TGF0TG5nQm91bmRzfSBvYmogb2JqZWN0IHRvIGV4dGVuZCB0b1xuICAgICAqIEByZXR1cm5zIHtMYXRMbmdCb3VuZHN9IGB0aGlzYFxuICAgICAqL1xuICAgIGV4dGVuZDogZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgIHZhciBzdyA9IHRoaXMuX3N3LFxuICAgICAgICAgICAgbmUgPSB0aGlzLl9uZSxcbiAgICAgICAgICAgIHN3MiwgbmUyO1xuXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBMYXRMbmcpIHtcbiAgICAgICAgICAgIHN3MiA9IG9iajtcbiAgICAgICAgICAgIG5lMiA9IG9iajtcblxuICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExhdExuZ0JvdW5kcykge1xuICAgICAgICAgICAgc3cyID0gb2JqLl9zdztcbiAgICAgICAgICAgIG5lMiA9IG9iai5fbmU7XG5cbiAgICAgICAgICAgIGlmICghc3cyIHx8ICFuZTIpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqID8gdGhpcy5leHRlbmQoTGF0TG5nLmNvbnZlcnQob2JqKSB8fCBMYXRMbmdCb3VuZHMuY29udmVydChvYmopKSA6IHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN3ICYmICFuZSkge1xuICAgICAgICAgICAgdGhpcy5fc3cgPSBuZXcgTGF0TG5nKHN3Mi5sYXQsIHN3Mi5sbmcpO1xuICAgICAgICAgICAgdGhpcy5fbmUgPSBuZXcgTGF0TG5nKG5lMi5sYXQsIG5lMi5sbmcpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdy5sYXQgPSBNYXRoLm1pbihzdzIubGF0LCBzdy5sYXQpO1xuICAgICAgICAgICAgc3cubG5nID0gTWF0aC5taW4oc3cyLmxuZywgc3cubG5nKTtcbiAgICAgICAgICAgIG5lLmxhdCA9IE1hdGgubWF4KG5lMi5sYXQsIG5lLmxhdCk7XG4gICAgICAgICAgICBuZS5sbmcgPSBNYXRoLm1heChuZTIubG5nLCBuZS5sbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcG9pbnQgZXF1aWRpc3RhbnQgZnJvbSB0aGlzIGJveCdzIGNvcm5lcnNcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nfSBjZW50ZXJwb2ludFxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGJvdW5kcyA9IG5ldyBtYXBib3hnbC5MYXRMbmdCb3VuZHMoXG4gICAgICogICBuZXcgbWFwYm94Z2wuTGF0TG5nKDEwLCAxMCksXG4gICAgICogICBuZXcgbWFwYm94Z2wuTGF0TG5nKC0xMCwgLTEwKTtcbiAgICAgKiBib3VuZHMuZ2V0Q2VudGVyKCk7IC8vIGVxdWFscyBtYXBib3hnbC5MYXRMbmcoMCwgMClcbiAgICAgKi9cbiAgICBnZXRDZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IExhdExuZygodGhpcy5fc3cubGF0ICsgdGhpcy5fbmUubGF0KSAvIDIsICh0aGlzLl9zdy5sbmcgKyB0aGlzLl9uZS5sbmcpIC8gMik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBzb3V0aHdlc3QgY29ybmVyXG4gICAgICogQHJldHVybnMge0xhdExuZ30gc291dGh3ZXN0XG4gICAgICovXG4gICAgZ2V0U291dGhXZXN0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3N3OyB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IG5vcnRoZWFzdCBjb3JuZXJcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nfSBub3J0aGVhc3RcbiAgICAgKi9cbiAgICBnZXROb3J0aEVhc3Q6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fbmU7IH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgbm9ydGh3ZXN0IGNvcm5lclxuICAgICAqIEByZXR1cm5zIHtMYXRMbmd9IG5vcnRod2VzdFxuICAgICAqL1xuICAgIGdldE5vcnRoV2VzdDogZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgTGF0TG5nKHRoaXMuZ2V0Tm9ydGgoKSwgdGhpcy5nZXRXZXN0KCkpOyB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHNvdXRoZWFzdCBjb3JuZXJcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nfSBzb3V0aGVhc3RcbiAgICAgKi9cbiAgICBnZXRTb3V0aEVhc3Q6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IExhdExuZyh0aGlzLmdldFNvdXRoKCksIHRoaXMuZ2V0RWFzdCgpKTsgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB3ZXN0IGVkZ2UgbG9uZ2l0dWRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gd2VzdFxuICAgICAqL1xuICAgIGdldFdlc3Q6ICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3N3LmxuZzsgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBzb3V0aCBlZGdlIGxhdGl0dWRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gc291dGhcbiAgICAgKi9cbiAgICBnZXRTb3V0aDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zdy5sYXQ7IH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgZWFzdCBlZGdlIGxvbmdpdHVkZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IGVhc3RcbiAgICAgKi9cbiAgICBnZXRFYXN0OiAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9uZS5sbmc7IH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgbm9ydGggZWRnZSBsYXRpdHVkZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IG5vcnRoXG4gICAgICovXG4gICAgZ2V0Tm9ydGg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fbmUubGF0OyB9XG59O1xuXG4vKipcbiAqIGNvbnN0cnVjdHMgTGF0TG5nQm91bmRzIGZyb20gYW4gYXJyYXkgaWYgbmVjZXNzYXJ5XG4gKiBAcGFyYW0ge0xhdExuZ0JvdW5kc3wqfSBhIGFueSBpbnB1dFxuICogQHJldHVybnMge0xhdExuZ0JvdW5kc3xmYWxzZX1cbiAqIEBleGFtcGxlXG4gKiAvLyBjYWxscyBMYXRMbmcuY29udmVydCBpbnRlcm5hbGx5IHRvXG4gKiAvLyBzdXBwb3J0IGFycmF5cyBhcyBsYXRsbmcgdmFsdWVzXG4gKiBMYXRMbmdCb3VuZHMuY29udmVydChbWy0xMCwgLTEwXSwgWzEwLCAxMF1dKTtcbiAqL1xuTGF0TG5nQm91bmRzLmNvbnZlcnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIGlmICghYSB8fCBhIGluc3RhbmNlb2YgTGF0TG5nQm91bmRzKSByZXR1cm4gYTtcbiAgICByZXR1cm4gbmV3IExhdExuZ0JvdW5kcyhhKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBMYXRMbmcgPSByZXF1aXJlKCcuL2xhdF9sbmcnKSxcbiAgICBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5JyksXG4gICAgQ29vcmRpbmF0ZSA9IHJlcXVpcmUoJy4vY29vcmRpbmF0ZScpLFxuICAgIHdyYXAgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKS53cmFwLFxuICAgIGludGVycCA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJwb2xhdGUnKSxcbiAgICB2ZWM0ID0gcmVxdWlyZSgnZ2wtbWF0cml4JykudmVjNCxcbiAgICBtYXQ0ID0gcmVxdWlyZSgnZ2wtbWF0cml4JykubWF0NDtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbi8qXG4gKiBBIHNpbmdsZSB0cmFuc2Zvcm0sIGdlbmVyYWxseSB1c2VkIGZvciBhIHNpbmdsZSB0aWxlIHRvIGJlXG4gKiBzY2FsZWQsIHJvdGF0ZWQsIGFuZCB6b29tZWQuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1pblpvb21cbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhab29tXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBUcmFuc2Zvcm0obWluWm9vbSwgbWF4Wm9vbSkge1xuICAgIHRoaXMudGlsZVNpemUgPSA1MTI7IC8vIGNvbnN0YW50XG5cbiAgICB0aGlzLl9taW5ab29tID0gbWluWm9vbSB8fCAwO1xuICAgIHRoaXMuX21heFpvb20gPSBtYXhab29tIHx8IDIyO1xuXG4gICAgdGhpcy5sYXRSYW5nZSA9IFstODUuMDUxMTMsIDg1LjA1MTEzXTtcblxuICAgIHRoaXMud2lkdGggPSAwO1xuICAgIHRoaXMuaGVpZ2h0ID0gMDtcbiAgICB0aGlzLnpvb20gPSAwO1xuICAgIHRoaXMuY2VudGVyID0gbmV3IExhdExuZygwLCAwKTtcbiAgICB0aGlzLmFuZ2xlID0gMDtcbiAgICB0aGlzLl9hbHRpdHVkZSA9IDEuNTtcbiAgICB0aGlzLl9waXRjaCA9IDA7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IG1pblpvb20oKSB7IHJldHVybiB0aGlzLl9taW5ab29tOyB9LFxuICAgIHNldCBtaW5ab29tKHpvb20pIHtcbiAgICAgICAgdGhpcy5fbWluWm9vbSA9IHpvb207XG4gICAgICAgIHRoaXMuem9vbSA9IE1hdGgubWF4KHRoaXMuem9vbSwgem9vbSk7XG4gICAgfSxcblxuICAgIGdldCBtYXhab29tKCkgeyByZXR1cm4gdGhpcy5fbWF4Wm9vbTsgfSxcbiAgICBzZXQgbWF4Wm9vbSh6b29tKSB7XG4gICAgICAgIHRoaXMuX21heFpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnpvb20gPSBNYXRoLm1pbih0aGlzLnpvb20sIHpvb20pO1xuICAgIH0sXG5cbiAgICBnZXQgd29ybGRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlU2l6ZSAqIHRoaXMuc2NhbGU7XG4gICAgfSxcblxuICAgIGdldCBjZW50ZXJQb2ludCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZS5fZGl2KDIpO1xuICAgIH0sXG5cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgfSxcblxuICAgIGdldCBiZWFyaW5nKCkge1xuICAgICAgICByZXR1cm4gLXRoaXMuYW5nbGUgLyBNYXRoLlBJICogMTgwO1xuICAgIH0sXG4gICAgc2V0IGJlYXJpbmcoYmVhcmluZykge1xuICAgICAgICB0aGlzLmFuZ2xlID0gLXdyYXAoYmVhcmluZywgLTE4MCwgMTgwKSAqIE1hdGguUEkgLyAxODA7XG4gICAgfSxcblxuICAgIGdldCBwaXRjaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BpdGNoIC8gTWF0aC5QSSAqIDE4MDtcbiAgICB9LFxuICAgIHNldCBwaXRjaChwaXRjaCkge1xuICAgICAgICB0aGlzLl9waXRjaCA9IE1hdGgubWluKDYwLCBwaXRjaCkgLyAxODAgKiBNYXRoLlBJO1xuICAgIH0sXG5cbiAgICBnZXQgYWx0aXR1ZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbHRpdHVkZTtcbiAgICB9LFxuICAgIHNldCBhbHRpdHVkZShhbHRpdHVkZSkge1xuICAgICAgICB0aGlzLl9hbHRpdHVkZSA9IE1hdGgubWF4KDAuNzUsIGFsdGl0dWRlKTtcbiAgICB9LFxuXG4gICAgZ2V0IHpvb20oKSB7IHJldHVybiB0aGlzLl96b29tOyB9LFxuICAgIHNldCB6b29tKHpvb20pIHtcbiAgICAgICAgem9vbSA9IE1hdGgubWluKE1hdGgubWF4KHpvb20sIHRoaXMubWluWm9vbSksIHRoaXMubWF4Wm9vbSk7XG4gICAgICAgIHRoaXMuX3pvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnNjYWxlID0gdGhpcy56b29tU2NhbGUoem9vbSk7XG4gICAgICAgIHRoaXMudGlsZVpvb20gPSBNYXRoLmZsb29yKHpvb20pO1xuICAgICAgICB0aGlzLnpvb21GcmFjdGlvbiA9IHpvb20gLSB0aGlzLnRpbGVab29tO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICB9LFxuXG4gICAgem9vbVNjYWxlOiBmdW5jdGlvbih6b29tKSB7IHJldHVybiBNYXRoLnBvdygyLCB6b29tKTsgfSxcbiAgICBzY2FsZVpvb206IGZ1bmN0aW9uKHNjYWxlKSB7IHJldHVybiBNYXRoLmxvZyhzY2FsZSkgLyBNYXRoLkxOMjsgfSxcblxuICAgIHByb2plY3Q6IGZ1bmN0aW9uKGxhdGxuZywgd29ybGRTaXplKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgICAgICB0aGlzLmxuZ1gobGF0bG5nLmxuZywgd29ybGRTaXplKSxcbiAgICAgICAgICAgIHRoaXMubGF0WShsYXRsbmcubGF0LCB3b3JsZFNpemUpKTtcbiAgICB9LFxuXG4gICAgdW5wcm9qZWN0OiBmdW5jdGlvbihwb2ludCwgd29ybGRTaXplKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF0TG5nKFxuICAgICAgICAgICAgdGhpcy55TGF0KHBvaW50LnksIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICB0aGlzLnhMbmcocG9pbnQueCwgd29ybGRTaXplKSk7XG4gICAgfSxcblxuICAgIGdldCB4KCkgeyByZXR1cm4gdGhpcy5sbmdYKHRoaXMuY2VudGVyLmxuZyk7IH0sXG4gICAgZ2V0IHkoKSB7IHJldHVybiB0aGlzLmxhdFkodGhpcy5jZW50ZXIubGF0KTsgfSxcblxuICAgIGdldCBwb2ludCgpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBsYXQvbG9uIDwtPiBhYnNvbHV0ZSBwaXhlbCBjb29yZHMgY29udmVyc2lvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW3dvcmxkU2l6ZT10aGlzLndvcmxkU2l6ZV1cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBwaXhlbCBjb29yZGluYXRlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsbmdYOiBmdW5jdGlvbihsb24sIHdvcmxkU2l6ZSkge1xuICAgICAgICByZXR1cm4gKDE4MCArIGxvbikgKiAod29ybGRTaXplIHx8IHRoaXMud29ybGRTaXplKSAvIDM2MDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGxhdGl0dWRlIHRvIGFic29sdXRlIHkgY29vcmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsYXRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW3dvcmxkU2l6ZT10aGlzLndvcmxkU2l6ZV1cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBwaXhlbCBjb29yZGluYXRlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsYXRZOiBmdW5jdGlvbihsYXQsIHdvcmxkU2l6ZSkge1xuICAgICAgICB2YXIgeSA9IDE4MCAvIE1hdGguUEkgKiBNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJIC8gNCArIGxhdCAqIE1hdGguUEkgLyAzNjApKTtcbiAgICAgICAgcmV0dXJuICgxODAgLSB5KSAqICh3b3JsZFNpemUgfHwgdGhpcy53b3JsZFNpemUpIC8gMzYwO1xuICAgIH0sXG5cbiAgICB4TG5nOiBmdW5jdGlvbih4LCB3b3JsZFNpemUpIHtcbiAgICAgICAgcmV0dXJuIHggKiAzNjAgLyAod29ybGRTaXplIHx8IHRoaXMud29ybGRTaXplKSAtIDE4MDtcbiAgICB9LFxuICAgIHlMYXQ6IGZ1bmN0aW9uKHksIHdvcmxkU2l6ZSkge1xuICAgICAgICB2YXIgeTIgPSAxODAgLSB5ICogMzYwIC8gKHdvcmxkU2l6ZSB8fCB0aGlzLndvcmxkU2l6ZSk7XG4gICAgICAgIHJldHVybiAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTA7XG4gICAgfSxcblxuICAgIHBhbkJ5OiBmdW5jdGlvbihvZmZzZXQpIHtcbiAgICAgICAgdmFyIHBvaW50ID0gdGhpcy5jZW50ZXJQb2ludC5fYWRkKG9mZnNldCk7XG4gICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy5wb2ludExvY2F0aW9uKHBvaW50KTtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgfSxcblxuICAgIHNldExvY2F0aW9uQXRQb2ludDogZnVuY3Rpb24obGF0bG5nLCBwb2ludCkge1xuICAgICAgICB2YXIgYyA9IHRoaXMubG9jYXRpb25Db29yZGluYXRlKGxhdGxuZyk7XG4gICAgICAgIHZhciBjb29yZEF0UG9pbnQgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShwb2ludCk7XG4gICAgICAgIHZhciBjb29yZENlbnRlciA9IHRoaXMucG9pbnRDb29yZGluYXRlKHRoaXMuY2VudGVyUG9pbnQpO1xuXG4gICAgICAgIHZhciB0cmFuc2xhdGUgPSBjb29yZEF0UG9pbnQuX3N1YihjKTtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLmNvb3JkaW5hdGVMb2NhdGlvbihjb29yZENlbnRlci5fc3ViKHRyYW5zbGF0ZSkpO1xuXG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgIH0sXG5cbiAgICBzZXRab29tQXJvdW5kOiBmdW5jdGlvbih6b29tLCBjZW50ZXIpIHtcbiAgICAgICAgdmFyIHAgPSB0aGlzLmxvY2F0aW9uUG9pbnQoY2VudGVyKTtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICAgICAgdGhpcy5zZXRMb2NhdGlvbkF0UG9pbnQoY2VudGVyLCBwKTtcbiAgICB9LFxuXG4gICAgc2V0QmVhcmluZ0Fyb3VuZDogZnVuY3Rpb24oYmVhcmluZywgY2VudGVyKSB7XG4gICAgICAgIHZhciBwID0gdGhpcy5sb2NhdGlvblBvaW50KGNlbnRlcik7XG4gICAgICAgIHRoaXMuYmVhcmluZyA9IGJlYXJpbmc7XG4gICAgICAgIHRoaXMuc2V0TG9jYXRpb25BdFBvaW50KGNlbnRlciwgcCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgbG9jYXRpb24sIHJldHVybiB0aGUgc2NyZWVuIHBvaW50IHRoYXQgY29ycmVzcG9uZHMgdG8gaXRcbiAgICAgKiBAcGFyYW0ge0xhdExuZ30gbGF0bG5nIGxvY2F0aW9uXG4gICAgICogQHJldHVybnMge1BvaW50fSBzY3JlZW4gcG9pbnRcbiAgICAgKi9cbiAgICBsb2NhdGlvblBvaW50OiBmdW5jdGlvbihsYXRsbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZVBvaW50KHRoaXMubG9jYXRpb25Db29yZGluYXRlKGxhdGxuZykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBvaW50IG9uIHNjcmVlbiwgcmV0dXJuIGl0cyBsYXRsbmdcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHNjcmVlbiBwb2ludFxuICAgICAqIEByZXR1cm5zIHtMYXRMbmd9IGxhdGxuZyBsb2NhdGlvblxuICAgICAqL1xuICAgIHBvaW50TG9jYXRpb246IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHApKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBnZW9ncmFwaGljYWwgbGF0bG5nLCByZXR1cm4gYW4gdW5yb3VuZGVkXG4gICAgICogY29vcmRpbmF0ZSB0aGF0IHJlcHJlc2VudHMgaXQgYXQgdGhpcyB0cmFuc2Zvcm0ncyB6b29tIGxldmVsIGFuZFxuICAgICAqIHdvcmxkc2l6ZS5cbiAgICAgKiBAcGFyYW0ge0xhdExuZ30gbGF0bG5nXG4gICAgICogQHJldHVybnMge0Nvb3JkaW5hdGV9XG4gICAgICovXG4gICAgbG9jYXRpb25Db29yZGluYXRlOiBmdW5jdGlvbihsYXRsbmcpIHtcbiAgICAgICAgdmFyIGsgPSB0aGlzLnpvb21TY2FsZSh0aGlzLnRpbGVab29tKSAvIHRoaXMud29ybGRTaXplO1xuICAgICAgICByZXR1cm4gbmV3IENvb3JkaW5hdGUoXG4gICAgICAgICAgICB0aGlzLmxuZ1gobGF0bG5nLmxuZykgKiBrLFxuICAgICAgICAgICAgdGhpcy5sYXRZKGxhdGxuZy5sYXQpICogayxcbiAgICAgICAgICAgIHRoaXMudGlsZVpvb20pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIENvb3JkaW5hdGUsIHJldHVybiBpdHMgZ2VvZ3JhcGhpY2FsIHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nfSBsYXRsbmdcbiAgICAgKi9cbiAgICBjb29yZGluYXRlTG9jYXRpb246IGZ1bmN0aW9uKGNvb3JkKSB7XG4gICAgICAgIHZhciB3b3JsZFNpemUgPSB0aGlzLnpvb21TY2FsZShjb29yZC56b29tKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXRMbmcoXG4gICAgICAgICAgICB0aGlzLnlMYXQoY29vcmQucm93LCB3b3JsZFNpemUpLFxuICAgICAgICAgICAgdGhpcy54TG5nKGNvb3JkLmNvbHVtbiwgd29ybGRTaXplKSk7XG4gICAgfSxcblxuICAgIHBvaW50Q29vcmRpbmF0ZTogZnVuY3Rpb24ocCwgdGFyZ2V0Wikge1xuXG4gICAgICAgIGlmICh0YXJnZXRaID09PSB1bmRlZmluZWQpIHRhcmdldFogPSAwO1xuXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLmNvb3JkaW5hdGVQb2ludE1hdHJpeCh0aGlzLnRpbGVab29tKTtcbiAgICAgICAgdmFyIGludmVydGVkID0gbWF0NC5pbnZlcnQobmV3IEZsb2F0NjRBcnJheSgxNiksIG1hdHJpeCk7XG5cbiAgICAgICAgaWYgKCFpbnZlcnRlZCkgdGhyb3cgXCJmYWlsZWQgdG8gaW52ZXJ0IG1hdHJpeFwiO1xuXG4gICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGNvcnJlY3QgcHJvamVjdGVkIHogdmFsdWUgZm9yIHRoZSBwb2ludCxcbiAgICAgICAgLy8gdW5wcm9qZWN0IHR3byBwb2ludHMgdG8gZ2V0IGEgbGluZSBhbmQgdGhlbiBmaW5kIHRoZSBwb2ludCBvbiB0aGF0XG4gICAgICAgIC8vIGxpbmUgd2l0aCB6PTBcblxuICAgICAgICB2YXIgY29vcmQwID0gdmVjNC50cmFuc2Zvcm1NYXQ0KFtdLCBbcC54LCBwLnksIDAsIDFdLCBpbnZlcnRlZCk7XG4gICAgICAgIHZhciBjb29yZDEgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtwLngsIHAueSwgMSwgMV0sIGludmVydGVkKTtcblxuICAgICAgICB2YXIgdzAgPSBjb29yZDBbM107XG4gICAgICAgIHZhciB3MSA9IGNvb3JkMVszXTtcbiAgICAgICAgdmFyIHgwID0gY29vcmQwWzBdIC8gdzA7XG4gICAgICAgIHZhciB4MSA9IGNvb3JkMVswXSAvIHcxO1xuICAgICAgICB2YXIgeTAgPSBjb29yZDBbMV0gLyB3MDtcbiAgICAgICAgdmFyIHkxID0gY29vcmQxWzFdIC8gdzE7XG4gICAgICAgIHZhciB6MCA9IGNvb3JkMFsyXSAvIHcwO1xuICAgICAgICB2YXIgejEgPSBjb29yZDFbMl0gLyB3MTtcblxuXG4gICAgICAgIHZhciB0ID0gejAgPT09IHoxID8gMCA6ICh0YXJnZXRaIC0gejApIC8gKHoxIC0gejApO1xuXG4gICAgICAgIHJldHVybiBuZXcgQ29vcmRpbmF0ZShcbiAgICAgICAgICAgIGludGVycCh4MCwgeDEsIHQpLFxuICAgICAgICAgICAgaW50ZXJwKHkwLCB5MSwgdCksXG4gICAgICAgICAgICB0aGlzLnRpbGVab29tKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBjb29yZGluYXRlLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0XG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gc2NyZWVuIHBvaW50XG4gICAgICovXG4gICAgY29vcmRpbmF0ZVBvaW50OiBmdW5jdGlvbihjb29yZCkge1xuICAgICAgICB2YXIgbWF0cml4ID0gdGhpcy5jb29yZGluYXRlUG9pbnRNYXRyaXgoY29vcmQuem9vbSk7XG4gICAgICAgIHZhciBwID0gdmVjNC50cmFuc2Zvcm1NYXQ0KFtdLCBbY29vcmQuY29sdW1uLCBjb29yZC5yb3csIDAsIDFdLCBtYXRyaXgpO1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHBbMF0gLyBwWzNdLCBwWzFdIC8gcFszXSk7XG4gICAgfSxcblxuICAgIGNvb3JkaW5hdGVQb2ludE1hdHJpeDogZnVuY3Rpb24oeikge1xuICAgICAgICB2YXIgcHJvaiA9IHRoaXMuZ2V0UHJvak1hdHJpeCgpO1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLndvcmxkU2l6ZSAvIHRoaXMuem9vbVNjYWxlKHopO1xuICAgICAgICBtYXQ0LnNjYWxlKHByb2osIHByb2osIFtzY2FsZSwgc2NhbGUsIDFdKTtcbiAgICAgICAgbWF0NC5tdWx0aXBseShwcm9qLCB0aGlzLmdldFBpeGVsTWF0cml4KCksIHByb2opO1xuICAgICAgICByZXR1cm4gcHJvajtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY29udmVydHMgZ2wgY29vcmRpbmF0ZXMgLTEuLjEgdG8gcGl4ZWxzIDAuLndpZHRoXG4gICAgICogQHJldHVybnMge09iamVjdH0gbWF0cml4XG4gICAgICovXG4gICAgZ2V0UGl4ZWxNYXRyaXg6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbSA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgW3RoaXMud2lkdGggLyAyLCAtdGhpcy5oZWlnaHQgLyAyLCAxXSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFsxLCAtMSwgMF0pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9LFxuXG4gICAgX2NvbnN0cmFpbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5jZW50ZXIpIHJldHVybjtcblxuICAgICAgICB2YXIgbWluWSwgbWF4WSwgbWluWCwgbWF4WCwgc3ksIHN4LCB4MiwgeTIsXG4gICAgICAgICAgICBzaXplID0gdGhpcy5zaXplO1xuXG4gICAgICAgIGlmICh0aGlzLmxhdFJhbmdlKSB7XG4gICAgICAgICAgICBtaW5ZID0gdGhpcy5sYXRZKHRoaXMubGF0UmFuZ2VbMV0pO1xuICAgICAgICAgICAgbWF4WSA9IHRoaXMubGF0WSh0aGlzLmxhdFJhbmdlWzBdKTtcbiAgICAgICAgICAgIHN5ID0gbWF4WSAtIG1pblkgPCBzaXplLnkgPyBzaXplLnkgLyAobWF4WSAtIG1pblkpIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxuZ1JhbmdlKSB7XG4gICAgICAgICAgICBtaW5YID0gdGhpcy5sbmdYKHRoaXMubG5nUmFuZ2VbMF0pO1xuICAgICAgICAgICAgbWF4WCA9IHRoaXMubG5nWCh0aGlzLmxuZ1JhbmdlWzFdKTtcbiAgICAgICAgICAgIHN4ID0gbWF4WCAtIG1pblggPCBzaXplLnggPyBzaXplLnggLyAobWF4WCAtIG1pblgpIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhvdyBtdWNoIHRoZSBtYXAgc2hvdWxkIHNjYWxlIHRvIGZpdCB0aGUgc2NyZWVuIGludG8gZ2l2ZW4gbGF0aXR1ZGUvbG9uZ2l0dWRlIHJhbmdlc1xuICAgICAgICB2YXIgcyA9IE1hdGgubWF4KHN4IHx8IDAsIHN5IHx8IDApO1xuXG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMudW5wcm9qZWN0KG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICBzeCA/IChtYXhYICsgbWluWCkgLyAyIDogdGhpcy54LFxuICAgICAgICAgICAgICAgIHN5ID8gKG1heFkgKyBtaW5ZKSAvIDIgOiB0aGlzLnkpKTtcbiAgICAgICAgICAgIHRoaXMuem9vbSArPSB0aGlzLnNjYWxlWm9vbShzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhdFJhbmdlKSB7XG4gICAgICAgICAgICB2YXIgeSA9IHRoaXMueSxcbiAgICAgICAgICAgICAgICBoMiA9IHNpemUueSAvIDI7XG5cbiAgICAgICAgICAgIGlmICh5IC0gaDIgPCBtaW5ZKSB5MiA9IG1pblkgKyBoMjtcbiAgICAgICAgICAgIGlmICh5ICsgaDIgPiBtYXhZKSB5MiA9IG1heFkgLSBoMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxuZ1JhbmdlKSB7XG4gICAgICAgICAgICB2YXIgeCA9IHRoaXMueCxcbiAgICAgICAgICAgICAgICB3MiA9IHNpemUueCAvIDI7XG5cbiAgICAgICAgICAgIGlmICh4IC0gdzIgPCBtaW5YKSB4MiA9IG1pblggKyB3MjtcbiAgICAgICAgICAgIGlmICh4ICsgdzIgPiBtYXhYKSB4MiA9IG1heFggLSB3MjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhbiB0aGUgbWFwIGlmIHRoZSBzY3JlZW4gZ29lcyBvZmYgdGhlIHJhbmdlXG4gICAgICAgIGlmICh4MiAhPT0gdW5kZWZpbmVkIHx8IHkyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy51bnByb2plY3QobmV3IFBvaW50KFxuICAgICAgICAgICAgICAgIHgyICE9PSB1bmRlZmluZWQgPyB4MiA6IHRoaXMueCxcbiAgICAgICAgICAgICAgICB5MiAhPT0gdW5kZWZpbmVkID8geTIgOiB0aGlzLnkpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRQcm9qTWF0cml4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG0gPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIgcG9pbnQgdG8gdGhlIGNlbnRlciB0b3AgaW4gYWx0aXR1ZGUgdW5pdHMgdXNpbmcgbGF3IG9mIHNpbmVzLlxuICAgICAgICB2YXIgaGFsZkZvdiA9IE1hdGguYXRhbigwLjUgLyB0aGlzLmFsdGl0dWRlKTtcbiAgICAgICAgdmFyIHRvcEhhbGZTdXJmYWNlRGlzdGFuY2UgPSBNYXRoLnNpbihoYWxmRm92KSAqIHRoaXMuYWx0aXR1ZGUgLyBNYXRoLnNpbihNYXRoLlBJIC8gMiAtIHRoaXMuX3BpdGNoIC0gaGFsZkZvdik7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB6IHZhbHVlIG9mIHRoZSBmYXJ0aGVzdCBmcmFnbWVudCB0aGF0IHNob3VsZCBiZSByZW5kZXJlZC5cbiAgICAgICAgdmFyIGZhclogPSBNYXRoLmNvcyhNYXRoLlBJIC8gMiAtIHRoaXMuX3BpdGNoKSAqIHRvcEhhbGZTdXJmYWNlRGlzdGFuY2UgKyB0aGlzLmFsdGl0dWRlO1xuXG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUobSwgMiAqIE1hdGguYXRhbigodGhpcy5oZWlnaHQgLyAyKSAvIHRoaXMuYWx0aXR1ZGUpLCB0aGlzLndpZHRoIC8gdGhpcy5oZWlnaHQsIDAuMSwgZmFyWik7XG5cbiAgICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWzAsIDAsIC10aGlzLmFsdGl0dWRlXSk7XG5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlIHJvdGF0ZVgsIHogdmFsdWVzIGFyZSBpbiBwaXhlbCB1bml0cy4gQ29udmVydCB0aGVtIHRvXG4gICAgICAgIC8vIGFsdGl0dWRlIHVuaXRlcy4gMSBhbHRpdHVkZSB1bml0ID0gdGhlIHNjcmVlbiBoZWlnaHQuXG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzEsIC0xLCAxIC8gdGhpcy5oZWlnaHRdKTtcblxuICAgICAgICBtYXQ0LnJvdGF0ZVgobSwgbSwgdGhpcy5fcGl0Y2gpO1xuICAgICAgICBtYXQ0LnJvdGF0ZVoobSwgbSwgdGhpcy5hbmdsZSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFstdGhpcy54LCAtdGhpcy55LCAwXSk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIEZvbnQgZGF0YSBGcm9tIEhlcnNoZXkgU2ltcGxleCBGb250XG4vLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvZGF0YWZvcm1hdHMvaGVyc2hleS9cbnZhciBzaW1wbGV4Rm9udCA9IHtcbiAgICBcIiBcIjogWzE2LCBbXV0sXG4gICAgXCIhXCI6IFsxMCwgWzUsIDIxLCA1LCA3LCAtMSwgLTEsIDUsIDIsIDQsIDEsIDUsIDAsIDYsIDEsIDUsIDJdXSxcbiAgICBcIlxcXCJcIjogWzE2LCBbNCwgMjEsIDQsIDE0LCAtMSwgLTEsIDEyLCAyMSwgMTIsIDE0XV0sXG4gICAgXCIjXCI6IFsyMSwgWzExLCAyNSwgNCwgLTcsIC0xLCAtMSwgMTcsIDI1LCAxMCwgLTcsIC0xLCAtMSwgNCwgMTIsIDE4LCAxMiwgLTEsIC0xLCAzLCA2LCAxNywgNl1dLFxuICAgIFwiJFwiOiBbMjAsIFs4LCAyNSwgOCwgLTQsIC0xLCAtMSwgMTIsIDI1LCAxMiwgLTQsIC0xLCAtMSwgMTcsIDE4LCAxNSwgMjAsIDEyLCAyMSwgOCwgMjEsIDUsIDIwLCAzLCAxOCwgMywgMTYsIDQsIDE0LCA1LCAxMywgNywgMTIsIDEzLCAxMCwgMTUsIDksIDE2LCA4LCAxNywgNiwgMTcsIDMsIDE1LCAxLCAxMiwgMCwgOCwgMCwgNSwgMSwgMywgM11dLFxuICAgIFwiJVwiOiBbMjQsIFsyMSwgMjEsIDMsIDAsIC0xLCAtMSwgOCwgMjEsIDEwLCAxOSwgMTAsIDE3LCA5LCAxNSwgNywgMTQsIDUsIDE0LCAzLCAxNiwgMywgMTgsIDQsIDIwLCA2LCAyMSwgOCwgMjEsIDEwLCAyMCwgMTMsIDE5LCAxNiwgMTksIDE5LCAyMCwgMjEsIDIxLCAtMSwgLTEsIDE3LCA3LCAxNSwgNiwgMTQsIDQsIDE0LCAyLCAxNiwgMCwgMTgsIDAsIDIwLCAxLCAyMSwgMywgMjEsIDUsIDE5LCA3LCAxNywgN11dLFxuICAgIFwiJlwiOiBbMjYsIFsyMywgMTIsIDIzLCAxMywgMjIsIDE0LCAyMSwgMTQsIDIwLCAxMywgMTksIDExLCAxNywgNiwgMTUsIDMsIDEzLCAxLCAxMSwgMCwgNywgMCwgNSwgMSwgNCwgMiwgMywgNCwgMywgNiwgNCwgOCwgNSwgOSwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNiwgMTQsIDE4LCAxMywgMjAsIDExLCAyMSwgOSwgMjAsIDgsIDE4LCA4LCAxNiwgOSwgMTMsIDExLCAxMCwgMTYsIDMsIDE4LCAxLCAyMCwgMCwgMjIsIDAsIDIzLCAxLCAyMywgMl1dLFxuICAgIFwiJ1wiOiBbMTAsIFs1LCAxOSwgNCwgMjAsIDUsIDIxLCA2LCAyMCwgNiwgMTgsIDUsIDE2LCA0LCAxNV1dLFxuICAgIFwiKFwiOiBbMTQsIFsxMSwgMjUsIDksIDIzLCA3LCAyMCwgNSwgMTYsIDQsIDExLCA0LCA3LCA1LCAyLCA3LCAtMiwgOSwgLTUsIDExLCAtN11dLFxuICAgIFwiKVwiOiBbMTQsIFszLCAyNSwgNSwgMjMsIDcsIDIwLCA5LCAxNiwgMTAsIDExLCAxMCwgNywgOSwgMiwgNywgLTIsIDUsIC01LCAzLCAtN11dLFxuICAgIFwiKlwiOiBbMTYsIFs4LCAyMSwgOCwgOSwgLTEsIC0xLCAzLCAxOCwgMTMsIDEyLCAtMSwgLTEsIDEzLCAxOCwgMywgMTJdXSxcbiAgICBcIitcIjogWzI2LCBbMTMsIDE4LCAxMywgMCwgLTEsIC0xLCA0LCA5LCAyMiwgOV1dLFxuICAgIFwiLFwiOiBbMTAsIFs2LCAxLCA1LCAwLCA0LCAxLCA1LCAyLCA2LCAxLCA2LCAtMSwgNSwgLTMsIDQsIC00XV0sXG4gICAgXCItXCI6IFsyNiwgWzQsIDksIDIyLCA5XV0sXG4gICAgXCIuXCI6IFsxMCwgWzUsIDIsIDQsIDEsIDUsIDAsIDYsIDEsIDUsIDJdXSxcbiAgICBcIi9cIjogWzIyLCBbMjAsIDI1LCAyLCAtN11dLFxuICAgIFwiMFwiOiBbMjAsIFs5LCAyMSwgNiwgMjAsIDQsIDE3LCAzLCAxMiwgMywgOSwgNCwgNCwgNiwgMSwgOSwgMCwgMTEsIDAsIDE0LCAxLCAxNiwgNCwgMTcsIDksIDE3LCAxMiwgMTYsIDE3LCAxNCwgMjAsIDExLCAyMSwgOSwgMjFdXSxcbiAgICBcIjFcIjogWzIwLCBbNiwgMTcsIDgsIDE4LCAxMSwgMjEsIDExLCAwXV0sXG4gICAgXCIyXCI6IFsyMCwgWzQsIDE2LCA0LCAxNywgNSwgMTksIDYsIDIwLCA4LCAyMSwgMTIsIDIxLCAxNCwgMjAsIDE1LCAxOSwgMTYsIDE3LCAxNiwgMTUsIDE1LCAxMywgMTMsIDEwLCAzLCAwLCAxNywgMF1dLFxuICAgIFwiM1wiOiBbMjAsIFs1LCAyMSwgMTYsIDIxLCAxMCwgMTMsIDEzLCAxMywgMTUsIDEyLCAxNiwgMTEsIDE3LCA4LCAxNywgNiwgMTYsIDMsIDE0LCAxLCAxMSwgMCwgOCwgMCwgNSwgMSwgNCwgMiwgMywgNF1dLFxuICAgIFwiNFwiOiBbMjAsIFsxMywgMjEsIDMsIDcsIDE4LCA3LCAtMSwgLTEsIDEzLCAyMSwgMTMsIDBdXSxcbiAgICBcIjVcIjogWzIwLCBbMTUsIDIxLCA1LCAyMSwgNCwgMTIsIDUsIDEzLCA4LCAxNCwgMTEsIDE0LCAxNCwgMTMsIDE2LCAxMSwgMTcsIDgsIDE3LCA2LCAxNiwgMywgMTQsIDEsIDExLCAwLCA4LCAwLCA1LCAxLCA0LCAyLCAzLCA0XV0sXG4gICAgXCI2XCI6IFsyMCwgWzE2LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDEwLCAyMSwgNywgMjAsIDUsIDE3LCA0LCAxMiwgNCwgNywgNSwgMywgNywgMSwgMTAsIDAsIDExLCAwLCAxNCwgMSwgMTYsIDMsIDE3LCA2LCAxNywgNywgMTYsIDEwLCAxNCwgMTIsIDExLCAxMywgMTAsIDEzLCA3LCAxMiwgNSwgMTAsIDQsIDddXSxcbiAgICBcIjdcIjogWzIwLCBbMTcsIDIxLCA3LCAwLCAtMSwgLTEsIDMsIDIxLCAxNywgMjFdXSxcbiAgICBcIjhcIjogWzIwLCBbOCwgMjEsIDUsIDIwLCA0LCAxOCwgNCwgMTYsIDUsIDE0LCA3LCAxMywgMTEsIDEyLCAxNCwgMTEsIDE2LCA5LCAxNywgNywgMTcsIDQsIDE2LCAyLCAxNSwgMSwgMTIsIDAsIDgsIDAsIDUsIDEsIDQsIDIsIDMsIDQsIDMsIDcsIDQsIDksIDYsIDExLCA5LCAxMiwgMTMsIDEzLCAxNSwgMTQsIDE2LCAxNiwgMTYsIDE4LCAxNSwgMjAsIDEyLCAyMSwgOCwgMjFdXSxcbiAgICBcIjlcIjogWzIwLCBbMTYsIDE0LCAxNSwgMTEsIDEzLCA5LCAxMCwgOCwgOSwgOCwgNiwgOSwgNCwgMTEsIDMsIDE0LCAzLCAxNSwgNCwgMTgsIDYsIDIwLCA5LCAyMSwgMTAsIDIxLCAxMywgMjAsIDE1LCAxOCwgMTYsIDE0LCAxNiwgOSwgMTUsIDQsIDEzLCAxLCAxMCwgMCwgOCwgMCwgNSwgMSwgNCwgM11dLFxuICAgIFwiOlwiOiBbMTAsIFs1LCAxNCwgNCwgMTMsIDUsIDEyLCA2LCAxMywgNSwgMTQsIC0xLCAtMSwgNSwgMiwgNCwgMSwgNSwgMCwgNiwgMSwgNSwgMl1dLFxuICAgIFwiO1wiOiBbMTAsIFs1LCAxNCwgNCwgMTMsIDUsIDEyLCA2LCAxMywgNSwgMTQsIC0xLCAtMSwgNiwgMSwgNSwgMCwgNCwgMSwgNSwgMiwgNiwgMSwgNiwgLTEsIDUsIC0zLCA0LCAtNF1dLFxuICAgIFwiPFwiOiBbMjQsIFsyMCwgMTgsIDQsIDksIDIwLCAwXV0sXG4gICAgXCI9XCI6IFsyNiwgWzQsIDEyLCAyMiwgMTIsIC0xLCAtMSwgNCwgNiwgMjIsIDZdXSxcbiAgICBcIj5cIjogWzI0LCBbNCwgMTgsIDIwLCA5LCA0LCAwXV0sXG4gICAgXCI/XCI6IFsxOCwgWzMsIDE2LCAzLCAxNywgNCwgMTksIDUsIDIwLCA3LCAyMSwgMTEsIDIxLCAxMywgMjAsIDE0LCAxOSwgMTUsIDE3LCAxNSwgMTUsIDE0LCAxMywgMTMsIDEyLCA5LCAxMCwgOSwgNywgLTEsIC0xLCA5LCAyLCA4LCAxLCA5LCAwLCAxMCwgMSwgOSwgMl1dLFxuICAgIFwiQFwiOiBbMjcsIFsxOCwgMTMsIDE3LCAxNSwgMTUsIDE2LCAxMiwgMTYsIDEwLCAxNSwgOSwgMTQsIDgsIDExLCA4LCA4LCA5LCA2LCAxMSwgNSwgMTQsIDUsIDE2LCA2LCAxNywgOCwgLTEsIC0xLCAxMiwgMTYsIDEwLCAxNCwgOSwgMTEsIDksIDgsIDEwLCA2LCAxMSwgNSwgLTEsIC0xLCAxOCwgMTYsIDE3LCA4LCAxNywgNiwgMTksIDUsIDIxLCA1LCAyMywgNywgMjQsIDEwLCAyNCwgMTIsIDIzLCAxNSwgMjIsIDE3LCAyMCwgMTksIDE4LCAyMCwgMTUsIDIxLCAxMiwgMjEsIDksIDIwLCA3LCAxOSwgNSwgMTcsIDQsIDE1LCAzLCAxMiwgMywgOSwgNCwgNiwgNSwgNCwgNywgMiwgOSwgMSwgMTIsIDAsIDE1LCAwLCAxOCwgMSwgMjAsIDIsIDIxLCAzLCAtMSwgLTEsIDE5LCAxNiwgMTgsIDgsIDE4LCA2LCAxOSwgNV1dLFxuICAgIFwiQVwiOiBbMTgsIFs5LCAyMSwgMSwgMCwgLTEsIC0xLCA5LCAyMSwgMTcsIDAsIC0xLCAtMSwgNCwgNywgMTQsIDddXSxcbiAgICBcIkJcIjogWzIxLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDEzLCAyMSwgMTYsIDIwLCAxNywgMTksIDE4LCAxNywgMTgsIDE1LCAxNywgMTMsIDE2LCAxMiwgMTMsIDExLCAtMSwgLTEsIDQsIDExLCAxMywgMTEsIDE2LCAxMCwgMTcsIDksIDE4LCA3LCAxOCwgNCwgMTcsIDIsIDE2LCAxLCAxMywgMCwgNCwgMF1dLFxuICAgIFwiQ1wiOiBbMjEsIFsxOCwgMTYsIDE3LCAxOCwgMTUsIDIwLCAxMywgMjEsIDksIDIxLCA3LCAyMCwgNSwgMTgsIDQsIDE2LCAzLCAxMywgMywgOCwgNCwgNSwgNSwgMywgNywgMSwgOSwgMCwgMTMsIDAsIDE1LCAxLCAxNywgMywgMTgsIDVdXSxcbiAgICBcIkRcIjogWzIxLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDExLCAyMSwgMTQsIDIwLCAxNiwgMTgsIDE3LCAxNiwgMTgsIDEzLCAxOCwgOCwgMTcsIDUsIDE2LCAzLCAxNCwgMSwgMTEsIDAsIDQsIDBdXSxcbiAgICBcIkVcIjogWzE5LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDE3LCAyMSwgLTEsIC0xLCA0LCAxMSwgMTIsIDExLCAtMSwgLTEsIDQsIDAsIDE3LCAwXV0sXG4gICAgXCJGXCI6IFsxOCwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxNywgMjEsIC0xLCAtMSwgNCwgMTEsIDEyLCAxMV1dLFxuICAgIFwiR1wiOiBbMjEsIFsxOCwgMTYsIDE3LCAxOCwgMTUsIDIwLCAxMywgMjEsIDksIDIxLCA3LCAyMCwgNSwgMTgsIDQsIDE2LCAzLCAxMywgMywgOCwgNCwgNSwgNSwgMywgNywgMSwgOSwgMCwgMTMsIDAsIDE1LCAxLCAxNywgMywgMTgsIDUsIDE4LCA4LCAtMSwgLTEsIDEzLCA4LCAxOCwgOF1dLFxuICAgIFwiSFwiOiBbMjIsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCAxOCwgMjEsIDE4LCAwLCAtMSwgLTEsIDQsIDExLCAxOCwgMTFdXSxcbiAgICBcIklcIjogWzgsIFs0LCAyMSwgNCwgMF1dLFxuICAgIFwiSlwiOiBbMTYsIFsxMiwgMjEsIDEyLCA1LCAxMSwgMiwgMTAsIDEsIDgsIDAsIDYsIDAsIDQsIDEsIDMsIDIsIDIsIDUsIDIsIDddXSxcbiAgICBcIktcIjogWzIxLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTgsIDIxLCA0LCA3LCAtMSwgLTEsIDksIDEyLCAxOCwgMF1dLFxuICAgIFwiTFwiOiBbMTcsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAwLCAxNiwgMF1dLFxuICAgIFwiTVwiOiBbMjQsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTIsIDAsIC0xLCAtMSwgMjAsIDIxLCAxMiwgMCwgLTEsIC0xLCAyMCwgMjEsIDIwLCAwXV0sXG4gICAgXCJOXCI6IFsyMiwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxOCwgMCwgLTEsIC0xLCAxOCwgMjEsIDE4LCAwXV0sXG4gICAgXCJPXCI6IFsyMiwgWzksIDIxLCA3LCAyMCwgNSwgMTgsIDQsIDE2LCAzLCAxMywgMywgOCwgNCwgNSwgNSwgMywgNywgMSwgOSwgMCwgMTMsIDAsIDE1LCAxLCAxNywgMywgMTgsIDUsIDE5LCA4LCAxOSwgMTMsIDE4LCAxNiwgMTcsIDE4LCAxNSwgMjAsIDEzLCAyMSwgOSwgMjFdXSxcbiAgICBcIlBcIjogWzIxLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDEzLCAyMSwgMTYsIDIwLCAxNywgMTksIDE4LCAxNywgMTgsIDE0LCAxNywgMTIsIDE2LCAxMSwgMTMsIDEwLCA0LCAxMF1dLFxuICAgIFwiUVwiOiBbMjIsIFs5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOSwgOCwgMTksIDEzLCAxOCwgMTYsIDE3LCAxOCwgMTUsIDIwLCAxMywgMjEsIDksIDIxLCAtMSwgLTEsIDEyLCA0LCAxOCwgLTJdXSxcbiAgICBcIlJcIjogWzIxLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDEzLCAyMSwgMTYsIDIwLCAxNywgMTksIDE4LCAxNywgMTgsIDE1LCAxNywgMTMsIDE2LCAxMiwgMTMsIDExLCA0LCAxMSwgLTEsIC0xLCAxMSwgMTEsIDE4LCAwXV0sXG4gICAgXCJTXCI6IFsyMCwgWzE3LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxLCA1LCAyMCwgMywgMTgsIDMsIDE2LCA0LCAxNCwgNSwgMTMsIDcsIDEyLCAxMywgMTAsIDE1LCA5LCAxNiwgOCwgMTcsIDYsIDE3LCAzLCAxNSwgMSwgMTIsIDAsIDgsIDAsIDUsIDEsIDMsIDNdXSxcbiAgICBcIlRcIjogWzE2LCBbOCwgMjEsIDgsIDAsIC0xLCAtMSwgMSwgMjEsIDE1LCAyMV1dLFxuICAgIFwiVVwiOiBbMjIsIFs0LCAyMSwgNCwgNiwgNSwgMywgNywgMSwgMTAsIDAsIDEyLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA2LCAxOCwgMjFdXSxcbiAgICBcIlZcIjogWzE4LCBbMSwgMjEsIDksIDAsIC0xLCAtMSwgMTcsIDIxLCA5LCAwXV0sXG4gICAgXCJXXCI6IFsyNCwgWzIsIDIxLCA3LCAwLCAtMSwgLTEsIDEyLCAyMSwgNywgMCwgLTEsIC0xLCAxMiwgMjEsIDE3LCAwLCAtMSwgLTEsIDIyLCAyMSwgMTcsIDBdXSxcbiAgICBcIlhcIjogWzIwLCBbMywgMjEsIDE3LCAwLCAtMSwgLTEsIDE3LCAyMSwgMywgMF1dLFxuICAgIFwiWVwiOiBbMTgsIFsxLCAyMSwgOSwgMTEsIDksIDAsIC0xLCAtMSwgMTcsIDIxLCA5LCAxMV1dLFxuICAgIFwiWlwiOiBbMjAsIFsxNywgMjEsIDMsIDAsIC0xLCAtMSwgMywgMjEsIDE3LCAyMSwgLTEsIC0xLCAzLCAwLCAxNywgMF1dLFxuICAgIFwiW1wiOiBbMTQsIFs0LCAyNSwgNCwgLTcsIC0xLCAtMSwgNSwgMjUsIDUsIC03LCAtMSwgLTEsIDQsIDI1LCAxMSwgMjUsIC0xLCAtMSwgNCwgLTcsIDExLCAtN11dLFxuICAgIFwiXFxcXFwiOiBbMTQsIFswLCAyMSwgMTQsIC0zXV0sXG4gICAgXCJdXCI6IFsxNCwgWzksIDI1LCA5LCAtNywgLTEsIC0xLCAxMCwgMjUsIDEwLCAtNywgLTEsIC0xLCAzLCAyNSwgMTAsIDI1LCAtMSwgLTEsIDMsIC03LCAxMCwgLTddXSxcbiAgICBcIl5cIjogWzE2LCBbNiwgMTUsIDgsIDE4LCAxMCwgMTUsIC0xLCAtMSwgMywgMTIsIDgsIDE3LCAxMywgMTIsIC0xLCAtMSwgOCwgMTcsIDgsIDBdXSxcbiAgICBcIl9cIjogWzE2LCBbMCwgLTIsIDE2LCAtMl1dLFxuICAgIFwiYFwiOiBbMTAsIFs2LCAyMSwgNSwgMjAsIDQsIDE4LCA0LCAxNiwgNSwgMTUsIDYsIDE2LCA1LCAxN11dLFxuICAgIFwiYVwiOiBbMTksIFsxNSwgMTQsIDE1LCAwLCAtMSwgLTEsIDE1LCAxMSwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDNdXSxcbiAgICBcImJcIjogWzE5LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMTEsIDYsIDEzLCA4LCAxNCwgMTEsIDE0LCAxMywgMTMsIDE1LCAxMSwgMTYsIDgsIDE2LCA2LCAxNSwgMywgMTMsIDEsIDExLCAwLCA4LCAwLCA2LCAxLCA0LCAzXV0sXG4gICAgXCJjXCI6IFsxOCwgWzE1LCAxMSwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDNdXSxcbiAgICBcImRcIjogWzE5LCBbMTUsIDIxLCAxNSwgMCwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJlXCI6IFsxOCwgWzMsIDgsIDE1LCA4LCAxNSwgMTAsIDE0LCAxMiwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDNdXSxcbiAgICBcImZcIjogWzEyLCBbMTAsIDIxLCA4LCAyMSwgNiwgMjAsIDUsIDE3LCA1LCAwLCAtMSwgLTEsIDIsIDE0LCA5LCAxNF1dLFxuICAgIFwiZ1wiOiBbMTksIFsxNSwgMTQsIDE1LCAtMiwgMTQsIC01LCAxMywgLTYsIDExLCAtNywgOCwgLTcsIDYsIC02LCAtMSwgLTEsIDE1LCAxMSwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDNdXSxcbiAgICBcImhcIjogWzE5LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDBdXSxcbiAgICBcImlcIjogWzgsIFszLCAyMSwgNCwgMjAsIDUsIDIxLCA0LCAyMiwgMywgMjEsIC0xLCAtMSwgNCwgMTQsIDQsIDBdXSxcbiAgICBcImpcIjogWzEwLCBbNSwgMjEsIDYsIDIwLCA3LCAyMSwgNiwgMjIsIDUsIDIxLCAtMSwgLTEsIDYsIDE0LCA2LCAtMywgNSwgLTYsIDMsIC03LCAxLCAtN11dLFxuICAgIFwia1wiOiBbMTcsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCAxNCwgMTQsIDQsIDQsIC0xLCAtMSwgOCwgOCwgMTUsIDBdXSxcbiAgICBcImxcIjogWzgsIFs0LCAyMSwgNCwgMF1dLFxuICAgIFwibVwiOiBbMzAsIFs0LCAxNCwgNCwgMCwgLTEsIC0xLCA0LCAxMCwgNywgMTMsIDksIDE0LCAxMiwgMTQsIDE0LCAxMywgMTUsIDEwLCAxNSwgMCwgLTEsIC0xLCAxNSwgMTAsIDE4LCAxMywgMjAsIDE0LCAyMywgMTQsIDI1LCAxMywgMjYsIDEwLCAyNiwgMF1dLFxuICAgIFwiblwiOiBbMTksIFs0LCAxNCwgNCwgMCwgLTEsIC0xLCA0LCAxMCwgNywgMTMsIDksIDE0LCAxMiwgMTQsIDE0LCAxMywgMTUsIDEwLCAxNSwgMF1dLFxuICAgIFwib1wiOiBbMTksIFs4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzLCAxNiwgNiwgMTYsIDgsIDE1LCAxMSwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0XV0sXG4gICAgXCJwXCI6IFsxOSwgWzQsIDE0LCA0LCAtNywgLTEsIC0xLCA0LCAxMSwgNiwgMTMsIDgsIDE0LCAxMSwgMTQsIDEzLCAxMywgMTUsIDExLCAxNiwgOCwgMTYsIDYsIDE1LCAzLCAxMywgMSwgMTEsIDAsIDgsIDAsIDYsIDEsIDQsIDNdXSxcbiAgICBcInFcIjogWzE5LCBbMTUsIDE0LCAxNSwgLTcsIC0xLCAtMSwgMTUsIDExLCAxMywgMTMsIDExLCAxNCwgOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgM11dLFxuICAgIFwiclwiOiBbMTMsIFs0LCAxNCwgNCwgMCwgLTEsIC0xLCA0LCA4LCA1LCAxMSwgNywgMTMsIDksIDE0LCAxMiwgMTRdXSxcbiAgICBcInNcIjogWzE3LCBbMTQsIDExLCAxMywgMTMsIDEwLCAxNCwgNywgMTQsIDQsIDEzLCAzLCAxMSwgNCwgOSwgNiwgOCwgMTEsIDcsIDEzLCA2LCAxNCwgNCwgMTQsIDMsIDEzLCAxLCAxMCwgMCwgNywgMCwgNCwgMSwgMywgM11dLFxuICAgIFwidFwiOiBbMTIsIFs1LCAyMSwgNSwgNCwgNiwgMSwgOCwgMCwgMTAsIDAsIC0xLCAtMSwgMiwgMTQsIDksIDE0XV0sXG4gICAgXCJ1XCI6IFsxOSwgWzQsIDE0LCA0LCA0LCA1LCAxLCA3LCAwLCAxMCwgMCwgMTIsIDEsIDE1LCA0LCAtMSwgLTEsIDE1LCAxNCwgMTUsIDBdXSxcbiAgICBcInZcIjogWzE2LCBbMiwgMTQsIDgsIDAsIC0xLCAtMSwgMTQsIDE0LCA4LCAwXV0sXG4gICAgXCJ3XCI6IFsyMiwgWzMsIDE0LCA3LCAwLCAtMSwgLTEsIDExLCAxNCwgNywgMCwgLTEsIC0xLCAxMSwgMTQsIDE1LCAwLCAtMSwgLTEsIDE5LCAxNCwgMTUsIDBdXSxcbiAgICBcInhcIjogWzE3LCBbMywgMTQsIDE0LCAwLCAtMSwgLTEsIDE0LCAxNCwgMywgMF1dLFxuICAgIFwieVwiOiBbMTYsIFsyLCAxNCwgOCwgMCwgLTEsIC0xLCAxNCwgMTQsIDgsIDAsIDYsIC00LCA0LCAtNiwgMiwgLTcsIDEsIC03XV0sXG4gICAgXCJ6XCI6IFsxNywgWzE0LCAxNCwgMywgMCwgLTEsIC0xLCAzLCAxNCwgMTQsIDE0LCAtMSwgLTEsIDMsIDAsIDE0LCAwXV0sXG4gICAgXCJ7XCI6IFsxNCwgWzksIDI1LCA3LCAyNCwgNiwgMjMsIDUsIDIxLCA1LCAxOSwgNiwgMTcsIDcsIDE2LCA4LCAxNCwgOCwgMTIsIDYsIDEwLCAtMSwgLTEsIDcsIDI0LCA2LCAyMiwgNiwgMjAsIDcsIDE4LCA4LCAxNywgOSwgMTUsIDksIDEzLCA4LCAxMSwgNCwgOSwgOCwgNywgOSwgNSwgOSwgMywgOCwgMSwgNywgMCwgNiwgLTIsIDYsIC00LCA3LCAtNiwgLTEsIC0xLCA2LCA4LCA4LCA2LCA4LCA0LCA3LCAyLCA2LCAxLCA1LCAtMSwgNSwgLTMsIDYsIC01LCA3LCAtNiwgOSwgLTddXSxcbiAgICBcInxcIjogWzgsIFs0LCAyNSwgNCwgLTddXSxcbiAgICBcIn1cIjogWzE0LCBbNSwgMjUsIDcsIDI0LCA4LCAyMywgOSwgMjEsIDksIDE5LCA4LCAxNywgNywgMTYsIDYsIDE0LCA2LCAxMiwgOCwgMTAsIC0xLCAtMSwgNywgMjQsIDgsIDIyLCA4LCAyMCwgNywgMTgsIDYsIDE3LCA1LCAxNSwgNSwgMTMsIDYsIDExLCAxMCwgOSwgNiwgNywgNSwgNSwgNSwgMywgNiwgMSwgNywgMCwgOCwgLTIsIDgsIC00LCA3LCAtNiwgLTEsIC0xLCA4LCA4LCA2LCA2LCA2LCA0LCA3LCAyLCA4LCAxLCA5LCAtMSwgOSwgLTMsIDgsIC01LCA3LCAtNiwgNSwgLTddXSxcbiAgICBcIn5cIjogWzI0LCBbMywgNiwgMywgOCwgNCwgMTEsIDYsIDEyLCA4LCAxMiwgMTAsIDExLCAxNCwgOCwgMTYsIDcsIDE4LCA3LCAyMCwgOCwgMjEsIDEwLCAtMSwgLTEsIDMsIDgsIDQsIDEwLCA2LCAxMSwgOCwgMTEsIDEwLCAxMCwgMTQsIDcsIDE2LCA2LCAxOCwgNiwgMjAsIDcsIDIxLCAxMCwgMjEsIDEyXV1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdGV4dFZlcnRpY2VzKHRleHQsIGxlZnQsIGJhc2VsaW5lLCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMTtcblxuICAgIHZhciBzdHJva2VzID0gW10sXG4gICAgICAgIGksIGxlbiwgaiwgbGVuMiwgZ2x5cGgsIHgsIHksIHByZXY7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSB0ZXh0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGdseXBoID0gc2ltcGxleEZvbnRbdGV4dFtpXV07XG4gICAgICAgIGlmICghZ2x5cGgpIGNvbnRpbnVlO1xuICAgICAgICBwcmV2ID0gbnVsbDtcblxuICAgICAgICBmb3IgKGogPSAwLCBsZW4yID0gZ2x5cGhbMV0ubGVuZ3RoOyBqIDwgbGVuMjsgaiArPSAyKSB7XG4gICAgICAgICAgICBpZiAoZ2x5cGhbMV1bal0gPT09IC0xICYmIGdseXBoWzFdW2ogKyAxXSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwcmV2ID0gbnVsbDtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB4ID0gbGVmdCArIGdseXBoWzFdW2pdICogc2NhbGU7XG4gICAgICAgICAgICAgICAgeSA9IGJhc2VsaW5lIC0gZ2x5cGhbMV1baiArIDFdICogc2NhbGU7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlcy5wdXNoKHByZXYueCwgcHJldi55LCB4LCB5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldiA9IHt4OiB4LCB5OiB5fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZWZ0ICs9IGdseXBoWzBdICogc2NhbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cm9rZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWF0MyA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpLm1hdDM7XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd0JhY2tncm91bmQ7XG5cbmZ1bmN0aW9uIGRyYXdCYWNrZ3JvdW5kKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuICAgIHZhciBjb2xvciA9IGxheWVyLnBhaW50WydiYWNrZ3JvdW5kLWNvbG9yJ107XG4gICAgdmFyIGltYWdlID0gbGF5ZXIucGFpbnRbJ2JhY2tncm91bmQtaW1hZ2UnXTtcbiAgICB2YXIgb3BhY2l0eSA9IGxheWVyLnBhaW50WydiYWNrZ3JvdW5kLW9wYWNpdHknXTtcbiAgICB2YXIgc2hhZGVyO1xuXG4gICAgdmFyIGltYWdlUG9zQSA9IGltYWdlID8gcGFpbnRlci5zcHJpdGVBdGxhcy5nZXRQb3NpdGlvbihpbWFnZS5mcm9tLCB0cnVlKSA6IG51bGw7XG4gICAgdmFyIGltYWdlUG9zQiA9IGltYWdlID8gcGFpbnRlci5zcHJpdGVBdGxhcy5nZXRQb3NpdGlvbihpbWFnZS50bywgdHJ1ZSkgOiBudWxsO1xuXG4gICAgaWYgKGltYWdlUG9zQSAmJiBpbWFnZVBvc0IpIHtcbiAgICAgICAgLy8gRHJhdyB0ZXh0dXJlIGZpbGxcbiAgICAgICAgc2hhZGVyID0gcGFpbnRlci5wYXR0ZXJuU2hhZGVyO1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIoc2hhZGVyLCBwb3NNYXRyaXgpO1xuICAgICAgICBnbC51bmlmb3JtMWkoc2hhZGVyLnVfaW1hZ2UsIDApO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5fdGxfYSwgaW1hZ2VQb3NBLnRsKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX2JyX2EsIGltYWdlUG9zQS5icik7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl90bF9iLCBpbWFnZVBvc0IudGwpO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5fYnJfYiwgaW1hZ2VQb3NCLmJyKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X29wYWNpdHksIG9wYWNpdHkpO1xuXG4gICAgICAgIHZhciB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICAgICAgdmFyIHNpemVBID0gaW1hZ2VQb3NBLnNpemU7XG4gICAgICAgIHZhciBzaXplQiA9IGltYWdlUG9zQi5zaXplO1xuICAgICAgICB2YXIgY2VudGVyID0gdHJhbnNmb3JtLmxvY2F0aW9uQ29vcmRpbmF0ZSh0cmFuc2Zvcm0uY2VudGVyKTtcbiAgICAgICAgdmFyIHNjYWxlID0gMSAvIE1hdGgucG93KDIsIHRyYW5zZm9ybS56b29tRnJhY3Rpb24pO1xuXG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9taXgsIGltYWdlLnQpO1xuXG4gICAgICAgIHZhciBtYXRyaXhBID0gbWF0My5jcmVhdGUoKTtcbiAgICAgICAgbWF0My5zY2FsZShtYXRyaXhBLCBtYXRyaXhBLCBbXG4gICAgICAgICAgICAxIC8gKHNpemVBWzBdICogaW1hZ2UuZnJvbVNjYWxlKSxcbiAgICAgICAgICAgIDEgLyAoc2l6ZUFbMV0gKiBpbWFnZS5mcm9tU2NhbGUpXG4gICAgICAgIF0pO1xuICAgICAgICBtYXQzLnRyYW5zbGF0ZShtYXRyaXhBLCBtYXRyaXhBLCBbXG4gICAgICAgICAgICAoY2VudGVyLmNvbHVtbiAqIHRyYW5zZm9ybS50aWxlU2l6ZSkgJSAoc2l6ZUFbMF0gKiBpbWFnZS5mcm9tU2NhbGUpLFxuICAgICAgICAgICAgKGNlbnRlci5yb3cgICAgKiB0cmFuc2Zvcm0udGlsZVNpemUpICUgKHNpemVBWzFdICogaW1hZ2UuZnJvbVNjYWxlKVxuICAgICAgICBdKTtcbiAgICAgICAgbWF0My5yb3RhdGUobWF0cml4QSwgbWF0cml4QSwgLXRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgIG1hdDMuc2NhbGUobWF0cml4QSwgbWF0cml4QSwgW1xuICAgICAgICAgICAgc2NhbGUgKiB0cmFuc2Zvcm0ud2lkdGggIC8gMixcbiAgICAgICAgICAgLXNjYWxlICogdHJhbnNmb3JtLmhlaWdodCAvIDJcbiAgICAgICAgXSk7XG5cbiAgICAgICAgdmFyIG1hdHJpeEIgPSBtYXQzLmNyZWF0ZSgpO1xuICAgICAgICBtYXQzLnNjYWxlKG1hdHJpeEIsIG1hdHJpeEIsIFtcbiAgICAgICAgICAgIDEgLyAoc2l6ZUJbMF0gKiBpbWFnZS50b1NjYWxlKSxcbiAgICAgICAgICAgIDEgLyAoc2l6ZUJbMV0gKiBpbWFnZS50b1NjYWxlKVxuICAgICAgICBdKTtcbiAgICAgICAgbWF0My50cmFuc2xhdGUobWF0cml4QiwgbWF0cml4QiwgW1xuICAgICAgICAgICAgKGNlbnRlci5jb2x1bW4gKiB0cmFuc2Zvcm0udGlsZVNpemUpICUgKHNpemVCWzBdICogaW1hZ2UudG9TY2FsZSksXG4gICAgICAgICAgICAoY2VudGVyLnJvdyAgICAqIHRyYW5zZm9ybS50aWxlU2l6ZSkgJSAoc2l6ZUJbMV0gKiBpbWFnZS50b1NjYWxlKVxuICAgICAgICBdKTtcbiAgICAgICAgbWF0My5yb3RhdGUobWF0cml4QiwgbWF0cml4QiwgLXRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgIG1hdDMuc2NhbGUobWF0cml4QiwgbWF0cml4QiwgW1xuICAgICAgICAgICAgc2NhbGUgKiB0cmFuc2Zvcm0ud2lkdGggIC8gMixcbiAgICAgICAgICAgLXNjYWxlICogdHJhbnNmb3JtLmhlaWdodCAvIDJcbiAgICAgICAgXSk7XG5cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihzaGFkZXIudV9wYXR0ZXJubWF0cml4X2EsIGZhbHNlLCBtYXRyaXhBKTtcbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihzaGFkZXIudV9wYXR0ZXJubWF0cml4X2IsIGZhbHNlLCBtYXRyaXhCKTtcblxuICAgICAgICBwYWludGVyLnNwcml0ZUF0bGFzLmJpbmQoZ2wsIHRydWUpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRHJhdyBmaWxsaW5nIHJlY3RhbmdsZS5cbiAgICAgICAgc2hhZGVyID0gcGFpbnRlci5maWxsU2hhZGVyO1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIoc2hhZGVyLCBwb3NNYXRyaXgpO1xuICAgICAgICBnbC51bmlmb3JtNGZ2KHNoYWRlci51X2NvbG9yLCBjb2xvcik7XG4gICAgfVxuXG4gICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwYWludGVyLmJhY2tncm91bmRCdWZmZXIpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoc2hhZGVyLmFfcG9zLCBwYWludGVyLmJhY2tncm91bmRCdWZmZXIuaXRlbVNpemUsIGdsLlNIT1JULCBmYWxzZSwgMCwgMCk7XG4gICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgcGFpbnRlci5iYWNrZ3JvdW5kQnVmZmVyLml0ZW1Db3VudCk7XG4gICAgZ2wuZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7XG5cbiAgICBnbC5zdGVuY2lsTWFzaygweDAwKTtcbiAgICBnbC5zdGVuY2lsRnVuYyhnbC5FUVVBTCwgMHg4MCwgMHg4MCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd1BsYWNlbWVudERlYnVnO1xuXG5mdW5jdGlvbiBkcmF3UGxhY2VtZW50RGVidWcocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCwgdGlsZSkge1xuXG4gICAgdmFyIGVsZW1lbnRHcm91cHMgPSB0aWxlLmVsZW1lbnRHcm91cHNbbGF5ZXIucmVmIHx8IGxheWVyLmlkXS5jb2xsaXNpb25Cb3g7XG4gICAgaWYgKCFlbGVtZW50R3JvdXBzKSByZXR1cm47XG5cbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuICAgIHZhciBidWZmZXIgPSB0aWxlLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4O1xuICAgIHZhciBzaGFkZXIgPSBwYWludGVyLmNvbGxpc2lvbkJveFNoYWRlcjtcblxuICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgZ2wuc3dpdGNoU2hhZGVyKHNoYWRlciwgcG9zTWF0cml4KTtcbiAgICBidWZmZXIuYmluZChnbCwgc2hhZGVyKTtcbiAgICBnbC5saW5lV2lkdGgoMyk7XG5cbiAgICB2YXIgc3RyaWRlID0gMTI7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9wb3MsIDIsIGdsLlNIT1JULCBmYWxzZSwgc3RyaWRlLCAwKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX2V4dHJ1ZGUsIDIsIGdsLlNIT1JULCBmYWxzZSwgc3RyaWRlLCA0KTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX2RhdGEsIDIsIGdsLlVOU0lHTkVEX0JZVEUsIGZhbHNlLCBzdHJpZGUsIDgpO1xuXG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3NjYWxlLCBNYXRoLnBvdygyLCBwYWludGVyLnRyYW5zZm9ybS56b29tIC0gdGlsZS5jb29yZC56KSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3pvb20sIHBhaW50ZXIudHJhbnNmb3JtLnpvb20gKiAxMCk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X21heHpvb20sICh0aWxlLmNvb3JkLnogKyAxKSAqIDEwKTtcblxuICAgIHZhciBiZWdpbiA9IGVsZW1lbnRHcm91cHMuZ3JvdXBzWzBdLnZlcnRleFN0YXJ0SW5kZXg7XG4gICAgdmFyIGxlbiA9IGVsZW1lbnRHcm91cHMuZ3JvdXBzWzBdLnZlcnRleExlbmd0aDtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLkxJTkVTLCBiZWdpbiwgbGVuKTtcblxuICAgIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRleHRWZXJ0aWNlcyA9IHJlcXVpcmUoJy4uL2xpYi9kZWJ1Z3RleHQnKTtcbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd0RlYnVnO1xuXG5mdW5jdGlvbiBkcmF3RGVidWcocGFpbnRlciwgdGlsZSkge1xuICAgIHZhciBnbCA9IHBhaW50ZXIuZ2w7XG5cbiAgICAvLyBCbGVuZCB0byB0aGUgZnJvbnQsIG5vdCB0aGUgYmFjay5cbiAgICBnbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcblxuICAgIGdsLnN3aXRjaFNoYWRlcihwYWludGVyLmRlYnVnU2hhZGVyLCB0aWxlLnBvc01hdHJpeCk7XG5cbiAgICAvLyBkcmF3IGJvdW5kaW5nIHJlY3RhbmdsZVxuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwYWludGVyLmRlYnVnQnVmZmVyKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHBhaW50ZXIuZGVidWdTaGFkZXIuYV9wb3MsIHBhaW50ZXIuZGVidWdCdWZmZXIuaXRlbVNpemUsIGdsLlNIT1JULCBmYWxzZSwgMCwgMCk7XG4gICAgZ2wudW5pZm9ybTRmKHBhaW50ZXIuZGVidWdTaGFkZXIudV9jb2xvciwgMSwgMCwgMCwgMSk7XG4gICAgZ2wubGluZVdpZHRoKDQpO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuTElORV9TVFJJUCwgMCwgcGFpbnRlci5kZWJ1Z0J1ZmZlci5pdGVtQ291bnQpO1xuXG4gICAgdmFyIHZlcnRpY2VzID0gdGV4dFZlcnRpY2VzKHRpbGUuY29vcmQudG9TdHJpbmcoKSwgNTAsIDIwMCwgNSk7XG5cbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcGFpbnRlci5kZWJ1Z1RleHRCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgSW50MTZBcnJheSh2ZXJ0aWNlcyksIGdsLlNUUkVBTV9EUkFXKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHBhaW50ZXIuZGVidWdTaGFkZXIuYV9wb3MsIHBhaW50ZXIuZGVidWdUZXh0QnVmZmVyLml0ZW1TaXplLCBnbC5TSE9SVCwgZmFsc2UsIDAsIDApO1xuICAgIGdsLmxpbmVXaWR0aCg4ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICBnbC51bmlmb3JtNGYocGFpbnRlci5kZWJ1Z1NoYWRlci51X2NvbG9yLCAxLCAxLCAxLCAxKTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLkxJTkVTLCAwLCB2ZXJ0aWNlcy5sZW5ndGggLyBwYWludGVyLmRlYnVnVGV4dEJ1ZmZlci5pdGVtU2l6ZSk7XG4gICAgZ2wubGluZVdpZHRoKDIgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8pO1xuICAgIGdsLnVuaWZvcm00ZihwYWludGVyLmRlYnVnU2hhZGVyLnVfY29sb3IsIDAsIDAsIDAsIDEpO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuTElORVMsIDAsIHZlcnRpY2VzLmxlbmd0aCAvIHBhaW50ZXIuZGVidWdUZXh0QnVmZmVyLml0ZW1TaXplKTtcblxuICAgIC8vIFJldmVydCBibGVuZGluZyBtb2RlIHRvIGJsZW5kIHRvIHRoZSBiYWNrLlxuICAgIGdsLmJsZW5kRnVuYyhnbC5PTkVfTUlOVVNfRFNUX0FMUEhBLCBnbC5PTkUpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xudmFyIG1hdDMgPSByZXF1aXJlKCdnbC1tYXRyaXgnKS5tYXQzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdGaWxsO1xuXG5mdW5jdGlvbiBkcmF3RmlsbChwYWludGVyLCBsYXllciwgcG9zTWF0cml4LCB0aWxlKSB7XG4gICAgLy8gTm8gZGF0YVxuICAgIGlmICghdGlsZS5idWZmZXJzKSByZXR1cm47XG4gICAgdmFyIGVsZW1lbnRHcm91cHMgPSB0aWxlLmVsZW1lbnRHcm91cHNbbGF5ZXIucmVmIHx8IGxheWVyLmlkXTtcbiAgICBpZiAoIWVsZW1lbnRHcm91cHMpIHJldHVybjtcblxuICAgIHZhciBnbCA9IHBhaW50ZXIuZ2w7XG4gICAgdmFyIHRyYW5zbGF0ZWRQb3NNYXRyaXggPSBwYWludGVyLnRyYW5zbGF0ZU1hdHJpeChwb3NNYXRyaXgsIHRpbGUsIGxheWVyLnBhaW50WydmaWxsLXRyYW5zbGF0ZSddLCBsYXllci5wYWludFsnZmlsbC10cmFuc2xhdGUtYW5jaG9yJ10pO1xuXG4gICAgdmFyIGNvbG9yID0gbGF5ZXIucGFpbnRbJ2ZpbGwtY29sb3InXTtcblxuICAgIHZhciB2ZXJ0ZXgsIGVsZW1lbnRzLCBncm91cCwgY291bnQ7XG5cbiAgICAvLyBEcmF3IHRoZSBzdGVuY2lsIG1hc2suXG5cbiAgICAvLyBXZSdyZSBvbmx5IGRyYXdpbmcgdG8gdGhlIGZpcnN0IHNldmVuIGJpdHMgKD09IHN1cHBvcnQgYSBtYXhpbXVtIG9mXG4gICAgLy8gMTI3IG92ZXJsYXBwaW5nIHBvbHlnb25zIGluIG9uZSBwbGFjZSBiZWZvcmUgd2UgZ2V0IHJlbmRlcmluZyBlcnJvcnMpLlxuICAgIGdsLnN0ZW5jaWxNYXNrKDB4M0YpO1xuICAgIGdsLmNsZWFyKGdsLlNURU5DSUxfQlVGRkVSX0JJVCk7XG5cbiAgICAvLyBEcmF3IGZyb250IGZhY2luZyB0cmlhbmdsZXMuIFdoZXJldmVyIHRoZSAweDgwIGJpdCBpcyAxLCB3ZSBhcmVcbiAgICAvLyBpbmNyZWFzaW5nIHRoZSBsb3dlciA3IGJpdHMgYnkgb25lIGlmIHRoZSB0cmlhbmdsZSBpcyBhIGZyb250LWZhY2luZ1xuICAgIC8vIHRyaWFuZ2xlLiBUaGlzIG1lYW5zIHRoYXQgYWxsIHZpc2libGUgcG9seWdvbnMgc2hvdWxkIGJlIGluIENDV1xuICAgIC8vIG9yaWVudGF0aW9uLCB3aGlsZSBhbGwgaG9sZXMgKHNlZSBiZWxvdykgYXJlIGluIENXIG9yaWVudGF0aW9uLlxuICAgIGdsLnN0ZW5jaWxGdW5jKGdsLk5PVEVRVUFMLCAweDgwLCAweDgwKTtcblxuICAgIC8vIFdoZW4gd2UgZG8gYSBub256ZXJvIGZpbGwsIHdlIGNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgYSBwaXhlbCBpc1xuICAgIC8vIGNvdmVyZWQgYnkgYSBjb3VudGVyY2xvY2t3aXNlIHBvbHlnb24sIGFuZCBzdWJ0cmFjdCB0aGUgbnVtYmVyIG9mXG4gICAgLy8gdGltZXMgaXQgaXMgXCJ1bmNvdmVyZWRcIiBieSBhIGNsb2Nrd2lzZSBwb2x5Z29uLlxuICAgIGdsLnN0ZW5jaWxPcFNlcGFyYXRlKGdsLkZST05ULCBnbC5JTkNSX1dSQVAsIGdsLktFRVAsIGdsLktFRVApO1xuICAgIGdsLnN0ZW5jaWxPcFNlcGFyYXRlKGdsLkJBQ0ssIGdsLkRFQ1JfV1JBUCwgZ2wuS0VFUCwgZ2wuS0VFUCk7XG5cbiAgICAvLyBXaGVuIGRyYXdpbmcgYSBzaGFwZSwgd2UgZmlyc3QgZHJhdyBhbGwgc2hhcGVzIHRvIHRoZSBzdGVuY2lsIGJ1ZmZlclxuICAgIC8vIGFuZCBpbmNyZW1lbnRpbmcgYWxsIGFyZWFzIHdoZXJlIHBvbHlnb25zIGFyZVxuICAgIGdsLmNvbG9yTWFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICAvLyBEcmF3IHRoZSBhY3R1YWwgdHJpYW5nbGUgZmFuIGludG8gdGhlIHN0ZW5jaWwgYnVmZmVyLlxuICAgIGdsLnN3aXRjaFNoYWRlcihwYWludGVyLmZpbGxTaGFkZXIsIHRyYW5zbGF0ZWRQb3NNYXRyaXgpO1xuXG4gICAgLy8gRHJhdyBhbGwgYnVmZmVyc1xuICAgIHZlcnRleCA9IHRpbGUuYnVmZmVycy5maWxsVmVydGV4O1xuICAgIHZlcnRleC5iaW5kKGdsKTtcbiAgICBlbGVtZW50cyA9IHRpbGUuYnVmZmVycy5maWxsRWxlbWVudDtcbiAgICBlbGVtZW50cy5iaW5kKGdsKTtcblxuICAgIHZhciBvZmZzZXQsIGVsZW1lbnRPZmZzZXQ7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRHcm91cHMuZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGdyb3VwID0gZWxlbWVudEdyb3Vwcy5ncm91cHNbaV07XG4gICAgICAgIG9mZnNldCA9IGdyb3VwLnZlcnRleFN0YXJ0SW5kZXggKiB2ZXJ0ZXguaXRlbVNpemU7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIocGFpbnRlci5maWxsU2hhZGVyLmFfcG9zLCAyLCBnbC5TSE9SVCwgZmFsc2UsIDQsIG9mZnNldCArIDApO1xuXG4gICAgICAgIGNvdW50ID0gZ3JvdXAuZWxlbWVudExlbmd0aCAqIDM7XG4gICAgICAgIGVsZW1lbnRPZmZzZXQgPSBncm91cC5lbGVtZW50U3RhcnRJbmRleCAqIGVsZW1lbnRzLml0ZW1TaXplO1xuICAgICAgICBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCBjb3VudCwgZ2wuVU5TSUdORURfU0hPUlQsIGVsZW1lbnRPZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHN0ZW5jaWwgbWFzayBpbiB0aGUgc3RlbmNpbCBidWZmZXIsIHdlIGNhbiBzdGFydFxuICAgIC8vIHdyaXRpbmcgdG8gdGhlIGNvbG9yIGJ1ZmZlci5cbiAgICBnbC5jb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG5cbiAgICAvLyBGcm9tIG5vdyBvbiwgd2UgZG9uJ3Qgd2FudCB0byB1cGRhdGUgdGhlIHN0ZW5jaWwgYnVmZmVyIGFueW1vcmUuXG4gICAgZ2wuc3RlbmNpbE9wKGdsLktFRVAsIGdsLktFRVAsIGdsLktFRVApO1xuICAgIGdsLnN0ZW5jaWxNYXNrKDB4MCk7XG5cbiAgICB2YXIgc3Ryb2tlQ29sb3IgPSBsYXllci5wYWludFsnZmlsbC1vdXRsaW5lLWNvbG9yJ107XG5cbiAgICAvLyBCZWNhdXNlIHdlJ3JlIGRyYXdpbmcgdG9wLXRvLWJvdHRvbSwgYW5kIHdlIHVwZGF0ZSB0aGUgc3RlbmNpbCBtYXNrXG4gICAgLy8gYmVsb3csIHdlIGhhdmUgdG8gZHJhdyB0aGUgb3V0bGluZSBmaXJzdCAoISlcbiAgICBpZiAobGF5ZXIucGFpbnRbJ2ZpbGwtYW50aWFsaWFzJ10gPT09IHRydWUgJiYgIShsYXllci5wYWludFsnZmlsbC1pbWFnZSddICYmICFzdHJva2VDb2xvcikpIHtcbiAgICAgICAgZ2wuc3dpdGNoU2hhZGVyKHBhaW50ZXIub3V0bGluZVNoYWRlciwgdHJhbnNsYXRlZFBvc01hdHJpeCk7XG4gICAgICAgIGdsLmxpbmVXaWR0aCgyICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKTtcblxuICAgICAgICBpZiAoc3Ryb2tlQ29sb3IpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGRlZmluZWQgYSBkaWZmZXJlbnQgY29sb3IgZm9yIHRoZSBmaWxsIG91dGxpbmUsIHdlIGFyZVxuICAgICAgICAgICAgLy8gZ29pbmcgdG8gaWdub3JlIHRoZSBiaXRzIGluIDB4M0YgYW5kIGp1c3QgY2FyZSBhYm91dCB0aGUgZ2xvYmFsXG4gICAgICAgICAgICAvLyBjbGlwcGluZyBtYXNrLlxuICAgICAgICAgICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuRVFVQUwsIDB4ODAsIDB4ODApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBvbmx5IHdhbnQgdG8gZHJhdyB0aGUgYW50aWFsaWFzZWQgcGFydHMgdGhhdCBhcmVcbiAgICAgICAgICAgIC8vICpvdXRzaWRlKiB0aGUgY3VycmVudCBzaGFwZS4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gY2FzZSB0aGUgZmlsbFxuICAgICAgICAgICAgLy8gb3Igc3Ryb2tlIGNvbG9yIGlzIHRyYW5zbHVjZW50LiBJZiB3ZSB3b3VsZG4ndCBjbGlwIHRvIG91dHNpZGVcbiAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHNoYXBlLCBzb21lIHBpeGVscyBmcm9tIHRoZSBvdXRsaW5lIHN0cm9rZSBvdmVybGFwcGVkXG4gICAgICAgICAgICAvLyB0aGUgKG5vbi1hbnRpYWxpYXNlZCkgZmlsbC5cbiAgICAgICAgICAgIGdsLnN0ZW5jaWxGdW5jKGdsLkVRVUFMLCAweDgwLCAweEJGKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdsLnVuaWZvcm0yZihwYWludGVyLm91dGxpbmVTaGFkZXIudV93b3JsZCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0KTtcbiAgICAgICAgZ2wudW5pZm9ybTRmdihwYWludGVyLm91dGxpbmVTaGFkZXIudV9jb2xvciwgc3Ryb2tlQ29sb3IgPyBzdHJva2VDb2xvciA6IGNvbG9yKTtcblxuICAgICAgICAvLyBEcmF3IGFsbCBidWZmZXJzXG4gICAgICAgIHZlcnRleCA9IHRpbGUuYnVmZmVycy5maWxsVmVydGV4O1xuICAgICAgICBlbGVtZW50cyA9IHRpbGUuYnVmZmVycy5vdXRsaW5lRWxlbWVudDtcbiAgICAgICAgZWxlbWVudHMuYmluZChnbCk7XG5cbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBlbGVtZW50R3JvdXBzLmdyb3Vwcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1trXTtcbiAgICAgICAgICAgIG9mZnNldCA9IGdyb3VwLnZlcnRleFN0YXJ0SW5kZXggKiB2ZXJ0ZXguaXRlbVNpemU7XG4gICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHBhaW50ZXIub3V0bGluZVNoYWRlci5hX3BvcywgMiwgZ2wuU0hPUlQsIGZhbHNlLCA0LCBvZmZzZXQgKyAwKTtcblxuICAgICAgICAgICAgY291bnQgPSBncm91cC5zZWNvbmRFbGVtZW50TGVuZ3RoICogMjtcbiAgICAgICAgICAgIGVsZW1lbnRPZmZzZXQgPSBncm91cC5zZWNvbmRFbGVtZW50U3RhcnRJbmRleCAqIGVsZW1lbnRzLml0ZW1TaXplO1xuICAgICAgICAgICAgZ2wuZHJhd0VsZW1lbnRzKGdsLkxJTkVTLCBjb3VudCwgZ2wuVU5TSUdORURfU0hPUlQsIGVsZW1lbnRPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGltYWdlID0gbGF5ZXIucGFpbnRbJ2ZpbGwtaW1hZ2UnXTtcbiAgICB2YXIgb3BhY2l0eSA9IGxheWVyLnBhaW50WydmaWxsLW9wYWNpdHknXSB8fCAxO1xuICAgIHZhciBzaGFkZXI7XG5cbiAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgLy8gRHJhdyB0ZXh0dXJlIGZpbGxcbiAgICAgICAgdmFyIGltYWdlUG9zQSA9IHBhaW50ZXIuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oaW1hZ2UuZnJvbSwgdHJ1ZSk7XG4gICAgICAgIHZhciBpbWFnZVBvc0IgPSBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLnRvLCB0cnVlKTtcbiAgICAgICAgaWYgKCFpbWFnZVBvc0EgfHwgIWltYWdlUG9zQikgcmV0dXJuO1xuXG4gICAgICAgIHNoYWRlciA9IHBhaW50ZXIucGF0dGVyblNoYWRlcjtcbiAgICAgICAgZ2wuc3dpdGNoU2hhZGVyKHNoYWRlciwgcG9zTWF0cml4KTtcbiAgICAgICAgZ2wudW5pZm9ybTFpKHNoYWRlci51X2ltYWdlLCAwKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3RsX2EsIGltYWdlUG9zQS50bCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl9icl9hLCBpbWFnZVBvc0EuYnIpO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5fdGxfYiwgaW1hZ2VQb3NCLnRsKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX2JyX2IsIGltYWdlUG9zQi5icik7XG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9vcGFjaXR5LCBvcGFjaXR5KTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X21peCwgaW1hZ2UudCk7XG5cbiAgICAgICAgdmFyIGZhY3RvciA9ICg0MDk2IC8gdGlsZS50aWxlU2l6ZSkgLyBNYXRoLnBvdygyLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSAtIHRpbGUuY29vcmQueik7XG5cbiAgICAgICAgdmFyIG1hdHJpeEEgPSBtYXQzLmNyZWF0ZSgpO1xuICAgICAgICBtYXQzLnNjYWxlKG1hdHJpeEEsIG1hdHJpeEEsIFtcbiAgICAgICAgICAgIDEgLyAoaW1hZ2VQb3NBLnNpemVbMF0gKiBmYWN0b3IgKiBpbWFnZS5mcm9tU2NhbGUpLFxuICAgICAgICAgICAgMSAvIChpbWFnZVBvc0Euc2l6ZVsxXSAqIGZhY3RvciAqIGltYWdlLmZyb21TY2FsZSlcbiAgICAgICAgXSk7XG5cbiAgICAgICAgdmFyIG1hdHJpeEIgPSBtYXQzLmNyZWF0ZSgpO1xuICAgICAgICBtYXQzLnNjYWxlKG1hdHJpeEIsIG1hdHJpeEIsIFtcbiAgICAgICAgICAgIDEgLyAoaW1hZ2VQb3NCLnNpemVbMF0gKiBmYWN0b3IgKiBpbWFnZS50b1NjYWxlKSxcbiAgICAgICAgICAgIDEgLyAoaW1hZ2VQb3NCLnNpemVbMV0gKiBmYWN0b3IgKiBpbWFnZS50b1NjYWxlKVxuICAgICAgICBdKTtcblxuICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KHNoYWRlci51X3BhdHRlcm5tYXRyaXhfYSwgZmFsc2UsIG1hdHJpeEEpO1xuICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KHNoYWRlci51X3BhdHRlcm5tYXRyaXhfYiwgZmFsc2UsIG1hdHJpeEIpO1xuXG4gICAgICAgIHBhaW50ZXIuc3ByaXRlQXRsYXMuYmluZChnbCwgdHJ1ZSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEcmF3IGZpbGxpbmcgcmVjdGFuZ2xlLlxuICAgICAgICBzaGFkZXIgPSBwYWludGVyLmZpbGxTaGFkZXI7XG4gICAgICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCk7XG4gICAgICAgIGdsLnVuaWZvcm00ZnYoc2hhZGVyLnVfY29sb3IsIGNvbG9yKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGRyYXcgcmVnaW9ucyB0aGF0IHdlIG1hcmtlZFxuICAgIGdsLnN0ZW5jaWxGdW5jKGdsLk5PVEVRVUFMLCAweDAsIDB4M0YpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwYWludGVyLnRpbGVFeHRlbnRCdWZmZXIpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoc2hhZGVyLmFfcG9zLCBwYWludGVyLnRpbGVFeHRlbnRCdWZmZXIuaXRlbVNpemUsIGdsLlNIT1JULCBmYWxzZSwgMCwgMCk7XG4gICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgcGFpbnRlci50aWxlRXh0ZW50QnVmZmVyLml0ZW1Db3VudCk7XG5cbiAgICBnbC5zdGVuY2lsTWFzaygweDAwKTtcbiAgICBnbC5zdGVuY2lsRnVuYyhnbC5FUVVBTCwgMHg4MCwgMHg4MCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgbWF0MiA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpLm1hdDI7XG5cbi8qKlxuICogRHJhdyBhIGxpbmUuIFVuZGVyIHRoZSBob29kIHRoaXMgd2lsbCByZWFkIGVsZW1lbnRzIGZyb21cbiAqIGEgdGlsZSwgZGFzaCB0ZXh0dXJlcyBmcm9tIGEgbGluZUF0bGFzLCBhbmQgc3R5bGUgcHJvcGVydGllcyBmcm9tIGEgbGF5ZXIuXG4gKiBAcGFyYW0ge09iamVjdH0gcGFpbnRlclxuICogQHBhcmFtIHtPYmplY3R9IGxheWVyXG4gKiBAcGFyYW0ge09iamVjdH0gcG9zTWF0cml4XG4gKiBAcGFyYW0ge1RpbGV9IHRpbGVcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9IGRyYXdzIHdpdGggdGhlIHBhaW50ZXJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkcmF3TGluZShwYWludGVyLCBsYXllciwgcG9zTWF0cml4LCB0aWxlKSB7XG4gICAgLy8gTm8gZGF0YVxuICAgIGlmICghdGlsZS5idWZmZXJzKSByZXR1cm47XG4gICAgdmFyIGVsZW1lbnRHcm91cHMgPSB0aWxlLmVsZW1lbnRHcm91cHNbbGF5ZXIucmVmIHx8IGxheWVyLmlkXTtcbiAgICBpZiAoIWVsZW1lbnRHcm91cHMpIHJldHVybjtcblxuICAgIHZhciBnbCA9IHBhaW50ZXIuZ2w7XG5cbiAgICAvLyBkb24ndCBkcmF3IHplcm8td2lkdGggbGluZXNcbiAgICBpZiAobGF5ZXIucGFpbnRbJ2xpbmUtd2lkdGgnXSA8PSAwKSByZXR1cm47XG5cbiAgICAvLyB0aGUgZGlzdGFuY2Ugb3ZlciB3aGljaCB0aGUgbGluZSBlZGdlIGZhZGVzIG91dC5cbiAgICAvLyBSZXRpbmEgZGV2aWNlcyBuZWVkIGEgc21hbGxlciBkaXN0YW5jZSB0byBhdm9pZCBhbGlhc2luZy5cbiAgICB2YXIgYW50aWFsaWFzaW5nID0gMSAvIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbztcblxuICAgIHZhciBibHVyID0gbGF5ZXIucGFpbnRbJ2xpbmUtYmx1ciddICsgYW50aWFsaWFzaW5nO1xuICAgIHZhciBlZGdlV2lkdGggPSBsYXllci5wYWludFsnbGluZS13aWR0aCddIC8gMjtcbiAgICB2YXIgaW5zZXQgPSAtMTtcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICB2YXIgc2hpZnQgPSAwO1xuXG4gICAgaWYgKGxheWVyLnBhaW50WydsaW5lLWdhcC13aWR0aCddID4gMCkge1xuICAgICAgICBpbnNldCA9IGxheWVyLnBhaW50WydsaW5lLWdhcC13aWR0aCddIC8gMiArIGFudGlhbGlhc2luZyAqIDAuNTtcbiAgICAgICAgZWRnZVdpZHRoID0gbGF5ZXIucGFpbnRbJ2xpbmUtd2lkdGgnXTtcblxuICAgICAgICAvLyBzaGlmdCBvdXRlciBsaW5lcyBoYWxmIGEgcGl4ZWwgdG93YXJkcyB0aGUgbWlkZGxlIHRvIGVsaW1pbmF0ZSB0aGUgY3JhY2tcbiAgICAgICAgb2Zmc2V0ID0gaW5zZXQgLSBhbnRpYWxpYXNpbmcgLyAyO1xuICAgIH1cblxuICAgIHZhciBvdXRzZXQgPSBvZmZzZXQgKyBlZGdlV2lkdGggKyBhbnRpYWxpYXNpbmcgLyAyICsgc2hpZnQ7XG5cbiAgICB2YXIgY29sb3IgPSBsYXllci5wYWludFsnbGluZS1jb2xvciddO1xuICAgIHZhciByYXRpbyA9IHBhaW50ZXIudHJhbnNmb3JtLnNjYWxlIC8gKDEgPDwgdGlsZS5jb29yZC56KSAvICg0MDk2IC8gdGlsZS50aWxlU2l6ZSk7XG4gICAgdmFyIHZ0eE1hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlTWF0cml4KHBvc01hdHJpeCwgdGlsZSwgbGF5ZXIucGFpbnRbJ2xpbmUtdHJhbnNsYXRlJ10sIGxheWVyLnBhaW50WydsaW5lLXRyYW5zbGF0ZS1hbmNob3InXSk7XG5cbiAgICB2YXIgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcblxuXG4gICAgdmFyIGFudGlhbGlhc2luZ01hdHJpeCA9IG1hdDIuY3JlYXRlKCk7XG4gICAgbWF0Mi5zY2FsZShhbnRpYWxpYXNpbmdNYXRyaXgsIGFudGlhbGlhc2luZ01hdHJpeCwgWzEsIE1hdGguY29zKHRyLl9waXRjaCldKTtcbiAgICBtYXQyLnJvdGF0ZShhbnRpYWxpYXNpbmdNYXRyaXgsIGFudGlhbGlhc2luZ01hdHJpeCwgcGFpbnRlci50cmFuc2Zvcm0uYW5nbGUpO1xuXG4gICAgLy8gY2FsY3VsYXRlIGhvdyBtdWNoIGxvbmdlciB0aGUgcmVhbCB3b3JsZCBkaXN0YW5jZSBpcyBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW5cbiAgICAvLyB0aGFuIGF0IHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbi5cbiAgICB2YXIgdG9wZWRnZWxlbmd0aCA9IE1hdGguc3FydCh0ci5oZWlnaHQgKiB0ci5oZWlnaHQgLyA0ICAqICgxICsgdHIuYWx0aXR1ZGUgKiB0ci5hbHRpdHVkZSkpO1xuICAgIHZhciB4ID0gdHIuaGVpZ2h0IC8gMiAqIE1hdGgudGFuKHRyLl9waXRjaCk7XG4gICAgdmFyIGV4dHJhID0gKHRvcGVkZ2VsZW5ndGggKyB4KSAvIHRvcGVkZ2VsZW5ndGggLSAxO1xuXG4gICAgLy8gaG93IG11Y2ggdGhlIHRpbGUgaXMgb3ZlcnNjYWxlZCBieVxuICAgIHZhciBvdmVyc2NhbGluZyA9IHRpbGUudGlsZVNpemUgLyBwYWludGVyLnRyYW5zZm9ybS50aWxlU2l6ZTtcblxuICAgIHZhciBzaGFkZXI7XG5cblxuICAgIHZhciBkYXNoYXJyYXkgPSBsYXllci5wYWludFsnbGluZS1kYXNoYXJyYXknXTtcbiAgICB2YXIgaW1hZ2UgPSBsYXllci5wYWludFsnbGluZS1pbWFnZSddO1xuXG4gICAgaWYgKGRhc2hhcnJheSkge1xuXG4gICAgICAgIHNoYWRlciA9IHBhaW50ZXIubGluZXNkZnBhdHRlcm5TaGFkZXI7XG4gICAgICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHZ0eE1hdHJpeCwgdGlsZS5leE1hdHJpeCk7XG5cbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9saW5ld2lkdGgsIFsgb3V0c2V0LCBpbnNldCBdKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3JhdGlvLCByYXRpbyk7XG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9ibHVyLCBibHVyKTtcbiAgICAgICAgZ2wudW5pZm9ybTRmdihzaGFkZXIudV9jb2xvciwgY29sb3IpO1xuXG4gICAgICAgIHZhciBwb3NBID0gcGFpbnRlci5saW5lQXRsYXMuZ2V0RGFzaChkYXNoYXJyYXkuZnJvbSwgbGF5ZXIubGF5b3V0WydsaW5lLWNhcCddID09PSAncm91bmQnKTtcbiAgICAgICAgdmFyIHBvc0IgPSBwYWludGVyLmxpbmVBdGxhcy5nZXREYXNoKGRhc2hhcnJheS50bywgbGF5ZXIubGF5b3V0WydsaW5lLWNhcCddID09PSAncm91bmQnKTtcbiAgICAgICAgcGFpbnRlci5saW5lQXRsYXMuYmluZChnbCk7XG5cbiAgICAgICAgdmFyIHBhdHRlcm5yYXRpbyA9IE1hdGgucG93KDIsIE1hdGguZmxvb3IoTWF0aC5sb2cocGFpbnRlci50cmFuc2Zvcm0uc2NhbGUpIC8gTWF0aC5MTjIpIC0gdGlsZS5jb29yZC56KSAvIDggKiBvdmVyc2NhbGluZztcbiAgICAgICAgdmFyIHNjYWxlQSA9IFtwYXR0ZXJucmF0aW8gLyBwb3NBLndpZHRoIC8gZGFzaGFycmF5LmZyb21TY2FsZSwgLXBvc0EuaGVpZ2h0IC8gMl07XG4gICAgICAgIHZhciBnYW1tYUEgPSBwYWludGVyLmxpbmVBdGxhcy53aWR0aCAvIChkYXNoYXJyYXkuZnJvbVNjYWxlICogcG9zQS53aWR0aCAqIDI1NiAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbykgLyAyO1xuICAgICAgICB2YXIgc2NhbGVCID0gW3BhdHRlcm5yYXRpbyAvIHBvc0Iud2lkdGggLyBkYXNoYXJyYXkudG9TY2FsZSwgLXBvc0IuaGVpZ2h0IC8gMl07XG4gICAgICAgIHZhciBnYW1tYUIgPSBwYWludGVyLmxpbmVBdGxhcy53aWR0aCAvIChkYXNoYXJyYXkudG9TY2FsZSAqIHBvc0Iud2lkdGggKiAyNTYgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8pIC8gMjtcblxuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5zY2FsZV9hLCBzY2FsZUEpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfdGV4X3lfYSwgcG9zQS55KTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuc2NhbGVfYiwgc2NhbGVCKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3RleF95X2IsIHBvc0IueSk7XG5cbiAgICAgICAgZ2wudW5pZm9ybTFpKHNoYWRlci51X2ltYWdlLCAwKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3NkZmdhbW1hLCBNYXRoLm1heChnYW1tYUEsIGdhbW1hQikpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfbWl4LCBkYXNoYXJyYXkudCk7XG5cbiAgICB9IGVsc2UgaWYgKGltYWdlKSB7XG4gICAgICAgIHZhciBpbWFnZVBvc0EgPSBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLmZyb20sIHRydWUpO1xuICAgICAgICB2YXIgaW1hZ2VQb3NCID0gcGFpbnRlci5zcHJpdGVBdGxhcy5nZXRQb3NpdGlvbihpbWFnZS50bywgdHJ1ZSk7XG4gICAgICAgIGlmICghaW1hZ2VQb3NBIHx8ICFpbWFnZVBvc0IpIHJldHVybjtcbiAgICAgICAgdmFyIGZhY3RvciA9IDQwOTYgLyB0aWxlLnRpbGVTaXplIC8gTWF0aC5wb3coMiwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20gLSB0aWxlLmNvb3JkLnopICogb3ZlcnNjYWxpbmc7XG5cbiAgICAgICAgcGFpbnRlci5zcHJpdGVBdGxhcy5iaW5kKGdsLCB0cnVlKTtcblxuICAgICAgICBzaGFkZXIgPSBwYWludGVyLmxpbmVwYXR0ZXJuU2hhZGVyO1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIoc2hhZGVyLCB2dHhNYXRyaXgsIHRpbGUuZXhNYXRyaXgpO1xuXG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfbGluZXdpZHRoLCBbIG91dHNldCwgaW5zZXQgXSk7XG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9yYXRpbywgcmF0aW8pO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfYmx1ciwgYmx1cik7XG5cbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3NpemVfYSwgW2ltYWdlUG9zQS5zaXplWzBdICogZmFjdG9yICogaW1hZ2UuZnJvbVNjYWxlLCBpbWFnZVBvc0Iuc2l6ZVsxXSBdKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3NpemVfYiwgW2ltYWdlUG9zQi5zaXplWzBdICogZmFjdG9yICogaW1hZ2UudG9TY2FsZSwgaW1hZ2VQb3NCLnNpemVbMV0gXSk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl90bF9hLCBpbWFnZVBvc0EudGwpO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5fYnJfYSwgaW1hZ2VQb3NBLmJyKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3RsX2IsIGltYWdlUG9zQi50bCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl9icl9iLCBpbWFnZVBvc0IuYnIpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZmFkZSwgaW1hZ2UudCk7XG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9vcGFjaXR5LCBsYXllci5wYWludFsnbGluZS1vcGFjaXR5J10pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2hhZGVyID0gcGFpbnRlci5saW5lU2hhZGVyO1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIoc2hhZGVyLCB2dHhNYXRyaXgsIHRpbGUuZXhNYXRyaXgpO1xuXG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfbGluZXdpZHRoLCBbIG91dHNldCwgaW5zZXQgXSk7XG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9yYXRpbywgcmF0aW8pO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfYmx1ciwgYmx1cik7XG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9leHRyYSwgZXh0cmEpO1xuICAgICAgICBnbC51bmlmb3JtTWF0cml4MmZ2KHNoYWRlci51X2FudGlhbGlhc2luZ21hdHJpeCwgZmFsc2UsIGFudGlhbGlhc2luZ01hdHJpeCk7XG5cbiAgICAgICAgZ2wudW5pZm9ybTRmdihzaGFkZXIudV9jb2xvciwgY29sb3IpO1xuICAgIH1cblxuICAgIHZhciB2ZXJ0ZXggPSB0aWxlLmJ1ZmZlcnMubGluZVZlcnRleDtcbiAgICB2ZXJ0ZXguYmluZChnbCk7XG4gICAgdmFyIGVsZW1lbnQgPSB0aWxlLmJ1ZmZlcnMubGluZUVsZW1lbnQ7XG4gICAgZWxlbWVudC5iaW5kKGdsKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudEdyb3Vwcy5ncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGdyb3VwID0gZWxlbWVudEdyb3Vwcy5ncm91cHNbaV07XG4gICAgICAgIHZhciB2dHhPZmZzZXQgPSBncm91cC52ZXJ0ZXhTdGFydEluZGV4ICogdmVydGV4Lml0ZW1TaXplO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX3BvcywgMiwgZ2wuU0hPUlQsIGZhbHNlLCA4LCB2dHhPZmZzZXQgKyAwKTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9kYXRhLCA0LCBnbC5CWVRFLCBmYWxzZSwgOCwgdnR4T2Zmc2V0ICsgNCk7XG5cbiAgICAgICAgdmFyIGNvdW50ID0gZ3JvdXAuZWxlbWVudExlbmd0aCAqIDM7XG4gICAgICAgIHZhciBlbGVtZW50T2Zmc2V0ID0gZ3JvdXAuZWxlbWVudFN0YXJ0SW5kZXggKiBlbGVtZW50Lml0ZW1TaXplO1xuICAgICAgICBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCBjb3VudCwgZ2wuVU5TSUdORURfU0hPUlQsIGVsZW1lbnRPZmZzZXQpO1xuICAgIH1cblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3UmFzdGVyO1xuXG5mdW5jdGlvbiBkcmF3UmFzdGVyKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgdmFyIHNoYWRlciA9IHBhaW50ZXIucmFzdGVyU2hhZGVyO1xuICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCk7XG5cbiAgICAvLyBjb2xvciBwYXJhbWV0ZXJzXG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2JyaWdodG5lc3NfbG93LCBsYXllci5wYWludFsncmFzdGVyLWJyaWdodG5lc3MtbWluJ10pO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9icmlnaHRuZXNzX2hpZ2gsIGxheWVyLnBhaW50WydyYXN0ZXItYnJpZ2h0bmVzcy1tYXgnXSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3NhdHVyYXRpb25fZmFjdG9yLCBzYXR1cmF0aW9uRmFjdG9yKGxheWVyLnBhaW50WydyYXN0ZXItc2F0dXJhdGlvbiddKSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2NvbnRyYXN0X2ZhY3RvciwgY29udHJhc3RGYWN0b3IobGF5ZXIucGFpbnRbJ3Jhc3Rlci1jb250cmFzdCddKSk7XG4gICAgZ2wudW5pZm9ybTNmdihzaGFkZXIudV9zcGluX3dlaWdodHMsIHNwaW5XZWlnaHRzKGxheWVyLnBhaW50WydyYXN0ZXItaHVlLXJvdGF0ZSddKSk7XG5cbiAgICB2YXIgcGFyZW50VGlsZSA9IHRpbGUuc291cmNlICYmIHRpbGUuc291cmNlLl9weXJhbWlkLmZpbmRMb2FkZWRQYXJlbnQodGlsZS5jb29yZCwgMCwge30pLFxuICAgICAgICBvcGFjaXRpZXMgPSBnZXRPcGFjaXRpZXModGlsZSwgcGFyZW50VGlsZSwgbGF5ZXIsIHBhaW50ZXIudHJhbnNmb3JtKTtcblxuICAgIHZhciBwYXJlbnRTY2FsZUJ5LCBwYXJlbnRUTDtcblxuICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRpbGUudGV4dHVyZSk7XG5cbiAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUxKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgcGFyZW50VGlsZS50ZXh0dXJlKTtcblxuICAgICAgICBwYXJlbnRTY2FsZUJ5ID0gTWF0aC5wb3coMiwgcGFyZW50VGlsZS5jb29yZC56IC0gdGlsZS5jb29yZC56KTtcbiAgICAgICAgcGFyZW50VEwgPSBbdGlsZS5jb29yZC54ICogcGFyZW50U2NhbGVCeSAlIDEsIHRpbGUuY29vcmQueSAqIHBhcmVudFNjYWxlQnkgJSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvcGFjaXRpZXNbMV0gPSAwO1xuICAgIH1cblxuICAgIC8vIGNyb3NzLWZhZGUgcGFyYW1ldGVyc1xuICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfdGxfcGFyZW50LCBwYXJlbnRUTCB8fCBbMCwgMF0pO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9zY2FsZV9wYXJlbnQsIHBhcmVudFNjYWxlQnkgfHwgMSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2J1ZmZlcl9zY2FsZSwgMSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X29wYWNpdHkwLCBvcGFjaXRpZXNbMF0pO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9vcGFjaXR5MSwgb3BhY2l0aWVzWzFdKTtcbiAgICBnbC51bmlmb3JtMWkoc2hhZGVyLnVfaW1hZ2UwLCAwKTtcbiAgICBnbC51bmlmb3JtMWkoc2hhZGVyLnVfaW1hZ2UxLCAxKTtcblxuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0aWxlLmJvdW5kc0J1ZmZlciB8fCBwYWludGVyLnRpbGVFeHRlbnRCdWZmZXIpO1xuXG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9wb3MsICAgICAgICAgMiwgZ2wuU0hPUlQsIGZhbHNlLCA4LCAwKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX3RleHR1cmVfcG9zLCAyLCBnbC5TSE9SVCwgZmFsc2UsIDgsIDQpO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpO1xuXG4gICAgZ2wuZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7XG59XG5cbmZ1bmN0aW9uIHNwaW5XZWlnaHRzKGFuZ2xlKSB7XG4gICAgYW5nbGUgKj0gTWF0aC5QSSAvIDE4MDtcbiAgICB2YXIgcyA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICB2YXIgYyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICAoMiAqIGMgKyAxKSAvIDMsXG4gICAgICAgICgtTWF0aC5zcXJ0KDMpICogcyAtIGMgKyAxKSAvIDMsXG4gICAgICAgIChNYXRoLnNxcnQoMykgKiBzIC0gYyArIDEpIC8gM1xuICAgIF07XG59XG5cbmZ1bmN0aW9uIGNvbnRyYXN0RmFjdG9yKGNvbnRyYXN0KSB7XG4gICAgcmV0dXJuIGNvbnRyYXN0ID4gMCA/XG4gICAgICAgIDEgLyAoMSAtIGNvbnRyYXN0KSA6XG4gICAgICAgIDEgKyBjb250cmFzdDtcbn1cblxuZnVuY3Rpb24gc2F0dXJhdGlvbkZhY3RvcihzYXR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHNhdHVyYXRpb24gPiAwID9cbiAgICAgICAgMSAtIDEgLyAoMS4wMDEgLSBzYXR1cmF0aW9uKSA6XG4gICAgICAgIC1zYXR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXRPcGFjaXRpZXModGlsZSwgcGFyZW50VGlsZSwgbGF5ZXIsIHRyYW5zZm9ybSkge1xuICAgIGlmICghdGlsZS5zb3VyY2UpIHJldHVybiBbMSwgMF07XG5cbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgICB2YXIgZmFkZUR1cmF0aW9uID0gbGF5ZXIucGFpbnRbJ3Jhc3Rlci1mYWRlLWR1cmF0aW9uJ107XG4gICAgdmFyIHNpbmNlVGlsZSA9IChub3cgLSB0aWxlLnRpbWVBZGRlZCkgLyBmYWRlRHVyYXRpb247XG4gICAgdmFyIHNpbmNlUGFyZW50ID0gcGFyZW50VGlsZSA/IChub3cgLSBwYXJlbnRUaWxlLnRpbWVBZGRlZCkgLyBmYWRlRHVyYXRpb24gOiAtMTtcblxuICAgIHZhciBpZGVhbFogPSB0aWxlLnNvdXJjZS5fcHlyYW1pZC5jb3ZlcmluZ1pvb21MZXZlbCh0cmFuc2Zvcm0pO1xuICAgIHZhciBwYXJlbnRGdXJ0aGVyID0gcGFyZW50VGlsZSA/IE1hdGguYWJzKHBhcmVudFRpbGUuY29vcmQueiAtIGlkZWFsWikgPiBNYXRoLmFicyh0aWxlLmNvb3JkLnogLSBpZGVhbFopIDogZmFsc2U7XG5cbiAgICB2YXIgb3BhY2l0eSA9IFtdO1xuICAgIGlmICghcGFyZW50VGlsZSB8fCBwYXJlbnRGdXJ0aGVyKSB7XG4gICAgICAgIC8vIGlmIG5vIHBhcmVudCBvciBwYXJlbnQgaXMgb2xkZXJcbiAgICAgICAgb3BhY2l0eVswXSA9IHV0aWwuY2xhbXAoc2luY2VUaWxlLCAwLCAxKTtcbiAgICAgICAgb3BhY2l0eVsxXSA9IDEgLSBvcGFjaXR5WzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBhcmVudCBpcyB5b3VuZ2VyLCB6b29taW5nIG91dFxuICAgICAgICBvcGFjaXR5WzBdID0gdXRpbC5jbGFtcCgxIC0gc2luY2VQYXJlbnQsIDAsIDEpO1xuICAgICAgICBvcGFjaXR5WzFdID0gMSAtIG9wYWNpdHlbMF07XG4gICAgfVxuXG4gICAgdmFyIG9wID0gbGF5ZXIucGFpbnRbJ3Jhc3Rlci1vcGFjaXR5J107XG4gICAgb3BhY2l0eVswXSAqPSBvcDtcbiAgICBvcGFjaXR5WzFdICo9IG9wO1xuXG4gICAgcmV0dXJuIG9wYWNpdHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgbWF0NCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpLm1hdDQ7XG5cbnZhciBkcmF3Q29sbGlzaW9uRGVidWcgPSByZXF1aXJlKCcuL2RyYXdfY29sbGlzaW9uX2RlYnVnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd1N5bWJvbHM7XG5cbmZ1bmN0aW9uIGRyYXdTeW1ib2xzKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcbiAgICAvLyBObyBkYXRhXG4gICAgaWYgKCF0aWxlLmJ1ZmZlcnMpIHJldHVybjtcbiAgICB2YXIgZWxlbWVudEdyb3VwcyA9IHRpbGUuZWxlbWVudEdyb3Vwc1tsYXllci5yZWYgfHwgbGF5ZXIuaWRdO1xuICAgIGlmICghZWxlbWVudEdyb3VwcykgcmV0dXJuO1xuXG4gICAgdmFyIGRyYXdBY3Jvc3NFZGdlcyA9ICEobGF5ZXIubGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSB8fCBsYXllci5sYXlvdXRbJ2ljb24tYWxsb3ctb3ZlcmxhcCddIHx8XG4gICAgICAgIGxheWVyLmxheW91dFsndGV4dC1pZ25vcmUtcGxhY2VtZW50J10gfHwgbGF5ZXIubGF5b3V0WydpY29uLWlnbm9yZS1wbGFjZW1lbnQnXSk7XG5cbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgaWYgKGRyYXdBY3Jvc3NFZGdlcykge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBzdGVuY2lsIHRlc3Qgc28gdGhhdCBsYWJlbHMgYXJlbid0IGNsaXBwZWQgdG8gdGlsZSBib3VuZGFyaWVzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBMYXllcnMgd2l0aCBmZWF0dXJlcyB0aGF0IG1heSBiZSBkcmF3biBvdmVybGFwcGluZyBhcmVuJ3QgY2xpcHBlZC4gVGhlc2VcbiAgICAgICAgLy8gbGF5ZXJzIGFyZSBzb3J0ZWQgaW4gdGhlIHkgZGlyZWN0aW9uLCBhbmQgdG8gZHJhdyB0aGUgY29ycmVjdCBvcmRlcmluZyBuZWFyXG4gICAgICAgIC8vIHRpbGUgZWRnZXMgdGhlIGljb25zIGFyZSBpbmNsdWRlZCBpbiBib3RoIHRpbGVzIGFuZCBjbGlwcGVkIHdoZW4gZHJhd2luZy5cbiAgICAgICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50R3JvdXBzLnRleHQuZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgICBkcmF3U3ltYm9sKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUsIGVsZW1lbnRHcm91cHMudGV4dCwgJ3RleHQnLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRHcm91cHMuaWNvbi5ncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGRyYXdTeW1ib2wocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCwgdGlsZSwgZWxlbWVudEdyb3Vwcy5pY29uLCAnaWNvbicsIGVsZW1lbnRHcm91cHMuc2RmSWNvbnMpO1xuICAgIH1cblxuICAgIGRyYXdDb2xsaXNpb25EZWJ1ZyhwYWludGVyLCBsYXllciwgcG9zTWF0cml4LCB0aWxlKTtcblxuICAgIGlmIChkcmF3QWNyb3NzRWRnZXMpIHtcbiAgICAgICAgZ2wuZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gICAgfVxufVxuXG52YXIgZGVmYXVsdFNpemVzID0ge1xuICAgIGljb246IDEsXG4gICAgdGV4dDogMjRcbn07XG5cbmZ1bmN0aW9uIGRyYXdTeW1ib2wocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCwgdGlsZSwgZWxlbWVudEdyb3VwcywgcHJlZml4LCBzZGYpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgcG9zTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVNYXRyaXgocG9zTWF0cml4LCB0aWxlLCBsYXllci5wYWludFtwcmVmaXggKyAnLXRyYW5zbGF0ZSddLCBsYXllci5wYWludFtwcmVmaXggKyAnLXRyYW5zbGF0ZS1hbmNob3InXSk7XG5cbiAgICB2YXIgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICB2YXIgYWxpZ25lZFdpdGhNYXAgPSBsYXllci5sYXlvdXRbcHJlZml4ICsgJy1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9PT0gJ21hcCc7XG4gICAgdmFyIHNrZXdlZCA9IGFsaWduZWRXaXRoTWFwO1xuICAgIHZhciBleE1hdHJpeCwgcywgZ2FtbWFTY2FsZTtcblxuICAgIGlmIChza2V3ZWQpIHtcbiAgICAgICAgZXhNYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBzID0gNDA5NiAvIHRpbGUudGlsZVNpemUgLyBNYXRoLnBvdygyLCBwYWludGVyLnRyYW5zZm9ybS56b29tIC0gdGlsZS5jb29yZC56KTtcbiAgICAgICAgZ2FtbWFTY2FsZSA9IDEgLyBNYXRoLmNvcyh0ci5fcGl0Y2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV4TWF0cml4ID0gbWF0NC5jbG9uZSh0aWxlLmV4TWF0cml4KTtcbiAgICAgICAgcyA9IHBhaW50ZXIudHJhbnNmb3JtLmFsdGl0dWRlO1xuICAgICAgICBnYW1tYVNjYWxlID0gMTtcbiAgICB9XG4gICAgbWF0NC5zY2FsZShleE1hdHJpeCwgZXhNYXRyaXgsIFtzLCBzLCAxXSk7XG5cbiAgICAvLyBJZiBsYXllci5wYWludC5zaXplID4gbGF5ZXIubGF5b3V0W3ByZWZpeCArICctbWF4LXNpemUnXSB0aGVuIGxhYmVscyBtYXkgY29sbGlkZVxuICAgIHZhciBmb250U2l6ZSA9IGxheWVyLnBhaW50W3ByZWZpeCArICctc2l6ZSddO1xuICAgIHZhciBmb250U2NhbGUgPSBmb250U2l6ZSAvIGRlZmF1bHRTaXplc1twcmVmaXhdO1xuICAgIG1hdDQuc2NhbGUoZXhNYXRyaXgsIGV4TWF0cml4LCBbIGZvbnRTY2FsZSwgZm9udFNjYWxlLCAxIF0pO1xuXG4gICAgLy8gY2FsY3VsYXRlIGhvdyBtdWNoIGxvbmdlciB0aGUgcmVhbCB3b3JsZCBkaXN0YW5jZSBpcyBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW5cbiAgICAvLyB0aGFuIGF0IHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbi5cbiAgICB2YXIgdG9wZWRnZWxlbmd0aCA9IE1hdGguc3FydCh0ci5oZWlnaHQgKiB0ci5oZWlnaHQgLyA0ICAqICgxICsgdHIuYWx0aXR1ZGUgKiB0ci5hbHRpdHVkZSkpO1xuICAgIHZhciB4ID0gdHIuaGVpZ2h0IC8gMiAqIE1hdGgudGFuKHRyLl9waXRjaCk7XG4gICAgdmFyIGV4dHJhID0gKHRvcGVkZ2VsZW5ndGggKyB4KSAvIHRvcGVkZ2VsZW5ndGggLSAxO1xuXG4gICAgdmFyIHRleHQgPSBwcmVmaXggPT09ICd0ZXh0JztcbiAgICB2YXIgc2hhZGVyLCB2ZXJ0ZXgsIGVsZW1lbnRzLCB0ZXhzaXplO1xuXG4gICAgaWYgKCF0ZXh0ICYmICFwYWludGVyLnN0eWxlLnNwcml0ZS5sb2FkZWQoKSlcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCk7XG5cbiAgICBpZiAoc2RmKSB7XG4gICAgICAgIHNoYWRlciA9IHBhaW50ZXIuc2RmU2hhZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNoYWRlciA9IHBhaW50ZXIuaWNvblNoYWRlcjtcbiAgICB9XG5cbiAgICBpZiAodGV4dCkge1xuICAgICAgICBwYWludGVyLmdseXBoQXRsYXMudXBkYXRlVGV4dHVyZShnbCk7XG4gICAgICAgIHZlcnRleCA9IHRpbGUuYnVmZmVycy5nbHlwaFZlcnRleDtcbiAgICAgICAgZWxlbWVudHMgPSB0aWxlLmJ1ZmZlcnMuZ2x5cGhFbGVtZW50O1xuICAgICAgICB0ZXhzaXplID0gW3BhaW50ZXIuZ2x5cGhBdGxhcy53aWR0aCAvIDQsIHBhaW50ZXIuZ2x5cGhBdGxhcy5oZWlnaHQgLyA0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwYWludGVyLnNwcml0ZUF0bGFzLmJpbmQoZ2wsIGFsaWduZWRXaXRoTWFwIHx8IHBhaW50ZXIub3B0aW9ucy5yb3RhdGluZyB8fFxuICAgICAgICAgICAgcGFpbnRlci5vcHRpb25zLnpvb21pbmcgfHwgZm9udFNjYWxlICE9PSAxIHx8IHNkZiB8fCBwYWludGVyLnRyYW5zZm9ybS5waXRjaCk7XG4gICAgICAgIHZlcnRleCA9IHRpbGUuYnVmZmVycy5pY29uVmVydGV4O1xuICAgICAgICBlbGVtZW50cyA9IHRpbGUuYnVmZmVycy5pY29uRWxlbWVudDtcbiAgICAgICAgdGV4c2l6ZSA9IFtwYWludGVyLnNwcml0ZUF0bGFzLndpZHRoIC8gNCwgcGFpbnRlci5zcHJpdGVBdGxhcy5oZWlnaHQgLyA0XTtcbiAgICB9XG5cbiAgICBnbC5zd2l0Y2hTaGFkZXIoc2hhZGVyLCBwb3NNYXRyaXgsIGV4TWF0cml4KTtcbiAgICBnbC51bmlmb3JtMWkoc2hhZGVyLnVfdGV4dHVyZSwgMCk7XG4gICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV90ZXhzaXplLCB0ZXhzaXplKTtcbiAgICBnbC51bmlmb3JtMWkoc2hhZGVyLnVfc2tld2VkLCBza2V3ZWQpO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9leHRyYSwgZXh0cmEpO1xuXG4gICAgLy8gYWRqdXN0IG1pbi9tYXggem9vbXMgZm9yIHZhcmlhYmxlIGZvbnQgc2llc1xuICAgIHZhciB6b29tQWRqdXN0ID0gTWF0aC5sb2coZm9udFNpemUgLyBsYXllci5sYXlvdXRbcHJlZml4ICsgJy1tYXgtc2l6ZSddKSAvIE1hdGguTE4yIHx8IDA7XG5cbiAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfem9vbSwgKHBhaW50ZXIudHJhbnNmb3JtLnpvb20gLSB6b29tQWRqdXN0KSAqIDEwKTsgLy8gY3VycmVudCB6b29tIGxldmVsXG5cbiAgICB2YXIgZiA9IHBhaW50ZXIuZnJhbWVIaXN0b3J5LmdldEZhZGVQcm9wZXJ0aWVzKDMwMCk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2ZhZGVkaXN0LCBmLmZhZGVkaXN0ICogMTApO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9taW5mYWRlem9vbSwgTWF0aC5mbG9vcihmLm1pbmZhZGV6b29tICogMTApKTtcbiAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfbWF4ZmFkZXpvb20sIE1hdGguZmxvb3IoZi5tYXhmYWRlem9vbSAqIDEwKSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2ZhZGV6b29tLCAocGFpbnRlci50cmFuc2Zvcm0uem9vbSArIGYuYnVtcCkgKiAxMCk7XG5cbiAgICB2YXIgZ3JvdXAsIG9mZnNldCwgY291bnQsIGVsZW1lbnRPZmZzZXQ7XG5cbiAgICBlbGVtZW50cy5iaW5kKGdsKTtcblxuICAgIGlmIChzZGYpIHtcbiAgICAgICAgdmFyIHNkZlB4ID0gODtcbiAgICAgICAgdmFyIGJsdXJPZmZzZXQgPSAxLjE5O1xuICAgICAgICB2YXIgaGFsb09mZnNldCA9IDY7XG4gICAgICAgIHZhciBnYW1tYSA9IDAuMTA1ICogZGVmYXVsdFNpemVzW3ByZWZpeF0gLyBmb250U2l6ZSAvIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbztcblxuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZ2FtbWEsIGdhbW1hICogZ2FtbWFTY2FsZSk7XG4gICAgICAgIGdsLnVuaWZvcm00ZnYoc2hhZGVyLnVfY29sb3IsIGxheWVyLnBhaW50W3ByZWZpeCArICctY29sb3InXSk7XG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9idWZmZXIsICgyNTYgLSA2NCkgLyAyNTYpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudEdyb3Vwcy5ncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGdyb3VwID0gZWxlbWVudEdyb3Vwcy5ncm91cHNbaV07XG4gICAgICAgICAgICBvZmZzZXQgPSBncm91cC52ZXJ0ZXhTdGFydEluZGV4ICogdmVydGV4Lml0ZW1TaXplO1xuICAgICAgICAgICAgdmVydGV4LmJpbmQoZ2wsIHNoYWRlciwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgY291bnQgPSBncm91cC5lbGVtZW50TGVuZ3RoICogMztcbiAgICAgICAgICAgIGVsZW1lbnRPZmZzZXQgPSBncm91cC5lbGVtZW50U3RhcnRJbmRleCAqIGVsZW1lbnRzLml0ZW1TaXplO1xuICAgICAgICAgICAgZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgY291bnQsIGdsLlVOU0lHTkVEX1NIT1JULCBlbGVtZW50T2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXllci5wYWludFtwcmVmaXggKyAnLWhhbG8tY29sb3InXSkge1xuICAgICAgICAgICAgLy8gRHJhdyBoYWxvIHVuZGVybmVhdGggdGhlIHRleHQuXG4gICAgICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZ2FtbWEsIChsYXllci5wYWludFtwcmVmaXggKyAnLWhhbG8tYmx1ciddICogYmx1ck9mZnNldCAvIGZvbnRTY2FsZSAvIHNkZlB4ICsgZ2FtbWEpICogZ2FtbWFTY2FsZSk7XG4gICAgICAgICAgICBnbC51bmlmb3JtNGZ2KHNoYWRlci51X2NvbG9yLCBsYXllci5wYWludFtwcmVmaXggKyAnLWhhbG8tY29sb3InXSk7XG4gICAgICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfYnVmZmVyLCAoaGFsb09mZnNldCAtIGxheWVyLnBhaW50W3ByZWZpeCArICctaGFsby13aWR0aCddIC8gZm9udFNjYWxlKSAvIHNkZlB4KTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVtZW50R3JvdXBzLmdyb3Vwcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGdyb3VwID0gZWxlbWVudEdyb3Vwcy5ncm91cHNbal07XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gZ3JvdXAudmVydGV4U3RhcnRJbmRleCAqIHZlcnRleC5pdGVtU2l6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXguYmluZChnbCwgc2hhZGVyLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgY291bnQgPSBncm91cC5lbGVtZW50TGVuZ3RoICogMztcbiAgICAgICAgICAgICAgICBlbGVtZW50T2Zmc2V0ID0gZ3JvdXAuZWxlbWVudFN0YXJ0SW5kZXggKiBlbGVtZW50cy5pdGVtU2l6ZTtcbiAgICAgICAgICAgICAgICBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCBjb3VudCwgZ2wuVU5TSUdORURfU0hPUlQsIGVsZW1lbnRPZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X29wYWNpdHksIGxheWVyLnBhaW50WydpY29uLW9wYWNpdHknXSk7XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZWxlbWVudEdyb3Vwcy5ncm91cHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGdyb3VwID0gZWxlbWVudEdyb3Vwcy5ncm91cHNba107XG4gICAgICAgICAgICBvZmZzZXQgPSBncm91cC52ZXJ0ZXhTdGFydEluZGV4ICogdmVydGV4Lml0ZW1TaXplO1xuICAgICAgICAgICAgdmVydGV4LmJpbmQoZ2wsIHNoYWRlciwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgY291bnQgPSBncm91cC5lbGVtZW50TGVuZ3RoICogMztcbiAgICAgICAgICAgIGVsZW1lbnRPZmZzZXQgPSBncm91cC5lbGVtZW50U3RhcnRJbmRleCAqIGVsZW1lbnRzLml0ZW1TaXplO1xuICAgICAgICAgICAgZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgY291bnQsIGdsLlVOU0lHTkVEX1NIT1JULCBlbGVtZW50T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbnZhciBtYXQ0ID0gcmVxdWlyZSgnZ2wtbWF0cml4JykubWF0NDtcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3VmVydGljZXM7XG5cbmZ1bmN0aW9uIGRyYXdWZXJ0aWNlcyhwYWludGVyLCBsYXllciwgcG9zTWF0cml4LCB0aWxlKSB7XG4gICAgdmFyIGdsID0gcGFpbnRlci5nbDtcblxuICAgIGlmICghdGlsZSB8fCAhdGlsZS5idWZmZXJzKSByZXR1cm47XG4gICAgdmFyIGVsZW1lbnRHcm91cHMgPSB0aWxlLmVsZW1lbnRHcm91cHNbbGF5ZXIucmVmIHx8IGxheWVyLmlkXTtcbiAgICBpZiAoIWVsZW1lbnRHcm91cHMpIHJldHVybjtcblxuICAgIC8vIEJsZW5kIHRvIHRoZSBmcm9udCwgbm90IHRoZSBiYWNrLlxuICAgIGdsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuXG4gICAgLy8gRHJhdyBhbGwgYnVmZmVyc1xuICAgIGlmIChsYXllci50eXBlID09PSAnZmlsbCcpIHtcbiAgICAgICAgZHJhd1BvaW50cyh0aWxlLmJ1ZmZlcnMuZmlsbFZlcnRleCwgZWxlbWVudEdyb3Vwcy5ncm91cHMsIHBvc01hdHJpeCwgNCk7XG4gICAgfSBlbHNlIGlmIChsYXllci50eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICBkcmF3UG9pbnRzKHRpbGUuYnVmZmVycy5pY29uVmVydGV4LCBlbGVtZW50R3JvdXBzLmljb24uZ3JvdXBzLCBwb3NNYXRyaXgsIDE2KTtcbiAgICAgICAgZHJhd1BvaW50cyh0aWxlLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgsIGVsZW1lbnRHcm91cHMudGV4dC5ncm91cHMsIHBvc01hdHJpeCwgMTYpO1xuICAgIH0gZWxzZSBpZiAobGF5ZXIudHlwZSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgIHZhciBuZXdQb3NNYXRyaXggPSBtYXQ0LmNsb25lKHBvc01hdHJpeCk7XG4gICAgICAgIG1hdDQuc2NhbGUobmV3UG9zTWF0cml4LCBuZXdQb3NNYXRyaXgsIFswLjUsIDAuNSwgMV0pO1xuICAgICAgICBkcmF3UG9pbnRzKHRpbGUuYnVmZmVycy5saW5lVmVydGV4LCBlbGVtZW50R3JvdXBzLmdyb3VwcywgbmV3UG9zTWF0cml4LCA4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkcmF3UG9pbnRzKHZlcnRleCwgZ3JvdXBzLCBtYXRyaXgsIHN0cmlkZSkge1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIocGFpbnRlci5kb3RTaGFkZXIsIG1hdHJpeCk7XG5cbiAgICAgICAgZ2wudW5pZm9ybTFmKHBhaW50ZXIuZG90U2hhZGVyLnVfc2l6ZSwgNCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgICAgIGdsLnVuaWZvcm0xZihwYWludGVyLmRvdFNoYWRlci51X2JsdXIsIDAuMjUpO1xuICAgICAgICBnbC51bmlmb3JtNGZ2KHBhaW50ZXIuZG90U2hhZGVyLnVfY29sb3IsIFswLjEsIDAsIDAsIDAuMV0pO1xuXG4gICAgICAgIHZlcnRleC5iaW5kKGdsLCBwYWludGVyLmRvdFNoYWRlciwgMCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZ3JvdXAgPSBncm91cHNbaV07XG4gICAgICAgICAgICB2YXIgYmVnaW4gPSBncm91cC52ZXJ0ZXhTdGFydEluZGV4O1xuICAgICAgICAgICAgdmFyIGNvdW50ID0gZ3JvdXAudmVydGV4TGVuZ3RoO1xuICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwYWludGVyLmRvdFNoYWRlci5hX3BvcywgMiwgZ2wuU0hPUlQsIGZhbHNlLCBzdHJpZGUsIDApO1xuICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIGJlZ2luLCBjb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXZlcnQgYmxlbmRpbmcgbW9kZSB0byBibGVuZCB0byB0aGUgYmFjay5cbiAgICBnbC5ibGVuZEZ1bmMoZ2wuT05FX01JTlVTX0RTVF9BTFBIQSwgZ2wuT05FKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBGcmFtZUhpc3Rvcnk7XG5cbmZ1bmN0aW9uIEZyYW1lSGlzdG9yeSgpIHtcbiAgICB0aGlzLmZyYW1lSGlzdG9yeSA9IFtdO1xufVxuXG5GcmFtZUhpc3RvcnkucHJvdG90eXBlLmdldEZhZGVQcm9wZXJ0aWVzID0gZnVuY3Rpb24oZHVyYXRpb24pIHtcbiAgICBpZiAoZHVyYXRpb24gPT09IHVuZGVmaW5lZCkgZHVyYXRpb24gPSAzMDA7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcblxuICAgIC8vIFJlbW92ZSBmcmFtZXMgdW50aWwgb25seSBvbmUgaXMgb3V0c2lkZSB0aGUgZHVyYXRpb24sIG9yIHVudGlsIHRoZXJlIGFyZSBvbmx5IHRocmVlXG4gICAgd2hpbGUgKHRoaXMuZnJhbWVIaXN0b3J5Lmxlbmd0aCA+IDMgJiYgdGhpcy5mcmFtZUhpc3RvcnlbMV0udGltZSArIGR1cmF0aW9uIDwgY3VycmVudFRpbWUpIHtcbiAgICAgICAgdGhpcy5mcmFtZUhpc3Rvcnkuc2hpZnQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mcmFtZUhpc3RvcnlbMV0udGltZSArIGR1cmF0aW9uIDwgY3VycmVudFRpbWUpIHtcbiAgICAgICAgdGhpcy5mcmFtZUhpc3RvcnlbMF0ueiA9IHRoaXMuZnJhbWVIaXN0b3J5WzFdLno7XG4gICAgfVxuXG4gICAgdmFyIGZyYW1lTGVuID0gdGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RoO1xuICAgIGlmIChmcmFtZUxlbiA8IDMpIGNvbnNvbGUud2FybigndGhlcmUgc2hvdWxkIG5ldmVyIGJlIGxlc3MgdGhhbiB0aHJlZSBmcmFtZXMgaW4gdGhlIGhpc3RvcnknKTtcblxuICAgIC8vIEZpbmQgdGhlIHJhbmdlIG9mIHpvb20gbGV2ZWxzIHdlIHdhbnQgdG8gZmFkZSBiZXR3ZWVuXG4gICAgdmFyIHN0YXJ0aW5nWiA9IHRoaXMuZnJhbWVIaXN0b3J5WzBdLnosXG4gICAgICAgIGxhc3RGcmFtZSA9IHRoaXMuZnJhbWVIaXN0b3J5W2ZyYW1lTGVuIC0gMV0sXG4gICAgICAgIGVuZGluZ1ogPSBsYXN0RnJhbWUueixcbiAgICAgICAgbG93WiA9IE1hdGgubWluKHN0YXJ0aW5nWiwgZW5kaW5nWiksXG4gICAgICAgIGhpZ2haID0gTWF0aC5tYXgoc3RhcnRpbmdaLCBlbmRpbmdaKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3BlZWQgb2Ygem9vbWluZywgYW5kIGhvdyBmYXIgaXQgd291bGQgem9vbSBpbiB0ZXJtcyBvZiB6b29tIGxldmVscyBpbiBvbmUgZHVyYXRpb25cbiAgICB2YXIgem9vbURpZmYgPSBsYXN0RnJhbWUueiAtIHRoaXMuZnJhbWVIaXN0b3J5WzFdLnosXG4gICAgICAgIHRpbWVEaWZmID0gbGFzdEZyYW1lLnRpbWUgLSB0aGlzLmZyYW1lSGlzdG9yeVsxXS50aW1lO1xuICAgIHZhciBmYWRlZGlzdCA9IHpvb21EaWZmIC8gKHRpbWVEaWZmIC8gZHVyYXRpb24pO1xuXG4gICAgaWYgKGlzTmFOKGZhZGVkaXN0KSkgY29uc29sZS53YXJuKCdmYWRlZGlzdCBzaG91bGQgbmV2ZXIgYmUgTmFOJyk7XG5cbiAgICAvLyBBdCBlbmQgb2YgYSB6b29tIHdoZW4gdGhlIHpvb20gc3RvcHMgY2hhbmdpbmcgY29udGludWUgcHJldGVuZGluZyB0byB6b29tIGF0IHRoYXQgc3BlZWRcbiAgICAvLyBidW1wIGlzIGhvdyBtdWNoIGZhcnRoZXIgaXQgd291bGQgaGF2ZSBiZWVuIGlmIGl0IGhhZCBjb250aW51ZWQgem9vbWluZyBhdCB0aGUgc2FtZSByYXRlXG4gICAgdmFyIGJ1bXAgPSAoY3VycmVudFRpbWUgLSBsYXN0RnJhbWUudGltZSkgLyBkdXJhdGlvbiAqIGZhZGVkaXN0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmFkZWRpc3Q6IGZhZGVkaXN0LFxuICAgICAgICBtaW5mYWRlem9vbTogbG93WixcbiAgICAgICAgbWF4ZmFkZXpvb206IGhpZ2haLFxuICAgICAgICBidW1wOiBidW1wXG4gICAgfTtcbn07XG5cbi8vIFJlY29yZCBmcmFtZSBoaXN0b3J5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBmYWRpbmcgcGFyYW1zXG5GcmFtZUhpc3RvcnkucHJvdG90eXBlLnJlY29yZCA9IGZ1bmN0aW9uKHpvb20pIHtcbiAgICB2YXIgY3VycmVudFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuXG4gICAgLy8gZmlyc3QgZnJhbWUgZXZlclxuICAgIGlmICghdGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZnJhbWVIaXN0b3J5LnB1c2goe3RpbWU6IDAsIHo6IHpvb20gfSwge3RpbWU6IDAsIHo6IHpvb20gfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZnJhbWVIaXN0b3J5Lmxlbmd0aCA9PT0gMiB8fCB0aGlzLmZyYW1lSGlzdG9yeVt0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGggLSAxXS56ICE9PSB6b29tKSB7XG4gICAgICAgIHRoaXMuZnJhbWVIaXN0b3J5LnB1c2goe1xuICAgICAgICAgICAgdGltZTogY3VycmVudFRpbWUsXG4gICAgICAgICAgICB6OiB6b29tXG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzaGFkZXJzID0gcmVxdWlyZSgnLi9zaGFkZXJzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG5leHBvcnRzLmV4dGVuZCA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgICB2YXIgb3JpZ0xpbmVXaWR0aCA9IGNvbnRleHQubGluZVdpZHRoLFxuICAgICAgICBsaW5lV2lkdGhSYW5nZSA9IGNvbnRleHQuZ2V0UGFyYW1ldGVyKGNvbnRleHQuQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFKTtcblxuICAgIGNvbnRleHQubGluZVdpZHRoID0gZnVuY3Rpb24od2lkdGgpIHtcbiAgICAgICAgb3JpZ0xpbmVXaWR0aC5jYWxsKGNvbnRleHQsIHV0aWwuY2xhbXAod2lkdGgsIGxpbmVXaWR0aFJhbmdlWzBdLCBsaW5lV2lkdGhSYW5nZVsxXSkpO1xuICAgIH07XG5cbiAgICBjb250ZXh0LmdldFNoYWRlciA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUpIHtcbiAgICAgICAgdmFyIGtpbmQgPSB0eXBlID09PSB0aGlzLkZSQUdNRU5UX1NIQURFUiA/ICdmcmFnbWVudCcgOiAndmVydGV4JztcbiAgICAgICAgaWYgKCFzaGFkZXJzW25hbWVdIHx8ICFzaGFkZXJzW25hbWVdW2tpbmRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBzaGFkZXIgXCIgKyBuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaGFkZXIgPSB0aGlzLmNyZWF0ZVNoYWRlcih0eXBlKTtcbiAgICAgICAgdGhpcy5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzaGFkZXJzW25hbWVdW2tpbmRdKTtcbiAgICAgICAgdGhpcy5jb21waWxlU2hhZGVyKHNoYWRlcik7XG4gICAgICAgIGlmICghdGhpcy5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCB0aGlzLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2hhZGVyO1xuICAgIH07XG5cbiAgICBjb250ZXh0LmluaXRpYWxpemVTaGFkZXIgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB1bmlmb3Jtcykge1xuICAgICAgICB2YXIgc2hhZGVyID0ge1xuICAgICAgICAgICAgcHJvZ3JhbTogdGhpcy5jcmVhdGVQcm9ncmFtKCksXG4gICAgICAgICAgICBmcmFnbWVudDogdGhpcy5nZXRTaGFkZXIobmFtZSwgdGhpcy5GUkFHTUVOVF9TSEFERVIpLFxuICAgICAgICAgICAgdmVydGV4OiB0aGlzLmdldFNoYWRlcihuYW1lLCB0aGlzLlZFUlRFWF9TSEFERVIpLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW11cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hdHRhY2hTaGFkZXIoc2hhZGVyLnByb2dyYW0sIHNoYWRlci52ZXJ0ZXgpO1xuICAgICAgICB0aGlzLmF0dGFjaFNoYWRlcihzaGFkZXIucHJvZ3JhbSwgc2hhZGVyLmZyYWdtZW50KTtcbiAgICAgICAgdGhpcy5saW5rUHJvZ3JhbShzaGFkZXIucHJvZ3JhbSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmdldFByb2dyYW1QYXJhbWV0ZXIoc2hhZGVyLnByb2dyYW0sIHRoaXMuTElOS19TVEFUVVMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHRoaXMuZ2V0UHJvZ3JhbUluZm9Mb2coc2hhZGVyLnByb2dyYW0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHNoYWRlclthdHRyaWJ1dGVzW2ldXSA9IHRoaXMuZ2V0QXR0cmliTG9jYXRpb24oc2hhZGVyLnByb2dyYW0sIGF0dHJpYnV0ZXNbaV0pO1xuICAgICAgICAgICAgICAgIHNoYWRlci5hdHRyaWJ1dGVzLnB1c2goc2hhZGVyW2F0dHJpYnV0ZXNbaV1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdW5pZm9ybXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBzaGFkZXJbdW5pZm9ybXNba11dID0gdGhpcy5nZXRVbmlmb3JtTG9jYXRpb24oc2hhZGVyLnByb2dyYW0sIHVuaWZvcm1zW2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFkZXI7XG4gICAgfTtcblxuICAgIC8vIFN3aXRjaGVzIHRvIGEgZGlmZmVyZW50IHNoYWRlciBwcm9ncmFtLlxuICAgIGNvbnRleHQuc3dpdGNoU2hhZGVyID0gZnVuY3Rpb24oc2hhZGVyLCBwb3NNYXRyaXgsIGV4TWF0cml4KSB7XG4gICAgICAgIGlmICghcG9zTWF0cml4KSB7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCdwb3NNYXRyaXggZG9lcyBub3QgaGF2ZSByZXF1aXJlZCBhcmd1bWVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFNoYWRlciAhPT0gc2hhZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnVzZVByb2dyYW0oc2hhZGVyLnByb2dyYW0pO1xuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIGFsbCBhdHRyaWJ1dGVzIGZyb20gdGhlIGV4aXN0aW5nIHNoYWRlciB0aGF0IGFyZW4ndCB1c2VkIGluXG4gICAgICAgICAgICAvLyB0aGUgbmV3IHNoYWRlci4gTm90ZTogYXR0cmlidXRlIGluZGljZXMgYXJlICpub3QqIHByb2dyYW0gc3BlY2lmaWMhXG4gICAgICAgICAgICB2YXIgZW5hYmxlZCA9IHRoaXMuY3VycmVudFNoYWRlciA/IHRoaXMuY3VycmVudFNoYWRlci5hdHRyaWJ1dGVzIDogW107XG4gICAgICAgICAgICB2YXIgcmVxdWlyZWQgPSBzaGFkZXIuYXR0cmlidXRlcztcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmFibGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkLmluZGV4T2YoZW5hYmxlZFtpXSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGVuYWJsZWRbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5hYmxlIGFsbCBhdHRyaWJ1dGVzIGZvciB0aGUgbmV3IHNoYWRlci5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVxdWlyZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZC5pbmRleE9mKHJlcXVpcmVkW2pdKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShyZXF1aXJlZFtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTaGFkZXIgPSBzaGFkZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdGhlIG1hdHJpY2VzIGlmIG5lY2Vzc2FyeS4gTm90ZTogVGhpcyByZWxpZXMgb24gb2JqZWN0IGlkZW50aXR5IVxuICAgICAgICAvLyBUaGlzIG1lYW5zIGNoYW5naW5nIHRoZSBtYXRyaXggdmFsdWVzIHdpdGhvdXQgdGhlIGFjdHVhbCBtYXRyaXggb2JqZWN0XG4gICAgICAgIC8vIHdpbGwgRkFJTCB0byB1cGRhdGUgdGhlIG1hdHJpeCBwcm9wZXJseS5cbiAgICAgICAgaWYgKHNoYWRlci5wb3NNYXRyaXggIT09IHBvc01hdHJpeCkge1xuICAgICAgICAgICAgdGhpcy51bmlmb3JtTWF0cml4NGZ2KHNoYWRlci51X21hdHJpeCwgZmFsc2UsIHBvc01hdHJpeCk7XG4gICAgICAgICAgICBzaGFkZXIucG9zTWF0cml4ID0gcG9zTWF0cml4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChleE1hdHJpeCAmJiBzaGFkZXIuZXhNYXRyaXggIT09IGV4TWF0cml4ICYmIHNoYWRlci51X2V4bWF0cml4KSB7XG4gICAgICAgICAgICB0aGlzLnVuaWZvcm1NYXRyaXg0ZnYoc2hhZGVyLnVfZXhtYXRyaXgsIGZhbHNlLCBleE1hdHJpeCk7XG4gICAgICAgICAgICBzaGFkZXIuZXhNYXRyaXggPSBleE1hdHJpeDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gY29udGV4dDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gTGluZUF0bGFzO1xuXG4vKipcbiAqIE11Y2ggbGlrZSBhIEdseXBoQXRsYXMsIGEgTGluZUF0bGFzIGxldHMgdXMgcmV1c2UgcmVuZGVyZWQgZGFzaGVkIGxpbmVzXG4gKiBieSB3cml0aW5nIG1hbnkgb2YgdGhlbSB0byBhIHRleHR1cmUgYW5kIHRoZW4gZmV0Y2hpbmcgdGhlaXIgcG9zaXRpb25zXG4gKiB1c2luZyAuZ2V0RGFzaC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIExpbmVBdGxhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMubmV4dFJvdyA9IDA7XG5cbiAgICB0aGlzLmJ5dGVzID0gNDtcbiAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgKiB0aGlzLmJ5dGVzKTtcblxuICAgIHRoaXMucG9zaXRpb25zID0ge307XG59XG5cbkxpbmVBdGxhcy5wcm90b3R5cGUuc2V0U3ByaXRlID0gZnVuY3Rpb24oc3ByaXRlKSB7XG4gICAgdGhpcy5zcHJpdGUgPSBzcHJpdGU7XG59O1xuXG4vKipcbiAqIEdldCBvciBjcmVhdGUgYSBkYXNoIGxpbmUgcGF0dGVybi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGRhc2hhcnJheVxuICogQHBhcmFtIHtib29sZWFufSByb3VuZCB3aGV0aGVyIHRvIGFkZCBjaXJjbGUgY2FwcyBpbiBiZXR3ZWVuIGRhc2ggc2VnbWVudHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IHBvc2l0aW9uIG9mIGRhc2ggdGV4dHVyZSBpbiB7IHksIGhlaWdodCwgd2lkdGggfVxuICogQHByaXZhdGVcbiAqL1xuTGluZUF0bGFzLnByb3RvdHlwZS5nZXREYXNoID0gZnVuY3Rpb24oZGFzaGFycmF5LCByb3VuZCkge1xuICAgIHZhciBrZXkgPSBkYXNoYXJyYXkuam9pbihcIixcIikgKyByb3VuZDtcblxuICAgIGlmICghdGhpcy5wb3NpdGlvbnNba2V5XSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uc1trZXldID0gdGhpcy5hZGREYXNoKGRhc2hhcnJheSwgcm91bmQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbnNba2V5XTtcbn07XG5cbkxpbmVBdGxhcy5wcm90b3R5cGUuYWRkRGFzaCA9IGZ1bmN0aW9uKGRhc2hhcnJheSwgcm91bmQpIHtcblxuICAgIHZhciBuID0gcm91bmQgPyA3IDogMDtcbiAgICB2YXIgaGVpZ2h0ID0gMiAqIG4gKyAxO1xuICAgIHZhciBvZmZzZXQgPSAxMjg7XG5cbiAgICBpZiAodGhpcy5uZXh0Um93ICsgaGVpZ2h0ID4gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdMaW5lQXRsYXMgb3V0IG9mIHNwYWNlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBsZW5ndGggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGFzaGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxlbmd0aCArPSBkYXNoYXJyYXlbaV07XG4gICAgfVxuXG4gICAgdmFyIHN0cmV0Y2ggPSB0aGlzLndpZHRoIC8gbGVuZ3RoO1xuICAgIHZhciBoYWxmV2lkdGggPSBzdHJldGNoIC8gMjtcblxuICAgIC8vIElmIGRhc2hhcnJheSBoYXMgYW4gb2RkIGxlbmd0aCwgYm90aCB0aGUgZmlyc3QgYW5kIGxhc3QgcGFydHNcbiAgICAvLyBhcmUgZGFzaGVzIGFuZCBzaG91bGQgYmUgam9pbmVkIHNlYW1sZXNzbHkuXG4gICAgdmFyIG9kZExlbmd0aCA9IGRhc2hhcnJheS5sZW5ndGggJSAyID09PSAxO1xuXG4gICAgZm9yICh2YXIgeSA9IC1uOyB5IDw9IG47IHkrKykge1xuICAgICAgICB2YXIgcm93ID0gdGhpcy5uZXh0Um93ICsgbiArIHk7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMud2lkdGggKiByb3c7XG5cbiAgICAgICAgdmFyIGxlZnQgPSBvZGRMZW5ndGggPyAtZGFzaGFycmF5W2Rhc2hhcnJheS5sZW5ndGggLSAxXSA6IDA7XG4gICAgICAgIHZhciByaWdodCA9IGRhc2hhcnJheVswXTtcbiAgICAgICAgdmFyIHBhcnRJbmRleCA9IDE7XG5cbiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcblxuICAgICAgICAgICAgd2hpbGUgKHJpZ2h0IDwgeCAvIHN0cmV0Y2gpIHtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgcmlnaHQgPSByaWdodCArIGRhc2hhcnJheVtwYXJ0SW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9kZExlbmd0aCAmJiBwYXJ0SW5kZXggPT09IGRhc2hhcnJheS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ICs9IGRhc2hhcnJheVswXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXJ0SW5kZXgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGRpc3RMZWZ0ID0gTWF0aC5hYnMoeCAtIGxlZnQgKiBzdHJldGNoKTtcbiAgICAgICAgICAgIHZhciBkaXN0UmlnaHQgPSBNYXRoLmFicyh4IC0gcmlnaHQgKiBzdHJldGNoKTtcbiAgICAgICAgICAgIHZhciBkaXN0ID0gTWF0aC5taW4oZGlzdExlZnQsIGRpc3RSaWdodCk7XG4gICAgICAgICAgICB2YXIgaW5zaWRlID0gKHBhcnRJbmRleCAlIDIpID09PSAxO1xuICAgICAgICAgICAgdmFyIHNpZ25lZERpc3RhbmNlO1xuXG4gICAgICAgICAgICBpZiAocm91bmQpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgY2lyY2xlIGNhcHNcbiAgICAgICAgICAgICAgICB2YXIgZGlzdE1pZGRsZSA9IG4gPyB5IC8gbiAqIChoYWxmV2lkdGggKyAxKSA6IDA7XG4gICAgICAgICAgICAgICAgaWYgKGluc2lkZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGlzdEVkZ2UgPSBoYWxmV2lkdGggLSBNYXRoLmFicyhkaXN0TWlkZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlzdCAqIGRpc3QgKyBkaXN0RWRnZSAqIGRpc3RFZGdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzaWduZWREaXN0YW5jZSA9IGhhbGZXaWR0aCAtIE1hdGguc3FydChkaXN0ICogZGlzdCArIGRpc3RNaWRkbGUgKiBkaXN0TWlkZGxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNpZ25lZERpc3RhbmNlID0gKGluc2lkZSA/IDEgOiAtMSkgKiBkaXN0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRhdGFbMyArIChpbmRleCArIHgpICogNF0gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHNpZ25lZERpc3RhbmNlICsgb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcG9zID0ge1xuICAgICAgICB5OiAodGhpcy5uZXh0Um93ICsgbiArIDAuNSkgLyB0aGlzLmhlaWdodCxcbiAgICAgICAgaGVpZ2h0OiAyICogbiAvIHRoaXMuaGVpZ2h0LFxuICAgICAgICB3aWR0aDogbGVuZ3RoXG4gICAgfTtcblxuICAgIHRoaXMubmV4dFJvdyArPSBoZWlnaHQ7XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG5cbiAgICByZXR1cm4gcG9zO1xufTtcblxuTGluZUF0bGFzLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oZ2wpIHtcbiAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICB0aGlzLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLlJFUEVBVCk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLlJFUEVBVCk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy5kYXRhKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5MaW5lQXRsYXMucHJvdG90eXBlLmRlYnVnID0gZnVuY3Rpb24oKSB7XG5cbiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBjYW52YXMuc3R5bGUudG9wID0gMDtcbiAgICBjYW52YXMuc3R5bGUubGVmdCA9IDA7XG4gICAgY2FudmFzLnN0eWxlLmJhY2tncm91bmQgPSAnI2ZmMCc7XG5cbiAgICBjYW52YXMud2lkdGggPSB0aGlzLndpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodDtcblxuICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB2YXIgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLnNkZikge1xuICAgICAgICAgICAgdmFyIGsgPSBpICogNDtcbiAgICAgICAgICAgIGRhdGEuZGF0YVtrXSA9IGRhdGEuZGF0YVtrICsgMV0gPSBkYXRhLmRhdGFbayArIDJdID0gMDtcbiAgICAgICAgICAgIGRhdGEuZGF0YVtrICsgM10gPSB0aGlzLmRhdGFbaV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhLmRhdGFbaV0gPSB0aGlzLmRhdGFbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3R4LnB1dEltYWdlRGF0YShkYXRhLCAwLCAwKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnbHV0aWwgPSByZXF1aXJlKCcuL2dsX3V0aWwnKTtcbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgbWF0NCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpLm1hdDQ7XG52YXIgRnJhbWVIaXN0b3J5ID0gcmVxdWlyZSgnLi9mcmFtZV9oaXN0b3J5Jyk7XG5cbi8qXG4gKiBJbml0aWFsaXplIGEgbmV3IHBhaW50ZXIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7Q2FudmFzfSBnbCBhbiBleHBlcmltZW50YWwtd2ViZ2wgZHJhd2luZyBjb250ZXh0XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gR0xQYWludGVyO1xuZnVuY3Rpb24gR0xQYWludGVyKGdsLCB0cmFuc2Zvcm0pIHtcbiAgICB0aGlzLmdsID0gZ2x1dGlsLmV4dGVuZChnbCk7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG5cbiAgICB0aGlzLnJldXNhYmxlVGV4dHVyZXMgPSB7fTtcbiAgICB0aGlzLnByZUZib3MgPSB7fTtcblxuICAgIHRoaXMudGlsZUV4dGVudCA9IDQwOTY7XG4gICAgdGhpcy5mcmFtZUhpc3RvcnkgPSBuZXcgRnJhbWVIaXN0b3J5KCk7XG5cbiAgICB0aGlzLnNldHVwKCk7XG59XG5cbi8qXG4gKiBVcGRhdGUgdGhlIEdMIHZpZXdwb3J0LCBwcm9qZWN0aW9uIG1hdHJpeCwgYW5kIHRyYW5zZm9ybXMgdG8gY29tcGVuc2F0ZVxuICogZm9yIGEgbmV3IHdpZHRoIGFuZCBoZWlnaHQgdmFsdWUuXG4gKi9cbkdMUGFpbnRlci5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICB0aGlzLndpZHRoID0gd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuXG59O1xuXG5cbkdMUGFpbnRlci5wcm90b3R5cGUuc2V0dXAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgZ2wudmVyYm9zZSA9IHRydWU7XG5cbiAgICAvLyBXZSBhcmUgYmxlbmRpbmcgdGhlIG5ldyBwaXhlbHMgKmJlaGluZCogdGhlIGV4aXN0aW5nIHBpeGVscy4gVGhhdCB3YXkgd2UgY2FuXG4gICAgLy8gZHJhdyBmcm9udC10by1iYWNrIGFuZCB1c2UgdGhlbiBzdGVuY2lsIGJ1ZmZlciB0byBjdWxsIG9wYXF1ZSBwaXhlbHMgZWFybHkuXG4gICAgZ2wuZW5hYmxlKGdsLkJMRU5EKTtcbiAgICBnbC5ibGVuZEZ1bmMoZ2wuT05FX01JTlVTX0RTVF9BTFBIQSwgZ2wuT05FKTtcblxuICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzaGFkZXJzXG4gICAgdGhpcy5kZWJ1Z1NoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ2RlYnVnJyxcbiAgICAgICAgWydhX3BvcyddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfcG9pbnRzaXplJywgJ3VfY29sb3InXSk7XG5cbiAgICB0aGlzLmdhdXNzaWFuU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignZ2F1c3NpYW4nLFxuICAgICAgICBbJ2FfcG9zJ10sXG4gICAgICAgIFsndV9tYXRyaXgnLCAndV9pbWFnZScsICd1X29mZnNldCddKTtcblxuICAgIHRoaXMucmFzdGVyU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcigncmFzdGVyJyxcbiAgICAgICAgWydhX3BvcycsICdhX3RleHR1cmVfcG9zJ10sXG4gICAgICAgIFsndV9tYXRyaXgnLCAndV9icmlnaHRuZXNzX2xvdycsICd1X2JyaWdodG5lc3NfaGlnaCcsICd1X3NhdHVyYXRpb25fZmFjdG9yJywgJ3Vfc3Bpbl93ZWlnaHRzJywgJ3VfY29udHJhc3RfZmFjdG9yJywgJ3Vfb3BhY2l0eTAnLCAndV9vcGFjaXR5MScsICd1X2ltYWdlMCcsICd1X2ltYWdlMScsICd1X3RsX3BhcmVudCcsICd1X3NjYWxlX3BhcmVudCcsICd1X2J1ZmZlcl9zY2FsZSddKTtcblxuICAgIHRoaXMubGluZVNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ2xpbmUnLFxuICAgICAgICBbJ2FfcG9zJywgJ2FfZGF0YSddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfbGluZXdpZHRoJywgJ3VfY29sb3InLCAndV9yYXRpbycsICd1X2JsdXInLCAndV9leHRyYScsICd1X2FudGlhbGlhc2luZ21hdHJpeCddKTtcblxuICAgIHRoaXMubGluZXBhdHRlcm5TaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdsaW5lcGF0dGVybicsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9kYXRhJ10sXG4gICAgICAgIFsndV9tYXRyaXgnLCAndV9leG1hdHJpeCcsICd1X2xpbmV3aWR0aCcsICd1X3JhdGlvJywgJ3VfcGF0dGVybl9zaXplX2EnLCAndV9wYXR0ZXJuX3NpemVfYicsICd1X3BhdHRlcm5fdGxfYScsICd1X3BhdHRlcm5fYnJfYScsICd1X3BhdHRlcm5fdGxfYicsICd1X3BhdHRlcm5fYnJfYicsICd1X2JsdXInLCAndV9mYWRlJywgJ3Vfb3BhY2l0eSddKTtcblxuICAgIHRoaXMubGluZXNkZnBhdHRlcm5TaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdsaW5lc2RmcGF0dGVybicsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9kYXRhJ10sXG4gICAgICAgIFsndV9tYXRyaXgnLCAndV9leG1hdHJpeCcsICd1X2xpbmV3aWR0aCcsICd1X2NvbG9yJywgJ3VfcmF0aW8nLCAndV9ibHVyJywgJ3VfcGF0dGVybnNjYWxlX2EnLCAndV90ZXhfeV9hJywgJ3VfcGF0dGVybnNjYWxlX2InLCAndV90ZXhfeV9iJywgJ3VfaW1hZ2UnLCAndV9zZGZnYW1tYScsICd1X21peCddKTtcblxuICAgIHRoaXMuZG90U2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignZG90JyxcbiAgICAgICAgWydhX3BvcyddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3Vfc2l6ZScsICd1X2NvbG9yJywgJ3VfYmx1ciddKTtcblxuICAgIHRoaXMuc2RmU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignc2RmJyxcbiAgICAgICAgWydhX3BvcycsICdhX29mZnNldCcsICdhX2RhdGExJywgJ2FfZGF0YTInXSxcbiAgICAgICAgWyd1X21hdHJpeCcsICd1X2V4bWF0cml4JywgJ3VfdGV4dHVyZScsICd1X3RleHNpemUnLCAndV9jb2xvcicsICd1X2dhbW1hJywgJ3VfYnVmZmVyJywgJ3Vfem9vbScsICd1X2ZhZGVkaXN0JywgJ3VfbWluZmFkZXpvb20nLCAndV9tYXhmYWRlem9vbScsICd1X2ZhZGV6b29tJywgJ3Vfc2tld2VkJywgJ3VfZXh0cmEnXSk7XG5cbiAgICB0aGlzLmljb25TaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdpY29uJyxcbiAgICAgICAgWydhX3BvcycsICdhX29mZnNldCcsICdhX2RhdGExJywgJ2FfZGF0YTInXSxcbiAgICAgICAgWyd1X21hdHJpeCcsICd1X2V4bWF0cml4JywgJ3VfdGV4dHVyZScsICd1X3RleHNpemUnLCAndV96b29tJywgJ3VfZmFkZWRpc3QnLCAndV9taW5mYWRlem9vbScsICd1X21heGZhZGV6b29tJywgJ3VfZmFkZXpvb20nLCAndV9vcGFjaXR5JywgJ3Vfc2tld2VkJywgJ3VfZXh0cmEnXSk7XG5cbiAgICB0aGlzLm91dGxpbmVTaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdvdXRsaW5lJyxcbiAgICAgICAgWydhX3BvcyddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfY29sb3InLCAndV93b3JsZCddXG4gICAgKTtcblxuICAgIHRoaXMucGF0dGVyblNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ3BhdHRlcm4nLFxuICAgICAgICBbJ2FfcG9zJ10sXG4gICAgICAgIFsndV9tYXRyaXgnLCAndV9wYXR0ZXJuX3RsX2EnLCAndV9wYXR0ZXJuX2JyX2EnLCAndV9wYXR0ZXJuX3RsX2InLCAndV9wYXR0ZXJuX2JyX2InLCAndV9taXgnLCAndV9wYXR0ZXJubWF0cml4X2EnLCAndV9wYXR0ZXJubWF0cml4X2InLCAndV9vcGFjaXR5JywgJ3VfaW1hZ2UnXVxuICAgICk7XG5cbiAgICB0aGlzLmZpbGxTaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdmaWxsJyxcbiAgICAgICAgWydhX3BvcyddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfY29sb3InXVxuICAgICk7XG5cbiAgICB0aGlzLmNvbGxpc2lvbkJveFNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ2NvbGxpc2lvbmJveCcsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9leHRydWRlJywgJ2FfZGF0YSddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3Vfc2NhbGUnLCAndV96b29tJywgJ3VfbWF4em9vbSddXG4gICAgKTtcblxuICAgIHRoaXMuaWRlbnRpdHlNYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuXG4gICAgLy8gVGhlIGJhY2tncm91bmRCdWZmZXIgaXMgdXNlZCB3aGVuIGRyYXdpbmcgdG8gdGhlIGZ1bGwgKmNhbnZhcypcbiAgICB0aGlzLmJhY2tncm91bmRCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmJhY2tncm91bmRCdWZmZXIuaXRlbVNpemUgPSAyO1xuICAgIHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtQ291bnQgPSA0O1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLmJhY2tncm91bmRCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgSW50MTZBcnJheShbLTEsIC0xLCAxLCAtMSwgLTEsIDEsIDEsIDFdKSwgZ2wuU1RBVElDX0RSQVcpO1xuXG4gICAgLy8gVGhlIHRpbGVFeHRlbnRCdWZmZXIgaXMgdXNlZCB3aGVuIGRyYXdpbmcgdG8gYSBmdWxsICp0aWxlKlxuICAgIHRoaXMudGlsZUV4dGVudEJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtU2l6ZSA9IDQ7XG4gICAgdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1Db3VudCA9IDQ7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMudGlsZUV4dGVudEJ1ZmZlcik7XG4gICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBJbnQxNkFycmF5KFtcbiAgICAgICAgLy8gdGlsZSBjb29yZCB4LCB0aWxlIGNvb3JkIHksIHRleHR1cmUgY29vcmQgeCwgdGV4dHVyZSBjb29yZCB5XG4gICAgICAgICAgICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgIDAsIDAsXG4gICAgICAgIHRoaXMudGlsZUV4dGVudCwgMCwgICAgICAgICAgICAgICAgMzI3NjcsIDAsXG4gICAgICAgICAgICAgICAgICAgICAgMCwgdGhpcy50aWxlRXh0ZW50LCAgICAgIDAsIDMyNzY3LFxuICAgICAgICB0aGlzLnRpbGVFeHRlbnQsIHRoaXMudGlsZUV4dGVudCwgIDMyNzY3LCAzMjc2N1xuICAgIF0pLCBnbC5TVEFUSUNfRFJBVyk7XG5cbiAgICAvLyBUaGUgZGVidWdCdWZmZXIgaXMgdXNlZCB0byBkcmF3IHRpbGUgb3V0bGluZXMgZm9yIGRlYnVnZ2luZ1xuICAgIHRoaXMuZGVidWdCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmRlYnVnQnVmZmVyLml0ZW1TaXplID0gMjtcbiAgICB0aGlzLmRlYnVnQnVmZmVyLml0ZW1Db3VudCA9IDU7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuZGVidWdCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgSW50MTZBcnJheShbMCwgMCwgNDA5NSwgMCwgNDA5NSwgNDA5NSwgMCwgNDA5NSwgMCwgMF0pLCBnbC5TVEFUSUNfRFJBVyk7XG5cbiAgICAvLyBUaGUgZGVidWdUZXh0QnVmZmVyIGlzIHVzZWQgdG8gZHJhdyB0aWxlIElEcyBmb3IgZGVidWdnaW5nXG4gICAgdGhpcy5kZWJ1Z1RleHRCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmRlYnVnVGV4dEJ1ZmZlci5pdGVtU2l6ZSA9IDI7XG59O1xuXG4vKlxuICogUmVzZXQgdGhlIGNvbG9yIGJ1ZmZlcnMgb2YgdGhlIGRyYXdpbmcgY2FudmFzLlxuICovXG5HTFBhaW50ZXIucHJvdG90eXBlLmNsZWFyQ29sb3IgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgIGdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7XG4gICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7XG59O1xuXG4vKlxuICogUmVzZXQgdGhlIGRyYXdpbmcgY2FudmFzIGJ5IGNsZWFyaW5nIHRoZSBzdGVuY2lsIGJ1ZmZlciBzbyB0aGF0IHdlIGNhbiBkcmF3XG4gKiBuZXcgdGlsZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24sIHdoaWxlIHJldGFpbmluZyBwcmV2aW91c2x5IGRyYXduIHBpeGVscy5cbiAqL1xuR0xQYWludGVyLnByb3RvdHlwZS5jbGVhclN0ZW5jaWwgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgIGdsLmNsZWFyU3RlbmNpbCgweDApO1xuICAgIGdsLnN0ZW5jaWxNYXNrKDB4RkYpO1xuICAgIGdsLmNsZWFyKGdsLlNURU5DSUxfQlVGRkVSX0JJVCk7XG59O1xuXG5HTFBhaW50ZXIucHJvdG90eXBlLmRyYXdDbGlwcGluZ01hc2sgPSBmdW5jdGlvbih0aWxlKSB7XG4gICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICBnbC5zd2l0Y2hTaGFkZXIodGhpcy5maWxsU2hhZGVyLCB0aWxlLnBvc01hdHJpeCk7XG4gICAgZ2wuY29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuICAgIC8vIENsZWFyIHRoZSBlbnRpcmUgc3RlbmNpbCBidWZmZXIsIGV4Y2VwdCBmb3IgdGhlIDd0aCBiaXQsIHdoaWNoIHN0b3Jlc1xuICAgIC8vIHRoZSBnbG9iYWwgY2xpcHBpbmcgbWFzayB0aGF0IGFsbG93cyB1cyB0byBhdm9pZCBkcmF3aW5nIGluIHJlZ2lvbnMgb2ZcbiAgICAvLyB0aWxlcyB3ZSd2ZSBhbHJlYWR5IHBhaW50ZWQgaW4uXG4gICAgZ2wuY2xlYXJTdGVuY2lsKDB4MCk7XG4gICAgZ2wuc3RlbmNpbE1hc2soMHhCRik7XG4gICAgZ2wuY2xlYXIoZ2wuU1RFTkNJTF9CVUZGRVJfQklUKTtcblxuICAgIC8vIFRoZSBzdGVuY2lsIHRlc3Qgd2lsbCBmYWlsIGFsd2F5cywgbWVhbmluZyB3ZSBzZXQgYWxsIHBpeGVscyBjb3ZlcmVkXG4gICAgLy8gYnkgdGhpcyBnZW9tZXRyeSB0byAweDgwLiBXZSB1c2UgdGhlIGhpZ2hlc3QgYml0IDB4ODAgdG8gbWFyayB0aGUgcmVnaW9uc1xuICAgIC8vIHdlIHdhbnQgdG8gZHJhdyBpbi4gQWxsIHBpeGVscyB0aGF0IGhhdmUgdGhpcyBiaXQgKm5vdCogc2V0IHdpbGwgbmV2ZXIgYmVcbiAgICAvLyBkcmF3biBpbi5cbiAgICBnbC5zdGVuY2lsRnVuYyhnbC5FUVVBTCwgMHhDMCwgMHg0MCk7XG4gICAgZ2wuc3RlbmNpbE1hc2soMHhDMCk7XG4gICAgZ2wuc3RlbmNpbE9wKGdsLlJFUExBQ0UsIGdsLktFRVAsIGdsLktFRVApO1xuXG4gICAgLy8gRHJhdyB0aGUgY2xpcHBpbmcgbWFza1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnRpbGVFeHRlbnRCdWZmZXIpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5maWxsU2hhZGVyLmFfcG9zLCB0aGlzLnRpbGVFeHRlbnRCdWZmZXIuaXRlbVNpemUsIGdsLlNIT1JULCBmYWxzZSwgOCwgMCk7XG4gICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1Db3VudCk7XG5cbiAgICBnbC5zdGVuY2lsRnVuYyhnbC5FUVVBTCwgMHg4MCwgMHg4MCk7XG4gICAgZ2wuc3RlbmNpbE9wKGdsLktFRVAsIGdsLktFRVAsIGdsLlJFUExBQ0UpO1xuICAgIGdsLnN0ZW5jaWxNYXNrKDB4MDApO1xuICAgIGdsLmNvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTtcbn07XG5cbi8vIE92ZXJyaWRkZW4gYnkgaGVhZGxlc3MgdGVzdHMuXG5HTFBhaW50ZXIucHJvdG90eXBlLnByZXBhcmVCdWZmZXJzID0gZnVuY3Rpb24oKSB7fTtcbkdMUGFpbnRlci5wcm90b3R5cGUuYmluZERlZmF1bHRGcmFtZWJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBnbCA9IHRoaXMuZ2w7XG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbn07XG5cbnZhciBkcmF3ID0ge1xuICAgIHN5bWJvbDogcmVxdWlyZSgnLi9kcmF3X3N5bWJvbCcpLFxuICAgIGxpbmU6IHJlcXVpcmUoJy4vZHJhd19saW5lJyksXG4gICAgZmlsbDogcmVxdWlyZSgnLi9kcmF3X2ZpbGwnKSxcbiAgICByYXN0ZXI6IHJlcXVpcmUoJy4vZHJhd19yYXN0ZXInKSxcbiAgICBiYWNrZ3JvdW5kOiByZXF1aXJlKCcuL2RyYXdfYmFja2dyb3VuZCcpLFxuICAgIGRlYnVnOiByZXF1aXJlKCcuL2RyYXdfZGVidWcnKSxcbiAgICB2ZXJ0aWNlczogcmVxdWlyZSgnLi9kcmF3X3ZlcnRpY2VzJylcbn07XG5cbkdMUGFpbnRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oc3R5bGUsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIHRoaXMubGluZUF0bGFzID0gc3R5bGUubGluZUF0bGFzO1xuXG4gICAgdGhpcy5zcHJpdGVBdGxhcyA9IHN0eWxlLnNwcml0ZUF0bGFzO1xuICAgIHRoaXMuc3ByaXRlQXRsYXMuc2V0U3ByaXRlKHN0eWxlLnNwcml0ZSk7XG5cbiAgICB0aGlzLmdseXBoQXRsYXMgPSBzdHlsZS5nbHlwaEF0bGFzO1xuICAgIHRoaXMuZ2x5cGhBdGxhcy5iaW5kKHRoaXMuZ2wpO1xuXG4gICAgdGhpcy5mcmFtZUhpc3RvcnkucmVjb3JkKHRoaXMudHJhbnNmb3JtLnpvb20pO1xuXG4gICAgdGhpcy5wcmVwYXJlQnVmZmVycygpO1xuICAgIHRoaXMuY2xlYXJDb2xvcigpO1xuXG4gICAgZm9yICh2YXIgaSA9IHN0eWxlLl9ncm91cHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGdyb3VwID0gc3R5bGUuX2dyb3Vwc1tpXTtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHN0eWxlLnNvdXJjZXNbZ3JvdXAuc291cmNlXTtcblxuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbCgpO1xuICAgICAgICAgICAgc291cmNlLnJlbmRlcihncm91cCwgdGhpcyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChncm91cC5zb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kcmF3TGF5ZXJzKGdyb3VwLCB0aGlzLmlkZW50aXR5TWF0cml4KTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkdMUGFpbnRlci5wcm90b3R5cGUuZHJhd1RpbGUgPSBmdW5jdGlvbih0aWxlLCBsYXllcnMpIHtcbiAgICB0aGlzLmRyYXdDbGlwcGluZ01hc2sodGlsZSk7XG4gICAgdGhpcy5kcmF3TGF5ZXJzKGxheWVycywgdGlsZS5wb3NNYXRyaXgsIHRpbGUpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICBkcmF3LmRlYnVnKHRoaXMsIHRpbGUpO1xuICAgIH1cbn07XG5cbkdMUGFpbnRlci5wcm90b3R5cGUuZHJhd0xheWVycyA9IGZ1bmN0aW9uKGxheWVycywgbWF0cml4LCB0aWxlKSB7XG4gICAgZm9yICh2YXIgaSA9IGxheWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG5cbiAgICAgICAgaWYgKGxheWVyLmhpZGRlbilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIGRyYXdbbGF5ZXIudHlwZV0odGhpcywgbGF5ZXIsIG1hdHJpeCwgdGlsZSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52ZXJ0aWNlcykge1xuICAgICAgICAgICAgZHJhdy52ZXJ0aWNlcyh0aGlzLCBsYXllciwgbWF0cml4LCB0aWxlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8vIERyYXdzIG5vbi1vcGFxdWUgYXJlYXMuIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbkdMUGFpbnRlci5wcm90b3R5cGUuZHJhd1N0ZW5jaWxCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgIGdsLnN3aXRjaFNoYWRlcih0aGlzLmZpbGxTaGFkZXIsIHRoaXMuaWRlbnRpdHlNYXRyaXgpO1xuXG4gICAgLy8gQmxlbmQgdG8gdGhlIGZyb250LCBub3QgdGhlIGJhY2suXG4gICAgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgZ2wuc3RlbmNpbE1hc2soMHgwMCk7XG4gICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuRVFVQUwsIDB4ODAsIDB4ODApO1xuXG4gICAgLy8gRHJ3IHRoZSBmaWxsaW5nIHF1YWQgd2hlcmUgdGhlIHN0ZW5jaWwgYnVmZmVyIGlzbid0IHNldC5cbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5iYWNrZ3JvdW5kQnVmZmVyKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuZmlsbFNoYWRlci5hX3BvcywgdGhpcy5iYWNrZ3JvdW5kQnVmZmVyLml0ZW1TaXplLCBnbC5TSE9SVCwgZmFsc2UsIDAsIDApO1xuICAgIGdsLnVuaWZvcm00ZnYodGhpcy5maWxsU2hhZGVyLnVfY29sb3IsIFswLCAwLCAwLCAwLjVdKTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCB0aGlzLmJhY2tncm91bmRCdWZmZXIuaXRlbUNvdW50KTtcblxuICAgIC8vIFJldmVydCBibGVuZGluZyBtb2RlIHRvIGJsZW5kIHRvIHRoZSBiYWNrLlxuICAgIGdsLmJsZW5kRnVuYyhnbC5PTkVfTUlOVVNfRFNUX0FMUEhBLCBnbC5PTkUpO1xufTtcblxuR0xQYWludGVyLnByb3RvdHlwZS50cmFuc2xhdGVNYXRyaXggPSBmdW5jdGlvbihtYXRyaXgsIHRpbGUsIHRyYW5zbGF0ZSwgYW5jaG9yKSB7XG4gICAgaWYgKCF0cmFuc2xhdGVbMF0gJiYgIXRyYW5zbGF0ZVsxXSkgcmV0dXJuIG1hdHJpeDtcblxuICAgIGlmIChhbmNob3IgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgICAgdmFyIHNpbkEgPSBNYXRoLnNpbigtdGhpcy50cmFuc2Zvcm0uYW5nbGUpO1xuICAgICAgICB2YXIgY29zQSA9IE1hdGguY29zKC10aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgIHRyYW5zbGF0ZSA9IFtcbiAgICAgICAgICAgIHRyYW5zbGF0ZVswXSAqIGNvc0EgLSB0cmFuc2xhdGVbMV0gKiBzaW5BLFxuICAgICAgICAgICAgdHJhbnNsYXRlWzBdICogc2luQSArIHRyYW5zbGF0ZVsxXSAqIGNvc0FcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICB2YXIgdGlsZVBpeGVsUmF0aW8gPSB0aGlzLnRyYW5zZm9ybS5zY2FsZSAvICgxIDw8IHRpbGUuY29vcmQueikgLyAodGlsZS50aWxlRXh0ZW50IC8gdGlsZS50aWxlU2l6ZSk7XG4gICAgdmFyIHRyYW5zbGF0aW9uID0gW1xuICAgICAgICB0cmFuc2xhdGVbMF0gLyB0aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgdHJhbnNsYXRlWzFdIC8gdGlsZVBpeGVsUmF0aW8sXG4gICAgICAgIDBcbiAgICBdO1xuXG4gICAgdmFyIHRyYW5zbGF0ZWRNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICBtYXQ0LnRyYW5zbGF0ZSh0cmFuc2xhdGVkTWF0cml4LCBtYXRyaXgsIHRyYW5zbGF0aW9uKTtcbiAgICByZXR1cm4gdHJhbnNsYXRlZE1hdHJpeDtcbn07XG5cbkdMUGFpbnRlci5wcm90b3R5cGUuc2F2ZVRleHR1cmUgPSBmdW5jdGlvbih0ZXh0dXJlKSB7XG4gICAgdmFyIHRleHR1cmVzID0gdGhpcy5yZXVzYWJsZVRleHR1cmVzW3RleHR1cmUuc2l6ZV07XG4gICAgaWYgKCF0ZXh0dXJlcykge1xuICAgICAgICB0aGlzLnJldXNhYmxlVGV4dHVyZXNbdGV4dHVyZS5zaXplXSA9IFt0ZXh0dXJlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0dXJlcy5wdXNoKHRleHR1cmUpO1xuICAgIH1cbn07XG5cblxuR0xQYWludGVyLnByb3RvdHlwZS5nZXRUZXh0dXJlID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHZhciB0ZXh0dXJlcyA9IHRoaXMucmV1c2FibGVUZXh0dXJlc1tzaXplXTtcbiAgICByZXR1cm4gdGV4dHVyZXMgJiYgdGV4dHVyZXMubGVuZ3RoID4gMCA/IHRleHR1cmVzLnBvcCgpIDogbnVsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnbGlmeSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgXCJkZWJ1Z1wiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gZmxvYXQgdV9wb2ludHNpemU7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3ZvaWQgbWFpbigpe2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3Msc3RlcCgzMjc2Ny4sYV9wb3MueCksMSk7Z2xfUG9pbnRTaXplPXVfcG9pbnRzaXplO31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHZlYzQgdV9jb2xvcjt2b2lkIG1haW4oKXtnbF9GcmFnQ29sb3I9dV9jb2xvcjt9XCJ9LFxuICAgIFwiZG90XCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gZmxvYXQgdV9zaXplO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3ZvaWQgbWFpbigpe2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTtnbF9Qb2ludFNpemU9dV9zaXplO31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHZlYzQgdV9jb2xvcjt1bmlmb3JtIGZsb2F0IHVfYmx1cjt2b2lkIG1haW4oKXtmbG9hdCBhLGI7YT1sZW5ndGgoZ2xfUG9pbnRDb29yZC0uNSk7Yj1zbW9vdGhzdGVwKC41LC41LXVfYmx1cixhKTtnbF9GcmFnQ29sb3I9dV9jb2xvcipiO31cIn0sXG4gICAgXCJmaWxsXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3ZvaWQgbWFpbigpe2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTtnbF9Qb2ludFNpemU9Mi47fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3ZvaWQgbWFpbigpe2dsX0ZyYWdDb2xvcj11X2NvbG9yO31cIn0sXG4gICAgXCJnYXVzc2lhblwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV9vZmZzZXQ7dmFyeWluZyB2ZWMyIGFbM107dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZlYzIgYj1nbF9Qb3NpdGlvbi54eS8yLisuNTthWzBdPWI7YVsxXT1iK3Vfb2Zmc2V0KjEuMTgyNDI1NTIzODA2MzU2MzthWzJdPWItdV9vZmZzZXQqMS4xODI0MjU1MjM4MDYzNTYzO31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiBhWzNdO3ZvaWQgbWFpbigpe3ZlYzQgYj12ZWM0KDApO2IrPXRleHR1cmUyRCh1X2ltYWdlLGFbMF0pKi40MDI2MTk5NDY4OTQyNDc0NjtiKz10ZXh0dXJlMkQodV9pbWFnZSxhWzFdKSouMjk4NjkwMDI2NTUyODc2MztiKz10ZXh0dXJlMkQodV9pbWFnZSxhWzJdKSouMjk4NjkwMDI2NTUyODc2MztnbF9GcmFnQ29sb3I9Yjt9XCJ9LFxuICAgIFwibGluZVwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3JhdGlvLHVfZXh0cmE7dW5pZm9ybSB2ZWMyIHVfbGluZXdpZHRoO3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gbWF0MiB1X2FudGlhbGlhc2luZ21hdHJpeDt2YXJ5aW5nIHZlYzIgYTt2YXJ5aW5nIGZsb2F0IGIsYzt2b2lkIG1haW4oKXt2ZWMyIGQsZTtkPWFfZGF0YS54eTtlPW1vZChhX3BvcywyLik7ZS55PXNpZ24oZS55LS41KTthPWU7dmVjNCBmPXZlYzQodV9saW5ld2lkdGgucypkKi4wMTU4NzMwMTYsMCwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGZsb29yKGFfcG9zKi41KStmLnh5L3VfcmF0aW8sMCwxKTtmbG9hdCBnLGgsaTtnPWdsX1Bvc2l0aW9uLnkvZ2xfUG9zaXRpb24udztoPWxlbmd0aChkKS9sZW5ndGgodV9hbnRpYWxpYXNpbmdtYXRyaXgqZCk7aT0xLi8oMS4tZyp1X2V4dHJhKTtjPWkqaDt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWMyIHVfbGluZXdpZHRoLHVfZGFzaGFycmF5O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe2Zsb2F0IGQsZSxmO2Q9bGVuZ3RoKGEpKnVfbGluZXdpZHRoLnM7ZT11X2JsdXIqYztmPWNsYW1wKG1pbihkLSh1X2xpbmV3aWR0aC50LWUpLHVfbGluZXdpZHRoLnMtZCkvZSwwLiwxLik7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqZjt9XCJ9LFxuICAgIFwibGluZXBhdHRlcm5cIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjNCBhX2RhdGE7dW5pZm9ybSBtYXQ0IHVfbWF0cml4LHVfZXhtYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3JhdGlvO3VuaWZvcm0gdmVjMiB1X2xpbmV3aWR0aDt1bmlmb3JtIHZlYzQgdV9jb2xvcjt2YXJ5aW5nIHZlYzIgYTt2YXJ5aW5nIGZsb2F0IGI7dm9pZCBtYWluKCl7dmVjMiBjLGUsZixnO2M9YV9kYXRhLnh5O2Zsb2F0IGQ9YV9kYXRhLnoqMTI4LithX2RhdGEudztlPW1vZChhX3BvcywyLik7ZS55PXNpZ24oZS55LS41KTthPWU7Zj1jKi4wMTU4NzMwMTY7Zz11X2xpbmV3aWR0aC5zKmY7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChmbG9vcihhX3BvcyouNSkrZy54eS91X3JhdGlvLDAsMSk7Yj1kO31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGgsdV9wYXR0ZXJuX3NpemVfYSx1X3BhdHRlcm5fc2l6ZV9iLHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iO3VuaWZvcm0gZmxvYXQgdV9wb2ludCx1X2JsdXIsdV9mYWRlLHVfb3BhY2l0eTt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYjt2b2lkIG1haW4oKXtmbG9hdCBjLGQsZSxmLGcsaDtjPWxlbmd0aChhKSp1X2xpbmV3aWR0aC5zO2Q9Y2xhbXAobWluKGMtKHVfbGluZXdpZHRoLnQtdV9ibHVyKSx1X2xpbmV3aWR0aC5zLWMpL3VfYmx1ciwwLiwxLik7ZT1tb2QoYi91X3BhdHRlcm5fc2l6ZV9hLngsMS4pO2Y9bW9kKGIvdV9wYXR0ZXJuX3NpemVfYi54LDEuKTtnPS41K2EueSp1X2xpbmV3aWR0aC5zL3VfcGF0dGVybl9zaXplX2EueTtoPS41K2EueSp1X2xpbmV3aWR0aC5zL3VfcGF0dGVybl9zaXplX2IueTt2ZWMyIGksajtpPW1peCh1X3BhdHRlcm5fdGxfYSx1X3BhdHRlcm5fYnJfYSx2ZWMyKGUsZykpO2o9bWl4KHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iLHZlYzIoZixoKSk7dmVjNCBrPW1peCh0ZXh0dXJlMkQodV9pbWFnZSxpKSx0ZXh0dXJlMkQodV9pbWFnZSxqKSx1X2ZhZGUpO2QqPXVfb3BhY2l0eTtnbF9GcmFnQ29sb3I9aypkO31cIn0sXG4gICAgXCJsaW5lc2RmcGF0dGVyblwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTt1bmlmb3JtIG1hdDQgdV9tYXRyaXgsdV9leG1hdHJpeDt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGgsdV9wYXR0ZXJuc2NhbGVfYSx1X3BhdHRlcm5zY2FsZV9iO3VuaWZvcm0gZmxvYXQgdV9yYXRpbyx1X3RleF95X2EsdV90ZXhfeV9iO3ZhcnlpbmcgdmVjMiBhLGIsYzt2b2lkIG1haW4oKXt2ZWMyIGQsZjtkPWFfZGF0YS54eTtmbG9hdCBlPWFfZGF0YS56KjEyOC4rYV9kYXRhLnc7Zj1tb2QoYV9wb3MsMi4pO2YueT1zaWduKGYueS0uNSk7YT1mO3ZlYzQgZz12ZWM0KHVfbGluZXdpZHRoLnMqZCouMDE1ODczMDE2LDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChmbG9vcihhX3BvcyouNSkrZy54eS91X3JhdGlvLDAsMSk7Yj12ZWMyKGUqdV9wYXR0ZXJuc2NhbGVfYS54LGYueSp1X3BhdHRlcm5zY2FsZV9hLnkrdV90ZXhfeV9hKTtjPXZlYzIoZSp1X3BhdHRlcm5zY2FsZV9iLngsZi55KnVfcGF0dGVybnNjYWxlX2IueSt1X3RleF95X2IpO31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGg7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dW5pZm9ybSBmbG9hdCB1X2JsdXIsdV9zZGZnYW1tYSx1X21peDt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiBhLGIsYzt2b2lkIG1haW4oKXtmbG9hdCBkLGUsZixnLGg7ZD1sZW5ndGgoYSkqdV9saW5ld2lkdGgucztlPWNsYW1wKG1pbihkLSh1X2xpbmV3aWR0aC50LXVfYmx1ciksdV9saW5ld2lkdGgucy1kKS91X2JsdXIsMC4sMS4pO2Y9dGV4dHVyZTJEKHVfaW1hZ2UsYikuYTtnPXRleHR1cmUyRCh1X2ltYWdlLGMpLmE7aD1taXgoZixnLHVfbWl4KTtlKj1zbW9vdGhzdGVwKC41LXVfc2RmZ2FtbWEsLjUrdV9zZGZnYW1tYSxoKTtnbF9GcmFnQ29sb3I9dV9jb2xvciplO31cIn0sXG4gICAgXCJvdXRsaW5lXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3dvcmxkO3ZhcnlpbmcgdmVjMiBhO3ZvaWQgbWFpbigpe2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTthPShnbF9Qb3NpdGlvbi54eS9nbF9Qb3NpdGlvbi53KzEuKS8yLip1X3dvcmxkO31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHZlYzQgdV9jb2xvcjt2YXJ5aW5nIHZlYzIgYTt2b2lkIG1haW4oKXtmbG9hdCBiLGM7Yj1sZW5ndGgoYS1nbF9GcmFnQ29vcmQueHkpO2M9c21vb3Roc3RlcCgxLiwwLixiKTtnbF9GcmFnQ29sb3I9dV9jb2xvcipjO31cIn0sXG4gICAgXCJwYXR0ZXJuXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gbWF0MyB1X3BhdHRlcm5tYXRyaXhfYSx1X3BhdHRlcm5tYXRyaXhfYjthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzIgYSxiO3ZvaWQgbWFpbigpe2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTthPSh1X3BhdHRlcm5tYXRyaXhfYSp2ZWMzKGFfcG9zLDEpKS54eTtiPSh1X3BhdHRlcm5tYXRyaXhfYip2ZWMzKGFfcG9zLDEpKS54eTt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHksdV9taXg7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIGEsYjt2b2lkIG1haW4oKXt2ZWMyIGMsZCxmLGc7Yz1tb2QoYSwxLik7ZD1taXgodV9wYXR0ZXJuX3RsX2EsdV9wYXR0ZXJuX2JyX2EsYyk7dmVjNCBlLGg7ZT10ZXh0dXJlMkQodV9pbWFnZSxkKTtmPW1vZChiLDEuKTtnPW1peCh1X3BhdHRlcm5fdGxfYix1X3BhdHRlcm5fYnJfYixmKTtoPXRleHR1cmUyRCh1X2ltYWdlLGcpO2dsX0ZyYWdDb2xvcj1taXgoZSxoLHVfbWl4KSp1X29wYWNpdHk7fVwifSxcbiAgICBcInJhc3RlclwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV90bF9wYXJlbnQ7dW5pZm9ybSBmbG9hdCB1X3NjYWxlX3BhcmVudCx1X2J1ZmZlcl9zY2FsZTthdHRyaWJ1dGUgdmVjMiBhX3BvcyxhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiBhLGI7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2E9KGFfdGV4dHVyZV9wb3MvMzI3NjcuLS41KS91X2J1ZmZlcl9zY2FsZSsuNTtiPWEqdV9zY2FsZV9wYXJlbnQrdV90bF9wYXJlbnQ7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gZmxvYXQgdV9vcGFjaXR5MCx1X29wYWNpdHkxLHVfYnJpZ2h0bmVzc19sb3csdV9icmlnaHRuZXNzX2hpZ2gsdV9zYXR1cmF0aW9uX2ZhY3Rvcix1X2NvbnRyYXN0X2ZhY3Rvcjt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlMCx1X2ltYWdlMTt2YXJ5aW5nIHZlYzIgYSxiO3VuaWZvcm0gdmVjMyB1X3NwaW5fd2VpZ2h0czt2b2lkIG1haW4oKXt2ZWM0IGMsZCxlO2M9dGV4dHVyZTJEKHVfaW1hZ2UwLGEpO2Q9dGV4dHVyZTJEKHVfaW1hZ2UxLGIpO2U9Yyp1X29wYWNpdHkwK2QqdV9vcGFjaXR5MTt2ZWMzIGYsaCxpO2Y9ZS5yZ2I7Zj12ZWMzKGRvdChmLHVfc3Bpbl93ZWlnaHRzLnh5eiksZG90KGYsdV9zcGluX3dlaWdodHMuenh5KSxkb3QoZix1X3NwaW5fd2VpZ2h0cy55engpKTtmbG9hdCBnPShlLnIrZS5nK2UuYikvMy47Zis9KGctZikqdV9zYXR1cmF0aW9uX2ZhY3RvcjtmPShmLS41KSp1X2NvbnRyYXN0X2ZhY3RvcisuNTtoPXZlYzModV9icmlnaHRuZXNzX2xvdyk7aT12ZWMzKHVfYnJpZ2h0bmVzc19oaWdoKTtnbF9GcmFnQ29sb3I9dmVjNChtaXgoaCxpLGYpLGUuYSk7fVwifSxcbiAgICBcImljb25cIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvcyxhX29mZnNldDthdHRyaWJ1dGUgdmVjNCBhX2RhdGExLGFfZGF0YTI7dW5pZm9ybSBtYXQ0IHVfbWF0cml4LHVfZXhtYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3pvb20sdV9mYWRlZGlzdCx1X21pbmZhZGV6b29tLHVfbWF4ZmFkZXpvb20sdV9mYWRlem9vbSx1X29wYWNpdHksdV9leHRyYTt1bmlmb3JtIGJvb2wgdV9za2V3ZWQ7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt2YXJ5aW5nIHZlYzIgYTt2YXJ5aW5nIGZsb2F0IGI7dm9pZCBtYWluKCl7dmVjMiBjLGU7Yz1hX2RhdGExLnh5O2Zsb2F0IGQsZixnLGgsaSxqO2Q9YV9kYXRhMVsyXTtlPWFfZGF0YTIuc3Q7Zj1lWzBdO2c9ZVsxXTtoPTEwLjtpPTIuLXN0ZXAoZix1X3pvb20pLSgxLi1zdGVwKGcsdV96b29tKSk7aj1jbGFtcCgodV9mYWRlem9vbS1kKS91X2ZhZGVkaXN0LDAuLDEuKTtpZih1X2ZhZGVkaXN0Pj0wLiliPWo7ZWxzZSBiPTEuLWo7aWYodV9tYXhmYWRlem9vbTxkKWI9MC47aWYodV9taW5mYWRlem9vbT49ZCliPTEuO2krPXN0ZXAoYiwwLik7aWYodV9za2V3ZWQpe3ZlYzQgaz11X2V4bWF0cml4KnZlYzQoYV9vZmZzZXQvNjQuLDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcytrLnh5LDAsMSk7Z2xfUG9zaXRpb24ueis9aSpnbF9Qb3NpdGlvbi53O31lbHNle3ZlYzQgaz11X2V4bWF0cml4KnZlYzQoYV9vZmZzZXQvNjQuLGksMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpK2s7fWE9Yy91X3RleHNpemU7Yio9dV9vcGFjaXR5O31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7dmFyeWluZyB2ZWMyIGE7dmFyeWluZyBmbG9hdCBiO3ZvaWQgbWFpbigpe2dsX0ZyYWdDb2xvcj10ZXh0dXJlMkQodV90ZXh0dXJlLGEpKmI7fVwifSxcbiAgICBcInNkZlwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTEsYV9kYXRhMjt1bmlmb3JtIG1hdDQgdV9tYXRyaXgsdV9leG1hdHJpeDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X2ZhZGVkaXN0LHVfbWluZmFkZXpvb20sdV9tYXhmYWRlem9vbSx1X2ZhZGV6b29tLHVfZXh0cmE7dW5pZm9ybSBib29sIHVfc2tld2VkO3VuaWZvcm0gdmVjMiB1X3RleHNpemU7dmFyeWluZyB2ZWMyIGE7dmFyeWluZyBmbG9hdCBiLGM7dm9pZCBtYWluKCl7dmVjMiBkLGY7ZD1hX2RhdGExLnh5O2Zsb2F0IGUsZyxoLGksaixrLGw7ZT1hX2RhdGExWzJdO2Y9YV9kYXRhMi5zdDtnPWZbMF07aD1mWzFdO2k9Mi4tc3RlcChnLHVfem9vbSktKDEuLXN0ZXAoaCx1X3pvb20pKTtqPWNsYW1wKCh1X2ZhZGV6b29tLWUpL3VfZmFkZWRpc3QsMC4sMS4pO2lmKHVfZmFkZWRpc3Q+PTAuKWI9ajtlbHNlIGI9MS4tajtpZih1X21heGZhZGV6b29tPGUpYj0wLjtpZih1X21pbmZhZGV6b29tPj1lKWI9MS47aSs9c3RlcChiLDAuKTtpZih1X3NrZXdlZCl7dmVjNCBrPXVfZXhtYXRyaXgqdmVjNChhX29mZnNldC82NC4sMCwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zK2sueHksMCwxKTtnbF9Qb3NpdGlvbi56Kz1pKmdsX1Bvc2l0aW9uLnc7fWVsc2V7dmVjNCBrPXVfZXhtYXRyaXgqdmVjNChhX29mZnNldC82NC4saSwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSkrazt9az1nbF9Qb3NpdGlvbi55L2dsX1Bvc2l0aW9uLnc7bD0xLi8oMS4tayp1X2V4dHJhKTtjPWw7YT1kL3VfdGV4c2l6ZTt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9idWZmZXIsdV9nYW1tYTt2YXJ5aW5nIHZlYzIgYTt2YXJ5aW5nIGZsb2F0IGIsYzt2b2lkIG1haW4oKXtmbG9hdCBkLGUsZjtkPXVfZ2FtbWEqYztlPXRleHR1cmUyRCh1X3RleHR1cmUsYSkuYTtmPXNtb290aHN0ZXAodV9idWZmZXItZCx1X2J1ZmZlcitkLGUpKmI7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqZjt9XCJ9LFxuICAgIFwiY29sbGlzaW9uYm94XCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3MsYV9leHRydWRlLGFfZGF0YTt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3NjYWxlO3ZhcnlpbmcgZmxvYXQgYSxiO3ZvaWQgbWFpbigpe2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MrYV9leHRydWRlL3Vfc2NhbGUsMCwxKTthPWFfZGF0YS54O2I9YV9kYXRhLnk7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gZmxvYXQgdV96b29tLHVfbWF4em9vbTt2YXJ5aW5nIGZsb2F0IGEsYjt2b2lkIG1haW4oKXtmbG9hdCBjPS41O2dsX0ZyYWdDb2xvcj12ZWM0KDAsMSwwLDEpKmM7aWYoYj51X3pvb20pZ2xfRnJhZ0NvbG9yPXZlYzQoMSwwLDAsMSkqYztpZih1X3pvb20+PWEpZ2xfRnJhZ0NvbG9yPXZlYzQoMCwwLDAsMSkqYyouMjU7aWYoYj49dV9tYXh6b29tKWdsX0ZyYWdDb2xvcj12ZWM0KDAsMCwxLDEpKmMqLjI7fVwifVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG52YXIgVGlsZVB5cmFtaWQgPSByZXF1aXJlKCcuL3RpbGVfcHlyYW1pZCcpO1xudmFyIFNvdXJjZSA9IHJlcXVpcmUoJy4vc291cmNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTlNvdXJjZTtcblxuLyoqXG4gKiBDcmVhdGUgYSBHZW9KU09OIGRhdGEgc291cmNlIGluc3RhbmNlIGdpdmVuIGFuIG9wdGlvbnMgb2JqZWN0XG4gKiBAY2xhc3MgR2VvSlNPTlNvdXJjZVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBvcHRpb25zLmRhdGEgQSBHZW9KU09OIGRhdGEgb2JqZWN0IG9yIFVSTCB0byBpdC4gVGhlIGxhdHRlciBpcyBwcmVmZXJhYmxlIGluIGNhc2Ugb2YgbGFyZ2UgR2VvSlNPTiBmaWxlcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXh6b29tPTE0XSBNYXhpbXVtIHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIGF0LlxuICogQGV4YW1wbGVcbiAqIHZhciBzb3VyY2VPYmogPSBuZXcgbWFwYm94Z2wuR2VvSlNPTlNvdXJjZSh7XG4gKiAgICBkYXRhOiB7XG4gKiAgICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgICAgICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgLTc2LjUzMDYzMjk3MjcxNzI5LFxuICogICAgICAgICAgICAgICAgICAgIDM5LjE4MTc0MDc3OTk0MTA4XG4gKiAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgIH1cbiAqICAgICAgICB9XVxuICogICAgfVxuICogfSk7XG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywgc291cmNlT2JqKTsgLy8gYWRkXG4gKiBtYXAucmVtb3ZlU291cmNlKCdzb21lIGlkJyk7ICAvLyByZW1vdmVcbiAqL1xuZnVuY3Rpb24gR2VvSlNPTlNvdXJjZShvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICB0aGlzLl9kYXRhID0gb3B0aW9ucy5kYXRhO1xuXG4gICAgaWYgKG9wdGlvbnMubWF4em9vbSAhPT0gdW5kZWZpbmVkKSB0aGlzLm1heHpvb20gPSBvcHRpb25zLm1heHpvb207XG5cbiAgICB0aGlzLl9weXJhbWlkID0gbmV3IFRpbGVQeXJhbWlkKHtcbiAgICAgICAgdGlsZVNpemU6IDUxMixcbiAgICAgICAgbWluem9vbTogdGhpcy5taW56b29tLFxuICAgICAgICBtYXh6b29tOiB0aGlzLm1heHpvb20sXG4gICAgICAgIGNhY2hlU2l6ZTogMjAsXG4gICAgICAgIGxvYWQ6IHRoaXMuX2xvYWRUaWxlLmJpbmQodGhpcyksXG4gICAgICAgIGFib3J0OiB0aGlzLl9hYm9ydFRpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgdW5sb2FkOiB0aGlzLl91bmxvYWRUaWxlLmJpbmQodGhpcyksXG4gICAgICAgIGFkZDogdGhpcy5fYWRkVGlsZS5iaW5kKHRoaXMpLFxuICAgICAgICByZW1vdmU6IHRoaXMuX3JlbW92ZVRpbGUuYmluZCh0aGlzKVxuICAgIH0pO1xufVxuXG5HZW9KU09OU291cmNlLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChFdmVudGVkLCAvKiogQGxlbmRzIEdlb0pTT05Tb3VyY2UucHJvdG90eXBlICove1xuICAgIG1pbnpvb206IDAsXG4gICAgbWF4em9vbTogMTQsXG4gICAgX2RpcnR5OiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHNvdXJjZSBnZW9qc29uIGRhdGEgYW5kIHJlcmVuZGVyIG1hcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBkYXRhIEEgR2VvSlNPTiBkYXRhIG9iamVjdCBvciBVUkwgdG8gaXQuIFRoZSBsYXR0ZXIgaXMgcHJlZmVyYWJsZSBpbiBjYXNlIG9mIGxhcmdlIEdlb0pTT04gZmlsZXMuXG4gICAgICogQHJldHVybnMge0dlb0pTT05Tb3VyY2V9IHRoaXNcbiAgICAgKi9cbiAgICBzZXREYXRhOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5maXJlKCdjaGFuZ2UnKTtcblxuICAgICAgICBpZiAodGhpcy5tYXApXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLm1hcC50cmFuc2Zvcm0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBvbkFkZDogZnVuY3Rpb24obWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgIH0sXG5cbiAgICBsb2FkZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkICYmIHRoaXMuX3B5cmFtaWQubG9hZGVkKCk7XG4gICAgfSxcblxuICAgIHVwZGF0ZTogZnVuY3Rpb24odHJhbnNmb3JtKSB7XG4gICAgICAgIGlmICh0aGlzLl9kaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlRGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5fcHlyYW1pZC51cGRhdGUodGhpcy51c2VkLCB0cmFuc2Zvcm0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX3B5cmFtaWQucmVsb2FkKCk7XG4gICAgfSxcblxuICAgIHJlbmRlcjogU291cmNlLl9yZW5kZXJUaWxlcyxcbiAgICBmZWF0dXJlc0F0OiBTb3VyY2UuX3ZlY3RvckZlYXR1cmVzQXQsXG5cbiAgICBfdXBkYXRlRGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy53b3JrZXJJRCA9IHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdwYXJzZSBnZW9qc29uJywge1xuICAgICAgICAgICAgZGF0YTogdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHRpbGVTaXplOiA1MTIsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBtYXhab29tOiB0aGlzLm1heHpvb21cbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge2Vycm9yOiBlcnJ9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fcHlyYW1pZC5yZWxvYWQoKTtcblxuICAgICAgICAgICAgdGhpcy5maXJlKCdjaGFuZ2UnKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgX2xvYWRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHZhciBvdmVyc2NhbGluZyA9IHRpbGUuY29vcmQueiA+IHRoaXMubWF4em9vbSA/IE1hdGgucG93KDIsIHRpbGUuY29vcmQueiAtIHRoaXMubWF4em9vbSkgOiAxO1xuICAgICAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIGNvb3JkOiB0aWxlLmNvb3JkLFxuICAgICAgICAgICAgem9vbTogdGlsZS5jb29yZC56LFxuICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgICAgdGlsZVNpemU6IDUxMixcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIG92ZXJzY2FsaW5nOiBvdmVyc2NhbGluZyxcbiAgICAgICAgICAgIGFuZ2xlOiB0aGlzLm1hcC50cmFuc2Zvcm0uYW5nbGUsXG4gICAgICAgICAgICBwaXRjaDogdGhpcy5tYXAudHJhbnNmb3JtLnBpdGNoLFxuICAgICAgICAgICAgY29sbGlzaW9uRGVidWc6IHRoaXMubWFwLmNvbGxpc2lvbkRlYnVnXG4gICAgICAgIH07XG5cbiAgICAgICAgdGlsZS53b3JrZXJJRCA9IHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdsb2FkIGdlb2pzb24gdGlsZScsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG5cbiAgICAgICAgICAgIHRpbGUudW5sb2FkVmVjdG9yRGF0YSh0aGlzLm1hcC5wYWludGVyKTtcblxuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3RpbGUuZXJyb3InLCB7dGlsZTogdGlsZX0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGlsZS5sb2FkVmVjdG9yRGF0YShkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgndGlsZS5sb2FkJywge3RpbGU6IHRpbGV9KTtcblxuICAgICAgICB9LmJpbmQodGhpcyksIHRoaXMud29ya2VySUQpO1xuICAgIH0sXG5cbiAgICBfYWJvcnRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHRpbGUuYWJvcnRlZCA9IHRydWU7XG4gICAgfSxcblxuICAgIF9hZGRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHRoaXMuZmlyZSgndGlsZS5hZGQnLCB7dGlsZTogdGlsZX0pO1xuICAgIH0sXG5cbiAgICBfcmVtb3ZlVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB0aGlzLmZpcmUoJ3RpbGUucmVtb3ZlJywge3RpbGU6IHRpbGV9KTtcbiAgICB9LFxuXG4gICAgX3VubG9hZFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKHRoaXMubWFwLnBhaW50ZXIpO1xuICAgICAgICB0aGlzLmdseXBoQXRsYXMucmVtb3ZlR2x5cGhzKHRpbGUudWlkKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbW92ZSB0aWxlJywgeyB1aWQ6IHRpbGUudWlkLCBzb3VyY2U6IHRoaXMuaWQgfSwgbnVsbCwgdGlsZS53b3JrZXJJRCk7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCd2ZWN0b3ItdGlsZScpLlZlY3RvclRpbGVGZWF0dXJlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdlb0pTT05XcmFwcGVyO1xuXG4vLyBjb25mb3JtIHRvIHZlY3RvcnRpbGUgYXBpXG5mdW5jdGlvbiBHZW9KU09OV3JhcHBlcihmZWF0dXJlcykge1xuICAgIHRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlcztcbiAgICB0aGlzLmxlbmd0aCA9IGZlYXR1cmVzLmxlbmd0aDtcbn1cblxuR2VvSlNPTldyYXBwZXIucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbihpKSB7XG4gICAgcmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLmZlYXR1cmVzW2ldKTtcbn07XG5cbmZ1bmN0aW9uIEZlYXR1cmVXcmFwcGVyKGZlYXR1cmUpIHtcbiAgICB0aGlzLnR5cGUgPSBmZWF0dXJlLnR5cGU7XG4gICAgdGhpcy5yYXdHZW9tZXRyeSA9IGZlYXR1cmUudHlwZSA9PT0gMSA/IFtmZWF0dXJlLmdlb21ldHJ5XSA6IGZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gZmVhdHVyZS50YWdzO1xuICAgIHRoaXMuZXh0ZW50ID0gNDA5Njtcbn1cblxuRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLmxvYWRHZW9tZXRyeSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByaW5ncyA9IHRoaXMucmF3R2VvbWV0cnk7XG4gICAgdGhpcy5nZW9tZXRyeSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmluZyA9IHJpbmdzW2ldLFxuICAgICAgICAgICAgbmV3UmluZyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIG5ld1JpbmcucHVzaChuZXcgUG9pbnQocmluZ1tqXVswXSwgcmluZ1tqXVsxXSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VvbWV0cnkucHVzaChuZXdSaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2VvbWV0cnk7XG59O1xuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUuYmJveCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5nZW9tZXRyeSkgdGhpcy5sb2FkR2VvbWV0cnkoKTtcblxuICAgIHZhciByaW5ncyA9IHRoaXMuZ2VvbWV0cnksXG4gICAgICAgIHgxID0gSW5maW5pdHksXG4gICAgICAgIHgyID0gLUluZmluaXR5LFxuICAgICAgICB5MSA9IEluZmluaXR5LFxuICAgICAgICB5MiA9IC1JbmZpbml0eTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJpbmcgPSByaW5nc1tpXTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBjb29yZCA9IHJpbmdbal07XG5cbiAgICAgICAgICAgIHgxID0gTWF0aC5taW4oeDEsIGNvb3JkLngpO1xuICAgICAgICAgICAgeDIgPSBNYXRoLm1heCh4MiwgY29vcmQueCk7XG4gICAgICAgICAgICB5MSA9IE1hdGgubWluKHkxLCBjb29yZC55KTtcbiAgICAgICAgICAgIHkyID0gTWF0aC5tYXgoeTIsIGNvb3JkLnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG59O1xuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUudG9HZW9KU09OID0gVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIFNvdXJjZSA9IHJlcXVpcmUoJy4vc291cmNlJyk7XG52YXIgbm9ybWFsaXplVVJMID0gcmVxdWlyZSgnLi4vdXRpbC9tYXBib3gnKS5ub3JtYWxpemVUaWxlVVJMO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJhc3RlclRpbGVTb3VyY2U7XG5cbmZ1bmN0aW9uIFJhc3RlclRpbGVTb3VyY2Uob3B0aW9ucykge1xuICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHV0aWwucGljayhvcHRpb25zLCBbJ3VybCcsICd0aWxlU2l6ZSddKSk7XG5cbiAgICBTb3VyY2UuX2xvYWRUaWxlSlNPTi5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5SYXN0ZXJUaWxlU291cmNlLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChFdmVudGVkLCB7XG4gICAgbWluem9vbTogMCxcbiAgICBtYXh6b29tOiAyMixcbiAgICB0aWxlU2l6ZTogNTEyLFxuICAgIF9sb2FkZWQ6IGZhbHNlLFxuXG4gICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9LFxuXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B5cmFtaWQgJiYgdGhpcy5fcHlyYW1pZC5sb2FkZWQoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRoaXMuX3B5cmFtaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3B5cmFtaWQudXBkYXRlKHRoaXMudXNlZCwgdHJhbnNmb3JtLCB0aGlzLm1hcC5zdHlsZS5yYXN0ZXJGYWRlRHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlbmRlcjogU291cmNlLl9yZW5kZXJUaWxlcyxcblxuICAgIF9sb2FkVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICBhamF4LmdldEltYWdlKG5vcm1hbGl6ZVVSTCh0aWxlLmNvb3JkLnVybCh0aGlzLnRpbGVzKSwgdGhpcy51cmwpLCBmdW5jdGlvbihlcnIsIGltZykge1xuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3RpbGUuZXJyb3InLCB7dGlsZTogdGlsZX0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGdsID0gdGhpcy5tYXAucGFpbnRlci5nbDtcbiAgICAgICAgICAgIHRpbGUudGV4dHVyZSA9IHRoaXMubWFwLnBhaW50ZXIuZ2V0VGV4dHVyZShpbWcud2lkdGgpO1xuICAgICAgICAgICAgaWYgKHRpbGUudGV4dHVyZSkge1xuICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRpbGUudGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBpbWcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGlsZS50ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltZyk7XG4gICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlLnNpemUgPSBpbWcud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcblxuICAgICAgICAgICAgdGlsZS50aW1lQWRkZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHRoaXMubWFwLmFuaW1hdGlvbkxvb3Auc2V0KHRoaXMuc3R5bGUucmFzdGVyRmFkZUR1cmF0aW9uKTtcblxuICAgICAgICAgICAgdGlsZS5zb3VyY2UgPSB0aGlzO1xuICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3RpbGUubG9hZCcsIHt0aWxlOiB0aWxlfSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIF9hYm9ydFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGlsZS5hYm9ydGVkID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgX2FkZFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGhpcy5maXJlKCd0aWxlLmFkZCcsIHt0aWxlOiB0aWxlfSk7XG4gICAgfSxcblxuICAgIF9yZW1vdmVUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHRoaXMuZmlyZSgndGlsZS5yZW1vdmUnLCB7dGlsZTogdGlsZX0pO1xuICAgIH0sXG5cbiAgICBfdW5sb2FkVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICBpZiAodGlsZS50ZXh0dXJlKSB0aGlzLm1hcC5wYWludGVyLnNhdmVUZXh0dXJlKHRpbGUudGV4dHVyZSk7XG4gICAgfSxcblxuICAgIGZlYXR1cmVzQXQ6IGZ1bmN0aW9uKHBvaW50LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIFtdKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xudmFyIFRpbGVQeXJhbWlkID0gcmVxdWlyZSgnLi90aWxlX3B5cmFtaWQnKTtcbnZhciBUaWxlQ29vcmQgPSByZXF1aXJlKCcuL3RpbGVfY29vcmQnKTtcbnZhciBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZVNvdXJjZVVSTDtcblxuZXhwb3J0cy5fbG9hZFRpbGVKU09OID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBsb2FkZWQgPSBmdW5jdGlvbihlcnIsIHRpbGVKU09OKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IGVycn0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXRpbC5leHRlbmQodGhpcywgdXRpbC5waWNrKHRpbGVKU09OLFxuICAgICAgICAgICAgWyd0aWxlcycsICdtaW56b29tJywgJ21heHpvb20nLCAnYXR0cmlidXRpb24nXSkpO1xuXG4gICAgICAgIHRoaXMuX3B5cmFtaWQgPSBuZXcgVGlsZVB5cmFtaWQoe1xuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICBjYWNoZVNpemU6IDIwLFxuICAgICAgICAgICAgbWluem9vbTogdGhpcy5taW56b29tLFxuICAgICAgICAgICAgbWF4em9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgICAgcmVwYXJzZU92ZXJzY2FsZWQ6IHRoaXMucmVwYXJzZU92ZXJzY2FsZWQsXG4gICAgICAgICAgICBsb2FkOiB0aGlzLl9sb2FkVGlsZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgYWJvcnQ6IHRoaXMuX2Fib3J0VGlsZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdW5sb2FkOiB0aGlzLl91bmxvYWRUaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBhZGQ6IHRoaXMuX2FkZFRpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJlbW92ZTogdGhpcy5fcmVtb3ZlVGlsZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmVkb1BsYWNlbWVudDogdGhpcy5fcmVkb1RpbGVQbGFjZW1lbnQgPyB0aGlzLl9yZWRvVGlsZVBsYWNlbWVudC5iaW5kKHRoaXMpIDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnbG9hZCcpO1xuICAgIH0uYmluZCh0aGlzKTtcblxuICAgIGlmIChvcHRpb25zLnVybCkge1xuICAgICAgICBhamF4LmdldEpTT04obm9ybWFsaXplVVJMKG9wdGlvbnMudXJsKSwgbG9hZGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBicm93c2VyLmZyYW1lKGxvYWRlZC5iaW5kKHRoaXMsIG51bGwsIG9wdGlvbnMpKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLl9yZW5kZXJUaWxlcyA9IGZ1bmN0aW9uKGxheWVycywgcGFpbnRlcikge1xuICAgIGlmICghdGhpcy5fcHlyYW1pZClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIGlkcyA9IHRoaXMuX3B5cmFtaWQucmVuZGVyZWRJRHMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3B5cmFtaWQuZ2V0VGlsZShpZHNbaV0pLFxuICAgICAgICAgICAgLy8gY29vcmQgaXMgZGlmZmVyZW50IHRoYW4gdGlsZS5jb29yZCBmb3Igd3JhcHBlZCB0aWxlcyBzaW5jZSB0aGUgYWN0dWFsXG4gICAgICAgICAgICAvLyB0aWxlIG9iamVjdCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlIHZpc2libGUgY29waWVzIG9mIHRoYXQgdGlsZS5cbiAgICAgICAgICAgIGNvb3JkID0gVGlsZUNvb3JkLmZyb21JRChpZHNbaV0pLFxuICAgICAgICAgICAgeiA9IGNvb3JkLnosXG4gICAgICAgICAgICB4ID0gY29vcmQueCxcbiAgICAgICAgICAgIHkgPSBjb29yZC55LFxuICAgICAgICAgICAgdyA9IGNvb3JkLnc7XG5cbiAgICAgICAgLy8gaWYgeiA+IG1heHpvb20gdGhlbiB0aGUgdGlsZSBpcyBhY3R1YWxseSBhIG92ZXJzY2FsZWQgbWF4em9vbSB0aWxlLFxuICAgICAgICAvLyBzbyBjYWxjdWxhdGUgdGhlIG1hdHJpeCB0aGUgbWF4em9vbSB0aWxlIHdvdWxkIHVzZS5cbiAgICAgICAgeiA9IE1hdGgubWluKHosIHRoaXMubWF4em9vbSk7XG5cbiAgICAgICAgeCArPSB3ICogKDEgPDwgeik7XG4gICAgICAgIHRpbGUuY2FsY3VsYXRlTWF0cmljZXMoeiwgeCwgeSwgcGFpbnRlci50cmFuc2Zvcm0sIHBhaW50ZXIpO1xuXG4gICAgICAgIHBhaW50ZXIuZHJhd1RpbGUodGlsZSwgbGF5ZXJzKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLl92ZWN0b3JGZWF0dXJlc0F0ID0gZnVuY3Rpb24oY29vcmQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX3B5cmFtaWQpXG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBbXSk7XG5cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5fcHlyYW1pZC50aWxlQXQoY29vcmQpO1xuICAgIGlmICghcmVzdWx0KVxuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgW10pO1xuXG4gICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3F1ZXJ5IGZlYXR1cmVzJywge1xuICAgICAgICB1aWQ6IHJlc3VsdC50aWxlLnVpZCxcbiAgICAgICAgeDogcmVzdWx0LngsXG4gICAgICAgIHk6IHJlc3VsdC55LFxuICAgICAgICBzY2FsZTogcmVzdWx0LnNjYWxlLFxuICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgfSwgY2FsbGJhY2ssIHJlc3VsdC50aWxlLndvcmtlcklEKTtcbn07XG5cbi8qXG4gKiBDcmVhdGUgYSB0aWxlZCBkYXRhIHNvdXJjZSBpbnN0YW5jZSBnaXZlbiBhbiBvcHRpb25zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50eXBlIEVpdGhlciBgcmFzdGVyYCBvciBgdmVjdG9yYC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnVybCBBIHRpbGUgc291cmNlIFVSTC4gVGhpcyBzaG91bGQgZWl0aGVyIGJlIGBtYXBib3g6Ly97bWFwaWR9YCBvciBhIGZ1bGwgYGh0dHBbc11gIHVybCB0aGF0IHBvaW50cyB0byBhIFRpbGVKU09OIGVuZHBvaW50LlxuICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucy50aWxlcyBBbiBhcnJheSBvZiB0aWxlIHNvdXJjZXMuIElmIGB1cmxgIGlzIG5vdCBzcGVjaWZpZWQsIGB0aWxlc2AgY2FuIGJlIHVzZWQgaW5zdGVhZCB0byBzcGVjaWZ5IHRpbGUgc291cmNlcywgYXMgaW4gdGhlIFRpbGVKU09OIHNwZWMuIE90aGVyIFRpbGVKU09OIGtleXMgc3VjaCBhcyBgbWluem9vbWAgYW5kIGBtYXh6b29tYCBjYW4gYmUgc3BlY2lmaWVkIGluIGEgc291cmNlIG9iamVjdCBpZiBgdGlsZXNgIGlzIHVzZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5pZCBBbiBvcHRpb25hbCBgaWRgIHRvIGFzc2lnbiB0byB0aGUgc291cmNlXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGlsZVNpemU9NTEyXSBPcHRpb25hbCB0aWxlIHNpemUgKHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLCBhc3N1bWluZyB0aWxlcyBhcmUgc3F1YXJlKS4gVGhpcyBvcHRpb24gaXMgb25seSBjb25maWd1cmFibGUgZm9yIHJhc3RlciBzb3VyY2VzXG4gKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5jYWNoZVNpemUgT3B0aW9uYWwgbWF4IG51bWJlciBvZiB0aWxlcyB0byBjYWNoZSBhdCBhbnkgZ2l2ZW4gdGltZVxuICogQGV4YW1wbGVcbiAqIHZhciBzb3VyY2VPYmogPSBuZXcgbWFwYm94Z2wuU291cmNlLmNyZWF0ZSh7XG4gKiAgICB0eXBlOiAndmVjdG9yJyxcbiAqICAgIHVybDogJ21hcGJveDovL21hcGJveC5tYXBib3gtc3RyZWV0cy12NSdcbiAqIH0pO1xuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHNvdXJjZU9iaik7IC8vIGFkZFxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKi9cbmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgLy8gVGhpcyBpcyBub3QgYXQgZmlsZSBzY29wZSBpbiBvcmRlciB0byBhdm9pZCBhIGNpcmN1bGFyIHJlcXVpcmUuXG4gICAgdmFyIHNvdXJjZXMgPSB7XG4gICAgICAgIHZlY3RvcjogcmVxdWlyZSgnLi92ZWN0b3JfdGlsZV9zb3VyY2UnKSxcbiAgICAgICAgcmFzdGVyOiByZXF1aXJlKCcuL3Jhc3Rlcl90aWxlX3NvdXJjZScpLFxuICAgICAgICBnZW9qc29uOiByZXF1aXJlKCcuL2dlb2pzb25fc291cmNlJyksXG4gICAgICAgIHZpZGVvOiByZXF1aXJlKCcuL3ZpZGVvX3NvdXJjZScpXG4gICAgfTtcblxuICAgIGZvciAodmFyIHR5cGUgaW4gc291cmNlcykge1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2Ygc291cmNlc1t0eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgc291cmNlc1tzb3VyY2UudHlwZV0oc291cmNlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnbG1hdHJpeCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpO1xudmFyIG1hdDIgPSBnbG1hdHJpeC5tYXQyO1xudmFyIG1hdDQgPSBnbG1hdHJpeC5tYXQ0O1xudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBCdWZmZXJTZXQgPSByZXF1aXJlKCcuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVGlsZTtcblxuLyoqXG4gKiBBIHRpbGUgb2JqZWN0IGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhIENvb3JkaW5hdGUsIHdoaWNoIGRlZmluZXNcbiAqIGl0cyBwbGFjZSwgYXMgd2VsbCBhcyBhIHVuaXF1ZSBJRCBhbmQgZGF0YSB0cmFja2luZyBmb3IgaXRzIGNvbnRlbnRcbiAqXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICovXG5mdW5jdGlvbiBUaWxlKGNvb3JkLCBzaXplKSB7XG4gICAgdGhpcy5jb29yZCA9IGNvb3JkO1xuICAgIHRoaXMudWlkID0gdXRpbC51bmlxdWVJZCgpO1xuICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy51c2VzID0gMDtcbiAgICB0aGlzLnRpbGVTaXplID0gc2l6ZTtcbn1cblxuVGlsZS5wcm90b3R5cGUgPSB7XG4gICAgLy8gdG9kbyB1bmhhcmRjb2RlXG4gICAgdGlsZUV4dGVudDogNDA5NixcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgaW50ZXJuYWwgcG9zTWF0cml4IHRoYXQgdGhpcyB0aWxlIHVzZXMgdG8gZGlzcGxheVxuICAgICAqIGl0c2VsZiBpbiBhIG1hcCwgZ2l2ZW4gYSBjb29yZGluYXRlIGFzICh6LCB4LCB5KSBhbmQgYSB0cmFuc2Zvcm1cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHJhbnNmb3JtXG4gICAgICovXG4gICAgY2FsY3VsYXRlTWF0cmljZXM6IGZ1bmN0aW9uKHosIHgsIHksIHRyYW5zZm9ybSkge1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgbW9kZWwtdmlldyBtYXRyaXggdGhhdCBjb252ZXJ0cyBmcm9tIHRoZSB0aWxlIGNvb3JkaW5hdGVzXG4gICAgICAgIC8vIHRvIHNjcmVlbiBjb29yZGluYXRlcy5cbiAgICAgICAgdmFyIHRpbGVTY2FsZSA9IE1hdGgucG93KDIsIHopO1xuICAgICAgICB2YXIgc2NhbGUgPSB0cmFuc2Zvcm0ud29ybGRTaXplIC8gdGlsZVNjYWxlO1xuXG4gICAgICAgIC8vIFRPRE86IHJlbW92ZVxuICAgICAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG5cbiAgICAgICAgLy8gVGhlIHBvc2l0aW9uIG1hdHJpeFxuICAgICAgICB0aGlzLnBvc01hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMucG9zTWF0cml4KTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wb3NNYXRyaXgsIHRoaXMucG9zTWF0cml4LCBbeCAqIHNjYWxlLCB5ICogc2NhbGUsIDBdKTtcblxuICAgICAgICBtYXQ0LnNjYWxlKHRoaXMucG9zTWF0cml4LCB0aGlzLnBvc01hdHJpeCwgWyBzY2FsZSAvIHRoaXMudGlsZUV4dGVudCwgc2NhbGUgLyB0aGlzLnRpbGVFeHRlbnQsIDEgXSk7XG4gICAgICAgIG1hdDQubXVsdGlwbHkodGhpcy5wb3NNYXRyaXgsIHRyYW5zZm9ybS5nZXRQcm9qTWF0cml4KCksIHRoaXMucG9zTWF0cml4KTtcblxuICAgICAgICAvLyBUaGUgZXh0cnVzaW9uIG1hdHJpeC5cbiAgICAgICAgdGhpcy5leE1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIG1hdDQub3J0aG8odGhpcy5leE1hdHJpeCwgMCwgdHJhbnNmb3JtLndpZHRoLCB0cmFuc2Zvcm0uaGVpZ2h0LCAwLCAwLCAtMSk7XG4gICAgICAgIC8vbWF0NC5yb3RhdGVaKHRoaXMuZXhNYXRyaXgsIHRoaXMuZXhNYXRyaXgsIC10cmFuc2Zvcm0uYW5nbGUpO1xuXG4gICAgICAgIC8vIDJ4MiBtYXRyaXggZm9yIHJvdGF0aW5nIHBvaW50c1xuICAgICAgICB0aGlzLnJvdGF0aW9uTWF0cml4ID0gbWF0Mi5jcmVhdGUoKTtcbiAgICAgICAgbWF0Mi5yb3RhdGUodGhpcy5yb3RhdGlvbk1hdHJpeCwgdGhpcy5yb3RhdGlvbk1hdHJpeCwgdHJhbnNmb3JtLmFuZ2xlKTtcblxuICAgICAgICB0aGlzLnBvc01hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb3NNYXRyaXgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGNvb3JkaW5hdGUgcG9zaXRpb24sIHpvb20gdGhhdCBjb29yZGluYXRlIHRvIG15IHpvb20gYW5kXG4gICAgICogc2NhbGUgYW5kIHJldHVybiBhIHBvc2l0aW9uIGluIHgsIHksIHNjYWxlXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBvc2l0aW9uXG4gICAgICovXG4gICAgcG9zaXRpb25BdDogZnVuY3Rpb24oY29vcmQsIHNvdXJjZU1heFpvb20pIHtcbiAgICAgICAgY29vcmQgPSBjb29yZC56b29tVG8oTWF0aC5taW4odGhpcy5jb29yZC56LCBzb3VyY2VNYXhab29tKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiAoY29vcmQuY29sdW1uIC0gdGhpcy5jb29yZC54KSAqIDQwOTYsXG4gICAgICAgICAgICB5OiAoY29vcmQucm93IC0gdGhpcy5jb29yZC55KSAqIDQwOTYsXG4gICAgICAgICAgICBzY2FsZTogdGhpcy5zY2FsZVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGRhdGEgb2JqZWN0IHdpdGggYSAnYnVmZmVycycgcHJvcGVydHksIGxvYWQgaXQgaW50b1xuICAgICAqIHRoaXMgdGlsZSdzIGVsZW1lbnRHcm91cHMgYW5kIGJ1ZmZlcnMgcHJvcGVydGllcyBhbmQgc2V0IGxvYWRlZFxuICAgICAqIHRvIHRydWUuIElmIHRoZSBkYXRhIGlzIG51bGwsIGxpa2UgaW4gdGhlIGNhc2Ugb2YgYW4gZW1wdHlcbiAgICAgKiBHZW9KU09OIHRpbGUsIG5vLW9wIGJ1dCBzdGlsbCBzZXQgbG9hZGVkIHRvIHRydWUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGxvYWRWZWN0b3JEYXRhOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBlbXB0eSBHZW9KU09OIHRpbGVcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IEJ1ZmZlclNldChkYXRhLmJ1ZmZlcnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnRHcm91cHMgPSBkYXRhLmVsZW1lbnRHcm91cHM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGdpdmVuIGEgZGF0YSBvYmplY3QgYW5kIGEgR0wgcGFpbnRlciwgZGVzdHJveSBhbmQgcmUtY3JlYXRlXG4gICAgICogYWxsIG9mIGl0cyBidWZmZXJzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhaW50ZXJcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHJlbG9hZFN5bWJvbERhdGE6IGZ1bmN0aW9uKGRhdGEsIHBhaW50ZXIpIHtcblxuICAgICAgICBpZiAoIXRoaXMuYnVmZmVycykge1xuICAgICAgICAgICAgLy8gdGhlIHRpbGUgaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXguZGVzdHJveShwYWludGVyLmdsKTtcbiAgICAgICAgdGhpcy5idWZmZXJzLmdseXBoRWxlbWVudC5kZXN0cm95KHBhaW50ZXIuZ2wpO1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuaWNvblZlcnRleC5kZXN0cm95KHBhaW50ZXIuZ2wpO1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuaWNvbkVsZW1lbnQuZGVzdHJveShwYWludGVyLmdsKTtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleC5kZXN0cm95KHBhaW50ZXIuZ2wpO1xuXG4gICAgICAgIHZhciBidWZmZXJzID0gbmV3IEJ1ZmZlclNldChkYXRhLmJ1ZmZlcnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXggPSBidWZmZXJzLmdseXBoVmVydGV4O1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZ2x5cGhFbGVtZW50ID0gYnVmZmVycy5nbHlwaEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuYnVmZmVycy5pY29uVmVydGV4ID0gYnVmZmVycy5pY29uVmVydGV4O1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuaWNvbkVsZW1lbnQgPSBidWZmZXJzLmljb25FbGVtZW50O1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4ID0gYnVmZmVycy5jb2xsaXNpb25Cb3hWZXJ0ZXg7XG5cbiAgICAgICAgZm9yICh2YXIgaWQgaW4gZGF0YS5lbGVtZW50R3JvdXBzKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRHcm91cHNbaWRdID0gZGF0YS5lbGVtZW50R3JvdXBzW2lkXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNYWtlIHN1cmUgdGhhdCB0aGlzIHRpbGUgZG9lc24ndCBvd24gYW55IGRhdGEgd2l0aGluIGEgZ2l2ZW5cbiAgICAgKiBwYWludGVyLCBzbyB0aGF0IGl0IGRvZXNuJ3QgY29uc3VtZSBhbnkgbWVtb3J5IG9yIG1haW50YWluXG4gICAgICogYW55IHJlZmVyZW5jZXMgdG8gdGhlIHBhaW50ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhaW50ZXIgZ2wgcGFpbnRlciBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHVubG9hZFZlY3RvckRhdGE6IGZ1bmN0aW9uKHBhaW50ZXIpIHtcbiAgICAgICAgZm9yICh2YXIgYiBpbiB0aGlzLmJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyc1tiXS5kZXN0cm95KHBhaW50ZXIuZ2wpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVycyA9IG51bGw7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUaWxlQ29vcmQ7XG5cbmZ1bmN0aW9uIFRpbGVDb29yZCh6LCB4LCB5LCB3KSB7XG4gICAgaWYgKHcgPT09IHVuZGVmaW5lZCkgdyA9IDA7XG4gICAgdGhpcy56ID0gejtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy53ID0gdztcblxuICAgIC8vIGNhbGN1bGF0ZSBpZFxuICAgIHcgKj0gMjtcbiAgICBpZiAodyA8IDApIHcgPSB3ICogLTEgLSAxO1xuICAgIHZhciBkaW0gPSAxIDw8IHRoaXMuejtcbiAgICB0aGlzLmlkID0gKChkaW0gKiBkaW0gKiB3ICsgZGltICogdGhpcy55ICsgdGhpcy54KSAqIDMyKSArIHRoaXMuejtcbn1cblxuVGlsZUNvb3JkLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnogKyBcIi9cIiArIHRoaXMueCArIFwiL1wiICsgdGhpcy55O1xufTtcblxuLy8gUGFyc2UgYSBwYWNrZWQgaW50ZWdlciBpZCBpbnRvIGEgVGlsZUNvb3JkIG9iamVjdFxuVGlsZUNvb3JkLmZyb21JRCA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgdmFyIHogPSBpZCAlIDMyLCBkaW0gPSAxIDw8IHo7XG4gICAgdmFyIHh5ID0gKChpZCAtIHopIC8gMzIpO1xuICAgIHZhciB4ID0geHkgJSBkaW0sIHkgPSAoKHh5IC0geCkgLyBkaW0pICUgZGltO1xuICAgIHZhciB3ID0gTWF0aC5mbG9vcih4eSAvIChkaW0gKiBkaW0pKTtcbiAgICBpZiAodyAlIDIgIT09IDApIHcgPSB3ICogLTEgLSAxO1xuICAgIHcgLz0gMjtcbiAgICByZXR1cm4gbmV3IFRpbGVDb29yZCh6LCB4LCB5LCB3KTtcbn07XG5cbi8vIGdpdmVuIGEgbGlzdCBvZiB1cmxzLCBjaG9vc2UgYSB1cmwgdGVtcGxhdGUgYW5kIHJldHVybiBhIHRpbGUgVVJMXG5UaWxlQ29vcmQucHJvdG90eXBlLnVybCA9IGZ1bmN0aW9uKHVybHMsIHNvdXJjZU1heFpvb20pIHtcbiAgICByZXR1cm4gdXJsc1sodGhpcy54ICsgdGhpcy55KSAlIHVybHMubGVuZ3RoXVxuICAgICAgICAucmVwbGFjZSgne3ByZWZpeH0nLCAodGhpcy54ICUgMTYpLnRvU3RyaW5nKDE2KSArICh0aGlzLnkgJSAxNikudG9TdHJpbmcoMTYpKVxuICAgICAgICAucmVwbGFjZSgne3p9JywgTWF0aC5taW4odGhpcy56LCBzb3VyY2VNYXhab29tIHx8IHRoaXMueikpXG4gICAgICAgIC5yZXBsYWNlKCd7eH0nLCB0aGlzLngpXG4gICAgICAgIC5yZXBsYWNlKCd7eX0nLCB0aGlzLnkpO1xufTtcblxuLy8gUmV0dXJuIHRoZSBjb29yZGluYXRlIG9mIHRoZSBwYXJlbnQgdGlsZVxuVGlsZUNvb3JkLnByb3RvdHlwZS5wYXJlbnQgPSBmdW5jdGlvbihzb3VyY2VNYXhab29tKSB7XG4gICAgaWYgKHRoaXMueiA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyB0aGUgaWQgcmVwcmVzZW50cyBhbiBvdmVyc2NhbGVkIHRpbGUsIHJldHVybiB0aGUgc2FtZSBjb29yZGluYXRlcyB3aXRoIGEgbG93ZXIgelxuICAgIGlmICh0aGlzLnogPiBzb3VyY2VNYXhab29tKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZUNvb3JkKHRoaXMueiAtIDEsIHRoaXMueCwgdGhpcy55LCB0aGlzLncpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGlsZUNvb3JkKHRoaXMueiAtIDEsIE1hdGguZmxvb3IodGhpcy54IC8gMiksIE1hdGguZmxvb3IodGhpcy55IC8gMiksIHRoaXMudyk7XG59O1xuXG5UaWxlQ29vcmQucHJvdG90eXBlLndyYXBwZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFRpbGVDb29yZCh0aGlzLnosIHRoaXMueCwgdGhpcy55LCAwKTtcbn07XG5cbi8vIFJldHVybiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRpbGUncyBjaGlsZHJlblxuVGlsZUNvb3JkLnByb3RvdHlwZS5jaGlsZHJlbiA9IGZ1bmN0aW9uKHNvdXJjZU1heFpvb20pIHtcblxuICAgIGlmICh0aGlzLnogPj0gc291cmNlTWF4Wm9vbSkge1xuICAgICAgICAvLyByZXR1cm4gYSBzaW5nbGUgdGlsZSBjb29yZCByZXByZXNlbnRpbmcgYSBhbiBvdmVyc2NhbGVkIHRpbGVcbiAgICAgICAgcmV0dXJuIFtuZXcgVGlsZUNvb3JkKHRoaXMueiArIDEsIHRoaXMueCwgdGhpcy55LCB0aGlzLncpXTtcbiAgICB9XG5cbiAgICB2YXIgeiA9IHRoaXMueiArIDE7XG4gICAgdmFyIHggPSB0aGlzLnggKiAyO1xuICAgIHZhciB5ID0gdGhpcy55ICogMjtcbiAgICByZXR1cm4gW1xuICAgICAgICBuZXcgVGlsZUNvb3JkKHosIHgsIHksIHRoaXMudyksXG4gICAgICAgIG5ldyBUaWxlQ29vcmQoeiwgeCArIDEsIHksIHRoaXMudyksXG4gICAgICAgIG5ldyBUaWxlQ29vcmQoeiwgeCwgeSArIDEsIHRoaXMudyksXG4gICAgICAgIG5ldyBUaWxlQ29vcmQoeiwgeCArIDEsIHkgKyAxLCB0aGlzLncpXG4gICAgXTtcbn07XG5cbi8vIFRha2VuIGZyb20gcG9seW1hcHMgc3JjL0xheWVyLmpzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2ltcGxlZ2VvL3BvbHltYXBzL2Jsb2IvbWFzdGVyL3NyYy9MYXllci5qcyNMMzMzLUwzODNcblxuZnVuY3Rpb24gZWRnZShhLCBiKSB7XG4gICAgaWYgKGEucm93ID4gYi5yb3cpIHsgdmFyIHQgPSBhOyBhID0gYjsgYiA9IHQ7IH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4MDogYS5jb2x1bW4sXG4gICAgICAgIHkwOiBhLnJvdyxcbiAgICAgICAgeDE6IGIuY29sdW1uLFxuICAgICAgICB5MTogYi5yb3csXG4gICAgICAgIGR4OiBiLmNvbHVtbiAtIGEuY29sdW1uLFxuICAgICAgICBkeTogYi5yb3cgLSBhLnJvd1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNjYW5TcGFucyhlMCwgZTEsIHltaW4sIHltYXgsIHNjYW5MaW5lKSB7XG4gICAgdmFyIHkwID0gTWF0aC5tYXgoeW1pbiwgTWF0aC5mbG9vcihlMS55MCkpO1xuICAgIHZhciB5MSA9IE1hdGgubWluKHltYXgsIE1hdGguY2VpbChlMS55MSkpO1xuXG4gICAgLy8gc29ydCBlZGdlcyBieSB4LWNvb3JkaW5hdGVcbiAgICBpZiAoKGUwLngwID09PSBlMS54MCAmJiBlMC55MCA9PT0gZTEueTApID9cbiAgICAgICAgICAgIChlMC54MCArIGUxLmR5IC8gZTAuZHkgKiBlMC5keCA8IGUxLngxKSA6XG4gICAgICAgICAgICAoZTAueDEgLSBlMS5keSAvIGUwLmR5ICogZTAuZHggPCBlMS54MCkpIHtcbiAgICAgICAgdmFyIHQgPSBlMDsgZTAgPSBlMTsgZTEgPSB0O1xuICAgIH1cblxuICAgIC8vIHNjYW4gbGluZXMhXG4gICAgdmFyIG0wID0gZTAuZHggLyBlMC5keTtcbiAgICB2YXIgbTEgPSBlMS5keCAvIGUxLmR5O1xuICAgIHZhciBkMCA9IGUwLmR4ID4gMDsgLy8gdXNlIHkgKyAxIHRvIGNvbXB1dGUgeDBcbiAgICB2YXIgZDEgPSBlMS5keCA8IDA7IC8vIHVzZSB5ICsgMSB0byBjb21wdXRlIHgxXG4gICAgZm9yICh2YXIgeSA9IHkwOyB5IDwgeTE7IHkrKykge1xuICAgICAgICB2YXIgeDAgPSBtMCAqIE1hdGgubWF4KDAsIE1hdGgubWluKGUwLmR5LCB5ICsgZDAgLSBlMC55MCkpICsgZTAueDA7XG4gICAgICAgIHZhciB4MSA9IG0xICogTWF0aC5tYXgoMCwgTWF0aC5taW4oZTEuZHksIHkgKyBkMSAtIGUxLnkwKSkgKyBlMS54MDtcbiAgICAgICAgc2NhbkxpbmUoTWF0aC5mbG9vcih4MSksIE1hdGguY2VpbCh4MCksIHkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2NhblRyaWFuZ2xlKGEsIGIsIGMsIHltaW4sIHltYXgsIHNjYW5MaW5lKSB7XG4gICAgdmFyIGFiID0gZWRnZShhLCBiKSxcbiAgICAgICAgYmMgPSBlZGdlKGIsIGMpLFxuICAgICAgICBjYSA9IGVkZ2UoYywgYSk7XG5cbiAgICB2YXIgdDtcblxuICAgIC8vIHNvcnQgZWRnZXMgYnkgeS1sZW5ndGhcbiAgICBpZiAoYWIuZHkgPiBiYy5keSkgeyB0ID0gYWI7IGFiID0gYmM7IGJjID0gdDsgfVxuICAgIGlmIChhYi5keSA+IGNhLmR5KSB7IHQgPSBhYjsgYWIgPSBjYTsgY2EgPSB0OyB9XG4gICAgaWYgKGJjLmR5ID4gY2EuZHkpIHsgdCA9IGJjOyBiYyA9IGNhOyBjYSA9IHQ7IH1cblxuICAgIC8vIHNjYW4gc3BhbiEgc2NhbiBzcGFuIVxuICAgIGlmIChhYi5keSkgc2NhblNwYW5zKGNhLCBhYiwgeW1pbiwgeW1heCwgc2NhbkxpbmUpO1xuICAgIGlmIChiYy5keSkgc2NhblNwYW5zKGNhLCBiYywgeW1pbiwgeW1heCwgc2NhbkxpbmUpO1xufVxuXG5UaWxlQ29vcmQuY292ZXIgPSBmdW5jdGlvbih6LCBib3VuZHMsIGFjdHVhbFopIHtcbiAgICB2YXIgdGlsZXMgPSAxIDw8IHo7XG4gICAgdmFyIHQgPSB7fTtcblxuICAgIGZ1bmN0aW9uIHNjYW5MaW5lKHgwLCB4MSwgeSkge1xuICAgICAgICB2YXIgeCwgd3g7XG4gICAgICAgIGlmICh5ID49IDAgJiYgeSA8PSB0aWxlcykge1xuICAgICAgICAgICAgZm9yICh4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgd3ggPSAoeCArIHRpbGVzKSAlIHRpbGVzO1xuICAgICAgICAgICAgICAgIHZhciBjb29yZCA9IG5ldyBUaWxlQ29vcmQoYWN0dWFsWiwgd3gsIHksIE1hdGguZmxvb3IoeCAvIHRpbGVzKSk7XG4gICAgICAgICAgICAgICAgdFtjb29yZC5pZF0gPSBjb29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpdmlkZSB0aGUgc2NyZWVuIHVwIGluIHR3byB0cmlhbmdsZXMgYW5kIHNjYW4gZWFjaCBvZiB0aGVtOlxuICAgIC8vICstLS0vXG4gICAgLy8gfCAvIHxcbiAgICAvLyAvLS0tK1xuICAgIHNjYW5UcmlhbmdsZShib3VuZHNbMF0sIGJvdW5kc1sxXSwgYm91bmRzWzJdLCAwLCB0aWxlcywgc2NhbkxpbmUpO1xuICAgIHNjYW5UcmlhbmdsZShib3VuZHNbMl0sIGJvdW5kc1szXSwgYm91bmRzWzBdLCAwLCB0aWxlcywgc2NhbkxpbmUpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gdFtpZF07XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVGlsZSA9IHJlcXVpcmUoJy4vdGlsZScpO1xudmFyIFRpbGVDb29yZCA9IHJlcXVpcmUoJy4vdGlsZV9jb29yZCcpO1xudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbnZhciBDYWNoZSA9IHJlcXVpcmUoJy4uL3V0aWwvbXJ1X2NhY2hlJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRpbGVQeXJhbWlkO1xuXG4vKipcbiAqIEEgdGlsZSBweXJhbWlkIGlzIGEgc3BlY2lhbGl6ZWQgY2FjaGUgYW5kIGRhdGFzdHJ1Y3R1cmVcbiAqIHRoYXQgY29udGFpbnMgdGlsZXMuIEl0J3MgdXNlZCBieSBzb3VyY2VzIHRvIG1hbmFnZSB0aGVpclxuICogZGF0YS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGlsZVNpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1pbnpvb21cbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1heHpvb21cbiAqL1xuZnVuY3Rpb24gVGlsZVB5cmFtaWQob3B0aW9ucykge1xuICAgIHRoaXMudGlsZVNpemUgPSBvcHRpb25zLnRpbGVTaXplO1xuICAgIHRoaXMubWluem9vbSA9IG9wdGlvbnMubWluem9vbTtcbiAgICB0aGlzLm1heHpvb20gPSBvcHRpb25zLm1heHpvb207XG4gICAgdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZCA9IG9wdGlvbnMucmVwYXJzZU92ZXJzY2FsZWQ7XG5cbiAgICB0aGlzLl9sb2FkID0gb3B0aW9ucy5sb2FkO1xuICAgIHRoaXMuX2Fib3J0ID0gb3B0aW9ucy5hYm9ydDtcbiAgICB0aGlzLl91bmxvYWQgPSBvcHRpb25zLnVubG9hZDtcbiAgICB0aGlzLl9hZGQgPSBvcHRpb25zLmFkZDtcbiAgICB0aGlzLl9yZW1vdmUgPSBvcHRpb25zLnJlbW92ZTtcbiAgICB0aGlzLl9yZWRvUGxhY2VtZW50ID0gb3B0aW9ucy5yZWRvUGxhY2VtZW50O1xuXG4gICAgdGhpcy5fdGlsZXMgPSB7fTtcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBDYWNoZShvcHRpb25zLmNhY2hlU2l6ZSwgZnVuY3Rpb24odGlsZSkgeyByZXR1cm4gdGhpcy5fdW5sb2FkKHRpbGUpOyB9LmJpbmQodGhpcykpO1xufVxuXG5UaWxlUHlyYW1pZC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ29uZmlybSB0aGF0IGV2ZXJ5IHRyYWNrZWQgdGlsZSBpcyBsb2FkZWQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgYWxsIHRpbGVzIGFyZSBsb2FkZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2FkZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciB0IGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RpbGVzW3RdLmxvYWRlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbGwgdGlsZSBpZHMgb3JkZXJlZCB3aXRoIHotb3JkZXIsIGFuZCBjYXN0IHRvIG51bWJlcnNcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8bnVtYmVyPn0gaWRzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvcmRlcmVkSURzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3RpbGVzKVxuICAgICAgICAgICAgLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gKGIgJSAzMikgLSAoYSAlIDMyKTsgfSlcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24oaWQpIHsgcmV0dXJuICtpZDsgfSk7XG4gICAgfSxcblxuICAgIHJlbmRlcmVkSURzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JkZXJlZElEcygpLmZpbHRlcihmdW5jdGlvbihpZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVzW2lkXS5sb2FkZWQgJiYgIXRoaXMuX2NvdmVyZWRUaWxlc1tpZF07XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIHJlbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlLnJlc2V0KCk7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWQodGhpcy5fdGlsZXNbaV0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNwZWNpZmljIHRpbGUgYnkgaWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIHRpbGUgaWRcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0aWxlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRUaWxlOiBmdW5jdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGlsZXNbaWRdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBnZXQgdGhlIHpvb20gbGV2ZWwgYWRqdXN0ZWQgZm9yIHRoZSBkaWZmZXJlbmNlIGluIG1hcCBhbmQgc291cmNlIHRpbGVzaXplc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0cmFuc2Zvcm1cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSB6b29tIGxldmVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRab29tOiBmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS56b29tICsgTWF0aC5sb2codHJhbnNmb3JtLnRpbGVTaXplIC8gdGhpcy50aWxlU2l6ZSkgLyBNYXRoLkxOMjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgem9vbSBsZXZlbCB0aGF0IHdpbGwgY292ZXIgYWxsIHRpbGVzIGluIGEgZ2l2ZW4gdHJhbnNmb3JtXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHpvb20gbGV2ZWxcbiAgICAgKi9cbiAgICBjb3ZlcmluZ1pvb21MZXZlbDogZnVuY3Rpb24odHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMuZ2V0Wm9vbSh0cmFuc2Zvcm0pKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSB0cmFuc2Zvcm0sIHJldHVybiBhbGwgY29vcmRpbmF0ZXMgdGhhdCBjb3VsZCBjb3ZlciB0aGF0XG4gICAgICogdHJhbnNmb3JtIGZvciBhIGNvdmVyaW5nIHpvb20gbGV2ZWwuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybVxuICAgICAqIEByZXR1cm5zIHtBcnJheTxUaWxlPn0gdGlsZXNcbiAgICAgKi9cbiAgICBjb3ZlcmluZ1RpbGVzOiBmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgdmFyIHogPSB0aGlzLmNvdmVyaW5nWm9vbUxldmVsKHRyYW5zZm9ybSk7XG4gICAgICAgIHZhciBhY3R1YWxaID0gejtcblxuICAgICAgICBpZiAoeiA8IHRoaXMubWluem9vbSkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoeiA+IHRoaXMubWF4em9vbSkgeiA9IHRoaXMubWF4em9vbTtcblxuICAgICAgICB2YXIgdHIgPSB0cmFuc2Zvcm0sXG4gICAgICAgICAgICB0aWxlQ2VudGVyID0gdHIubG9jYXRpb25Db29yZGluYXRlKHRyLmNlbnRlcikuX3pvb21Ubyh6KSxcbiAgICAgICAgICAgIGNlbnRlclBvaW50ID0gbmV3IFBvaW50KHRpbGVDZW50ZXIuY29sdW1uIC0gMC41LCB0aWxlQ2VudGVyLnJvdyAtIDAuNSk7XG5cbiAgICAgICAgcmV0dXJuIFRpbGVDb29yZC5jb3Zlcih6LCBbXG4gICAgICAgICAgICB0ci5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsIDApKS5fem9vbVRvKHopLFxuICAgICAgICAgICAgdHIucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCh0ci53aWR0aCwgMCkpLl96b29tVG8oeiksXG4gICAgICAgICAgICB0ci5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KHRyLndpZHRoLCB0ci5oZWlnaHQpKS5fem9vbVRvKHopLFxuICAgICAgICAgICAgdHIucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLCB0ci5oZWlnaHQpKS5fem9vbVRvKHopXG4gICAgICAgIF0sIHRoaXMucmVwYXJzZU92ZXJzY2FsZWQgPyBhY3R1YWxaIDogeikuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gY2VudGVyUG9pbnQuZGlzdChhKSAtIGNlbnRlclBvaW50LmRpc3QoYik7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmaW5kIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiB0aWxlICh1cCB0byBtYXhDb3ZlcmluZ1pvb20pIHRoYXQgYXJlIGFscmVhZHkgbG9hZGVkO1xuICAgICAqIGFkZHMgZm91bmQgdGlsZXMgdG8gcmV0YWluIG9iamVjdDsgcmV0dXJucyB0cnVlIGlmIGNoaWxkcmVuIGNvbXBsZXRlbHkgY292ZXIgdGhlIHRpbGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Q292ZXJpbmdab29tXG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXRhaW5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBjb21wbGV0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmluZExvYWRlZENoaWxkcmVuOiBmdW5jdGlvbihjb29yZCwgbWF4Q292ZXJpbmdab29tLCByZXRhaW4pIHtcbiAgICAgICAgdmFyIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgdmFyIHogPSBjb29yZC56O1xuICAgICAgICB2YXIgY29vcmRzID0gY29vcmQuY2hpbGRyZW4odGhpcy5tYXh6b29tKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpZCA9IGNvb3Jkc1tpXS5pZDtcbiAgICAgICAgICAgIGlmICh0aGlzLl90aWxlc1tpZF0gJiYgdGhpcy5fdGlsZXNbaWRdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgIHJldGFpbltpZF0gPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh6IDwgbWF4Q292ZXJpbmdab29tKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdvIGZ1cnRoZXIgZG93biB0aGUgaGllcmFyY2h5IHRvIGZpbmQgbW9yZSB1bmxvYWRlZCBjaGlsZHJlbi5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4oY29vcmRzW2ldLCBtYXhDb3ZlcmluZ1pvb20sIHJldGFpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wbGV0ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIGxvYWRlZCBwYXJlbnQgb2YgdGhlIGdpdmVuIHRpbGUgKHVwIHRvIG1pbkNvdmVyaW5nWm9vbSk7XG4gICAgICogYWRkcyB0aGUgZm91bmQgdGlsZSB0byByZXRhaW4gb2JqZWN0IGFuZCByZXR1cm5zIHRoZSB0aWxlIGlmIGZvdW5kXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbkNvdmVyaW5nWm9vbVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV0YWluXG4gICAgICogQHJldHVybnMge1RpbGV9IHRpbGUgb2JqZWN0XG4gICAgICovXG4gICAgZmluZExvYWRlZFBhcmVudDogZnVuY3Rpb24oY29vcmQsIG1pbkNvdmVyaW5nWm9vbSwgcmV0YWluKSB7XG4gICAgICAgIGZvciAodmFyIHogPSBjb29yZC56IC0gMTsgeiA+PSBtaW5Db3ZlcmluZ1pvb207IHotLSkge1xuICAgICAgICAgICAgY29vcmQgPSBjb29yZC5wYXJlbnQodGhpcy5tYXh6b29tKTtcbiAgICAgICAgICAgIHZhciB0aWxlID0gdGhpcy5fdGlsZXNbY29vcmQuaWRdO1xuICAgICAgICAgICAgaWYgKHRpbGUgJiYgdGlsZS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICByZXRhaW5bY29vcmQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRpbGVzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHZpZXdwb3J0IGFuZCBhZGRzIG5ldyB0aWxlcyB0aGF0XG4gICAgICogYXJlIGluc2lkZSB0aGUgdmlld3BvcnQuXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbih1c2VkLCB0cmFuc2Zvcm0sIGZhZGVEdXJhdGlvbikge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIGNvb3JkO1xuICAgICAgICB2YXIgdGlsZTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIG92ZXJ6b29taW5nL3VuZGVyem9vbWluZyBhbW91bnRzLlxuICAgICAgICB2YXIgem9vbSA9IE1hdGguZmxvb3IodGhpcy5nZXRab29tKHRyYW5zZm9ybSkpO1xuICAgICAgICB2YXIgbWluQ292ZXJpbmdab29tID0gdXRpbC5jbGFtcCh6b29tIC0gMTAsIHRoaXMubWluem9vbSwgdGhpcy5tYXh6b29tKTtcbiAgICAgICAgdmFyIG1heENvdmVyaW5nWm9vbSA9IHV0aWwuY2xhbXAoem9vbSArIDEsICB0aGlzLm1pbnpvb20sIHRoaXMubWF4em9vbSk7XG5cbiAgICAgICAgLy8gUmV0YWluIGlzIGEgbGlzdCBvZiB0aWxlcyB0aGF0IHdlIHNob3VsZG4ndCBkZWxldGUsIGV2ZW4gaWYgdGhleSBhcmUgbm90XG4gICAgICAgIC8vIHRoZSBtb3N0IGlkZWFsIHRpbGUgZm9yIHRoZSBjdXJyZW50IHZpZXdwb3J0LiBUaGlzIG1heSBpbmNsdWRlIHRpbGVzIGxpa2VcbiAgICAgICAgLy8gcGFyZW50IG9yIGNoaWxkIHRpbGVzIHRoYXQgYXJlICphbHJlYWR5KiBsb2FkZWQuXG4gICAgICAgIHZhciByZXRhaW4gPSB7fTtcbiAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG4gICAgICAgIC8vIENvdmVyZWQgaXMgYSBsaXN0IG9mIHJldGFpbmVkIHRpbGVzIHdobydzIGFyZWFzIGFyZSBmdWxsIGNvdmVyZWQgYnkgb3RoZXIsXG4gICAgICAgIC8vIGJldHRlciwgcmV0YWluZWQgdGlsZXMuIFRoZXkgYXJlIG5vdCBkcmF3biBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXMgPSB7fTtcblxuICAgICAgICB2YXIgcmVxdWlyZWQgPSB1c2VkID8gdGhpcy5jb3ZlcmluZ1RpbGVzKHRyYW5zZm9ybSkgOiBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb29yZCA9IHJlcXVpcmVkW2ldO1xuICAgICAgICAgICAgdGlsZSA9IHRoaXMuYWRkVGlsZShjb29yZCk7XG5cbiAgICAgICAgICAgIHJldGFpbltjb29yZC5pZF0gPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5sb2FkZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIFRoZSB0aWxlIHdlIHJlcXVpcmUgaXMgbm90IHlldCBsb2FkZWQuXG4gICAgICAgICAgICAvLyBSZXRhaW4gY2hpbGQgb3IgcGFyZW50IHRpbGVzIHRoYXQgY292ZXIgdGhlIHNhbWUgYXJlYS5cbiAgICAgICAgICAgIGlmICghdGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4oY29vcmQsIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZExvYWRlZFBhcmVudChjb29yZCwgbWluQ292ZXJpbmdab29tLCByZXRhaW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaWQgaW4gcmV0YWluKSB7XG4gICAgICAgICAgICBjb29yZCA9IFRpbGVDb29yZC5mcm9tSUQoaWQpO1xuICAgICAgICAgICAgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcbiAgICAgICAgICAgIGlmICh0aWxlICYmIHRpbGUudGltZUFkZGVkID4gbm93IC0gKGZhZGVEdXJhdGlvbiB8fCAwKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgdGlsZSBpcyBzdGlsbCBmYWRpbmcgaW4uIEZpbmQgdGlsZXMgdG8gY3Jvc3MtZmFkZSB3aXRoIGl0LlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRMb2FkZWRDaGlsZHJlbihjb29yZCwgbWF4Q292ZXJpbmdab29tLCByZXRhaW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvdmVyZWRUaWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRhaW5baWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRMb2FkZWRQYXJlbnQoY29vcmQsIG1pbkNvdmVyaW5nWm9vbSwgcmV0YWluKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHRpbGVzIHdlIGRvbid0IG5lZWQgYW55bW9yZS5cbiAgICAgICAgdmFyIHJlbW92ZSA9IHV0aWwua2V5c0RpZmZlcmVuY2UodGhpcy5fdGlsZXMsIHJldGFpbik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByZW1vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGlsZSgrcmVtb3ZlW2ldKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSB0aWxlLCBnaXZlbiBpdHMgY29vcmRpbmF0ZSwgdG8gdGhlIHB5cmFtaWQuXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfSB0aGUgY29vcmRpbmF0ZS5cbiAgICAgKi9cbiAgICBhZGRUaWxlOiBmdW5jdGlvbihjb29yZCkge1xuICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3RpbGVzW2Nvb3JkLmlkXTtcbiAgICAgICAgaWYgKHRpbGUpXG4gICAgICAgICAgICByZXR1cm4gdGlsZTtcblxuICAgICAgICB2YXIgd3JhcHBlZCA9IGNvb3JkLndyYXBwZWQoKTtcbiAgICAgICAgdGlsZSA9IHRoaXMuX3RpbGVzW3dyYXBwZWQuaWRdO1xuXG4gICAgICAgIGlmICghdGlsZSkge1xuICAgICAgICAgICAgdGlsZSA9IHRoaXMuX2NhY2hlLmdldCh3cmFwcGVkLmlkKTtcbiAgICAgICAgICAgIGlmICh0aWxlICYmIHRoaXMuX3JlZG9QbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWRvUGxhY2VtZW50KHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICB2YXIgem9vbSA9IGNvb3JkLno7XG4gICAgICAgICAgICB2YXIgb3ZlcnNjYWxpbmcgPSB6b29tID4gdGhpcy5tYXh6b29tID8gTWF0aC5wb3coMiwgem9vbSAtIHRoaXMubWF4em9vbSkgOiAxO1xuICAgICAgICAgICAgdGlsZSA9IG5ldyBUaWxlKHdyYXBwZWQsIHRoaXMudGlsZVNpemUgKiBvdmVyc2NhbGluZyk7XG4gICAgICAgICAgICB0aGlzLl9sb2FkKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGlsZS51c2VzKys7XG4gICAgICAgIHRoaXMuX3RpbGVzW2Nvb3JkLmlkXSA9IHRpbGU7XG4gICAgICAgIHRoaXMuX2FkZCh0aWxlLCBjb29yZCk7XG5cbiAgICAgICAgcmV0dXJuIHRpbGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHRpbGUsIGdpdmVuIGl0cyBpZCwgZnJvbSB0aGUgcHlyYW1pZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgdGlsZSBpZFxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9IG5vdGhpbmdcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHJlbW92ZVRpbGU6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHZhciB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICBpZiAoIXRpbGUpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGlsZS51c2VzLS07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgIHRoaXMuX3JlbW92ZSh0aWxlKTtcblxuICAgICAgICBpZiAodGlsZS51c2VzID4gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAodGlsZS5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmFkZCh0aWxlLmNvb3JkLndyYXBwZWQoKS5pZCwgdGlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hYm9ydCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMuX3VubG9hZCh0aWxlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIHRpbGVzIGZyb20gdGhpcyBweXJhbWlkXG4gICAgICovXG4gICAgY2xlYXJUaWxlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIGlkIGluIHRoaXMuX3RpbGVzKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaWxlKGlkKTtcbiAgICAgICAgdGhpcy5fY2FjaGUucmVzZXQoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRm9yIGEgZ2l2ZW4gY29vcmRpbmF0ZSwgc2VhcmNoIHRocm91Z2ggb3VyIGN1cnJlbnQgdGlsZXMgYW5kIGF0dGVtcHRcbiAgICAgKiB0byBmaW5kIGEgdGlsZSBhdCB0aGF0IHBvaW50XG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHRpbGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRpbGVBdDogZnVuY3Rpb24oY29vcmQpIHtcbiAgICAgICAgdmFyIGlkcyA9IHRoaXMub3JkZXJlZElEcygpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHRpbGUgPSB0aGlzLl90aWxlc1tpZHNbaV1dO1xuICAgICAgICAgICAgdmFyIHBvcyA9IHRpbGUucG9zaXRpb25BdChjb29yZCwgdGhpcy5tYXh6b29tKTtcbiAgICAgICAgICAgIGlmIChwb3MgJiYgcG9zLnggPj0gMCAmJiBwb3MueCA8IDQwOTYgJiYgcG9zLnkgPj0gMCAmJiBwb3MueSA8IDQwOTYpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgY2xpY2sgaXMgd2l0aGluIHRoZSB2aWV3cG9ydC4gVGhlcmUgaXMgb25seSBldmVyIG9uZSB0aWxlIGluXG4gICAgICAgICAgICAgICAgLy8gYSBsYXllciB0aGF0IGhhcyB0aGlzIHByb3BlcnR5LlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRpbGU6IHRpbGUsXG4gICAgICAgICAgICAgICAgICAgIHg6IHBvcy54LFxuICAgICAgICAgICAgICAgICAgICB5OiBwb3MueSxcbiAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHBvcy5zY2FsZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIEV2ZW50ZWQgPSByZXF1aXJlKCcuLi91dGlsL2V2ZW50ZWQnKTtcbnZhciBTb3VyY2UgPSByZXF1aXJlKCcuL3NvdXJjZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVTb3VyY2U7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVTb3VyY2Uob3B0aW9ucykge1xuICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHV0aWwucGljayhvcHRpb25zLCBbJ3VybCcsICd0aWxlU2l6ZSddKSk7XG5cbiAgICBpZiAodGhpcy50aWxlU2l6ZSAhPT0gNTEyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVjdG9yIHRpbGUgc291cmNlcyBtdXN0IGhhdmUgYSB0aWxlU2l6ZSBvZiA1MTInKTtcbiAgICB9XG5cbiAgICBTb3VyY2UuX2xvYWRUaWxlSlNPTi5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5WZWN0b3JUaWxlU291cmNlLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChFdmVudGVkLCB7XG4gICAgbWluem9vbTogMCxcbiAgICBtYXh6b29tOiAyMixcbiAgICB0aWxlU2l6ZTogNTEyLFxuICAgIHJlcGFyc2VPdmVyc2NhbGVkOiB0cnVlLFxuICAgIF9sb2FkZWQ6IGZhbHNlLFxuXG4gICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9LFxuXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B5cmFtaWQgJiYgdGhpcy5fcHlyYW1pZC5sb2FkZWQoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRoaXMuX3B5cmFtaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3B5cmFtaWQudXBkYXRlKHRoaXMudXNlZCwgdHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9weXJhbWlkLnJlbG9hZCgpO1xuICAgIH0sXG5cbiAgICByZWRvUGxhY2VtZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9weXJhbWlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaWRzID0gdGhpcy5fcHlyYW1pZC5vcmRlcmVkSURzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3B5cmFtaWQuZ2V0VGlsZShpZHNbaV0pO1xuICAgICAgICAgICAgdGhpcy5fcmVkb1RpbGVQbGFjZW1lbnQodGlsZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyOiBTb3VyY2UuX3JlbmRlclRpbGVzLFxuICAgIGZlYXR1cmVzQXQ6IFNvdXJjZS5fdmVjdG9yRmVhdHVyZXNBdCxcblxuICAgIF9sb2FkVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB2YXIgb3ZlcnNjYWxpbmcgPSB0aWxlLmNvb3JkLnogPiB0aGlzLm1heHpvb20gPyBNYXRoLnBvdygyLCB0aWxlLmNvb3JkLnogLSB0aGlzLm1heHpvb20pIDogMTtcbiAgICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHVybDogdGlsZS5jb29yZC51cmwodGhpcy50aWxlcywgdGhpcy5tYXh6b29tKSxcbiAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXG4gICAgICAgICAgICBjb29yZDogdGlsZS5jb29yZCxcbiAgICAgICAgICAgIHpvb206IHRpbGUuY29vcmQueixcbiAgICAgICAgICAgIG1heFpvb206IHRoaXMubWF4em9vbSxcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplICogb3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBvdmVyc2NhbGluZzogb3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICBhbmdsZTogdGhpcy5tYXAudHJhbnNmb3JtLmFuZ2xlLFxuICAgICAgICAgICAgcGl0Y2g6IHRoaXMubWFwLnRyYW5zZm9ybS5waXRjaCxcbiAgICAgICAgICAgIGNvbGxpc2lvbkRlYnVnOiB0aGlzLm1hcC5jb2xsaXNpb25EZWJ1Z1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aWxlLndvcmtlcklEKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2VuZCgncmVsb2FkIHRpbGUnLCBwYXJhbXMsIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCB0aWxlKSwgdGlsZS53b3JrZXJJRCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlLndvcmtlcklEID0gdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ2xvYWQgdGlsZScsIHBhcmFtcywgdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsIHRpbGUpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfdGlsZUxvYWRlZDogZnVuY3Rpb24odGlsZSwgZXJyLCBkYXRhKSB7XG4gICAgICAgIGlmICh0aWxlLmFib3J0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgdGhpcy5maXJlKCd0aWxlLmVycm9yJywge3RpbGU6IHRpbGV9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbGUubG9hZFZlY3RvckRhdGEoZGF0YSk7XG5cbiAgICAgICAgaWYgKHRpbGUucmVkb1doZW5Eb25lKSB7XG4gICAgICAgICAgICB0aWxlLnJlZG9XaGVuRG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fcmVkb1RpbGVQbGFjZW1lbnQodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUoJ3RpbGUubG9hZCcsIHt0aWxlOiB0aWxlfSk7XG4gICAgfSxcblxuICAgIF9hYm9ydFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGlsZS5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ2Fib3J0IHRpbGUnLCB7IHVpZDogdGlsZS51aWQsIHNvdXJjZTogdGhpcy5pZCB9LCBudWxsLCB0aWxlLndvcmtlcklEKTtcbiAgICB9LFxuXG4gICAgX2FkZFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGhpcy5maXJlKCd0aWxlLmFkZCcsIHt0aWxlOiB0aWxlfSk7XG4gICAgfSxcblxuICAgIF9yZW1vdmVUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHRoaXMuZmlyZSgndGlsZS5yZW1vdmUnLCB7dGlsZTogdGlsZX0pO1xuICAgIH0sXG5cbiAgICBfdW5sb2FkVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEodGhpcy5tYXAucGFpbnRlcik7XG4gICAgICAgIHRoaXMuZ2x5cGhBdGxhcy5yZW1vdmVHbHlwaHModGlsZS51aWQpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2VuZCgncmVtb3ZlIHRpbGUnLCB7IHVpZDogdGlsZS51aWQsIHNvdXJjZTogdGhpcy5pZCB9LCBudWxsLCB0aWxlLndvcmtlcklEKTtcbiAgICB9LFxuXG4gICAgX3JlZG9UaWxlUGxhY2VtZW50OiBmdW5jdGlvbih0aWxlKSB7XG5cbiAgICAgICAgaWYgKCF0aWxlLmxvYWRlZCB8fCB0aWxlLnJlZG9pbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIHRpbGUucmVkb1doZW5Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbGUucmVkb2luZ1BsYWNlbWVudCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlZG8gcGxhY2VtZW50Jywge1xuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIGFuZ2xlOiB0aGlzLm1hcC50cmFuc2Zvcm0uYW5nbGUsXG4gICAgICAgICAgICBwaXRjaDogdGhpcy5tYXAudHJhbnNmb3JtLnBpdGNoLFxuICAgICAgICAgICAgY29sbGlzaW9uRGVidWc6IHRoaXMubWFwLmNvbGxpc2lvbkRlYnVnXG4gICAgICAgIH0sIGRvbmUuYmluZCh0aGlzKSwgdGlsZS53b3JrZXJJRCk7XG5cbiAgICAgICAgZnVuY3Rpb24gZG9uZShfLCBkYXRhKSB7XG4gICAgICAgICAgICB0aWxlLnJlbG9hZFN5bWJvbERhdGEoZGF0YSwgdGhpcy5tYXAucGFpbnRlcik7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3RpbGUubG9hZCcsIHt0aWxlOiB0aWxlfSk7XG5cbiAgICAgICAgICAgIHRpbGUucmVkb2luZ1BsYWNlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRpbGUucmVkb1doZW5Eb25lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVkb1RpbGVQbGFjZW1lbnQodGlsZSk7XG4gICAgICAgICAgICAgICAgdGlsZS5yZWRvV2hlbkRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIFRpbGUgPSByZXF1aXJlKCcuL3RpbGUnKTtcbnZhciBMYXRMbmcgPSByZXF1aXJlKCcuLi9nZW8vbGF0X2xuZycpO1xudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbnZhciBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG52YXIgQ29vcmRpbmF0ZSA9IHJlcXVpcmUoJy4uL2dlby9jb29yZGluYXRlJyk7XG52YXIgYWpheCA9IHJlcXVpcmUoJy4uL3V0aWwvYWpheCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpZGVvU291cmNlO1xuXG4vKipcbiAqIENyZWF0ZSBhIFZpZGVvIGRhdGEgc291cmNlIGluc3RhbmNlIGdpdmVuIGFuIG9wdGlvbnMgb2JqZWN0XG4gKiBAY2xhc3MgVmlkZW9Tb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBvcHRpb25zLnVybCBBIHN0cmluZyBvciBhcnJheSBvZiBVUkwocykgdG8gdmlkZW8gZmlsZXNcbiAqIEBwYXJhbSB7QXJyYXl9IG9wdGlvbnMuY29vcmRpbmF0ZXMgbGF0LGxuZyBjb29yZGluYXRlcyBpbiBvcmRlciBjbG9ja3dpc2Ugc3RhcnRpbmcgYXQgdGhlIHRvcCBsZWZ0OiB0bCwgdHIsIGJyLCBibFxuICogQGV4YW1wbGVcbiAqIHZhciBzb3VyY2VPYmogPSBuZXcgbWFwYm94Z2wuVmlkZW9Tb3VyY2Uoe1xuICogICAgdXJsOiBbXG4gKiAgICAgICAgJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vdmlkZW9zL2JhbHRpbW9yZS1zbW9rZS5tcDQnLFxuICogICAgICAgICdodHRwczovL3d3dy5tYXBib3guY29tL3ZpZGVvcy9iYWx0aW1vcmUtc21va2Uud2VibSdcbiAqICAgIF0sXG4gKiAgICBjb29yZGluYXRlczogW1xuICogICAgICAgIFszOS4xODU3OTkwNzIyOTc0OCwgLTc2LjU0MzM1NzM3MjI4Mzk0XSxcbiAqICAgICAgICBbMzkuMTgzODM2NDg0NzU4NywgLTc2LjUyODAzNjU5NDM5MDg3XSxcbiAqICAgICAgICBbMzkuMTc2ODMzOTI1MDc2MDYsIC03Ni41Mjk1Mzg2MzE0MzkyXSxcbiAqICAgICAgICBbMzkuMTc4NzYzNDQxMDY2NDIsIC03Ni41NDUyMDI3MzIwODYxOF1cbiAqICAgIF1cbiAqIH0pO1xuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHNvdXJjZU9iaik7IC8vIGFkZFxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKi9cbmZ1bmN0aW9uIFZpZGVvU291cmNlKG9wdGlvbnMpIHtcbiAgICB0aGlzLmNvb3JkaW5hdGVzID0gb3B0aW9ucy5jb29yZGluYXRlcztcblxuICAgIGFqYXguZ2V0VmlkZW8ob3B0aW9ucy51cmwsIGZ1bmN0aW9uKGVyciwgdmlkZW8pIHtcbiAgICAgICAgLy8gQFRPRE8gaGFuZGxlIGVycm9ycyB2aWEgZXZlbnQuXG4gICAgICAgIGlmIChlcnIpIHJldHVybjtcblxuICAgICAgICB0aGlzLnZpZGVvID0gdmlkZW87XG4gICAgICAgIHRoaXMudmlkZW8ubG9vcCA9IHRydWU7XG5cbiAgICAgICAgdmFyIGxvb3BJRDtcblxuICAgICAgICAvLyBzdGFydCByZXBhaW50aW5nIHdoZW4gdmlkZW8gc3RhcnRzIHBsYXlpbmdcbiAgICAgICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBsb29wSUQgPSB0aGlzLm1hcC5zdHlsZS5hbmltYXRpb25Mb29wLnNldChJbmZpbml0eSk7XG4gICAgICAgICAgICB0aGlzLm1hcC5fcmVyZW5kZXIoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyBzdG9wIHJlcGFpbnRpbmcgd2hlbiB2aWRlbyBzdG9wc1xuICAgICAgICB0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5zdHlsZS5hbmltYXRpb25Mb29wLmNhbmNlbChsb29wSUQpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVGlsZSgpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdjaGFuZ2UnKTtcbiAgICAgICAgfVxuICAgIH0uYmluZCh0aGlzKSk7XG59XG5cblZpZGVvU291cmNlLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChFdmVudGVkLCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBIVE1MIHZpZGVvIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldFZpZGVvOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW87XG4gICAgfSxcblxuICAgIG9uQWRkOiBmdW5jdGlvbihtYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVGlsZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZVRpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBDYWxjdWxhdGUgd2hpY2ggbWVyY2F0b3IgdGlsZSBpcyBzdWl0YWJsZSBmb3IgcmVuZGVyaW5nIHRoZSB2aWRlbyBpblxuICAgICAgICAgKiBhbmQgY3JlYXRlIGEgYnVmZmVyIHdpdGggdGhlIGNvcm5lciBjb29yZGluYXRlcy4gVGhlc2UgY29vcmRpbmF0ZXNcbiAgICAgICAgICogbWF5IGJlIG91dHNpZGUgdGhlIHRpbGUsIGJlY2F1c2UgcmFzdGVyIHRpbGVzIGFyZW4ndCBjbGlwcGVkIHdoZW4gcmVuZGVyaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIG1hcCA9IHRoaXMubWFwO1xuICAgICAgICB2YXIgY29vcmRzID0gdGhpcy5jb29yZGluYXRlcy5tYXAoZnVuY3Rpb24obGF0bG5nKSB7XG4gICAgICAgICAgICB2YXIgbG9jID0gTGF0TG5nLmNvbnZlcnQobGF0bG5nKTtcbiAgICAgICAgICAgIHJldHVybiBtYXAudHJhbnNmb3JtLmxvY2F0aW9uQ29vcmRpbmF0ZShsb2MpLnpvb21UbygwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIG1pblggPSBJbmZpbml0eTtcbiAgICAgICAgdmFyIG1pblkgPSBJbmZpbml0eTtcbiAgICAgICAgdmFyIG1heFggPSAtSW5maW5pdHk7XG4gICAgICAgIHZhciBtYXhZID0gLUluZmluaXR5O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgY29vcmRzW2ldLmNvbHVtbik7XG4gICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgY29vcmRzW2ldLnJvdyk7XG4gICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY29vcmRzW2ldLmNvbHVtbik7XG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgY29vcmRzW2ldLnJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZHggPSBtYXhYIC0gbWluWDtcbiAgICAgICAgdmFyIGR5ID0gbWF4WSAtIG1pblk7XG4gICAgICAgIHZhciBkTWF4ID0gTWF0aC5tYXgoZHgsIGR5KTtcbiAgICAgICAgdmFyIGNlbnRlciA9IG5ldyBDb29yZGluYXRlKChtaW5YICsgbWF4WCkgLyAyLCAobWluWSArIG1heFkpIC8gMiwgMClcbiAgICAgICAgICAgIC56b29tVG8oTWF0aC5mbG9vcigtTWF0aC5sb2coZE1heCkgLyBNYXRoLkxOMikpO1xuXG4gICAgICAgIHZhciB0aWxlRXh0ZW50ID0gNDA5NjtcbiAgICAgICAgdmFyIHRpbGVDb29yZHMgPSBjb29yZHMubWFwKGZ1bmN0aW9uKGNvb3JkKSB7XG4gICAgICAgICAgICB2YXIgem9vbWVkQ29vcmQgPSBjb29yZC56b29tVG8oY2VudGVyLnpvb20pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKCh6b29tZWRDb29yZC5jb2x1bW4gLSBjZW50ZXIuY29sdW1uKSAqIHRpbGVFeHRlbnQpLFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpvb21lZENvb3JkLnJvdyAtIGNlbnRlci5yb3cpICogdGlsZUV4dGVudCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgZ2wgPSBtYXAucGFpbnRlci5nbDtcbiAgICAgICAgdmFyIG1heEludDE2ID0gMzI3Njc7XG4gICAgICAgIHZhciBhcnJheSA9IG5ldyBJbnQxNkFycmF5KFtcbiAgICAgICAgICAgIHRpbGVDb29yZHNbMF0ueCwgdGlsZUNvb3Jkc1swXS55LCAwLCAwLFxuICAgICAgICAgICAgdGlsZUNvb3Jkc1sxXS54LCB0aWxlQ29vcmRzWzFdLnksIG1heEludDE2LCAwLFxuICAgICAgICAgICAgdGlsZUNvb3Jkc1szXS54LCB0aWxlQ29vcmRzWzNdLnksIDAsIG1heEludDE2LFxuICAgICAgICAgICAgdGlsZUNvb3Jkc1syXS54LCB0aWxlQ29vcmRzWzJdLnksIG1heEludDE2LCBtYXhJbnQxNlxuICAgICAgICBdKTtcblxuICAgICAgICB0aGlzLnRpbGUgPSBuZXcgVGlsZSgpO1xuICAgICAgICB0aGlzLnRpbGUuYnVja2V0cyA9IHt9O1xuXG4gICAgICAgIHRoaXMudGlsZS5ib3VuZHNCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMudGlsZS5ib3VuZHNCdWZmZXIpO1xuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgYXJyYXksIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgICAgICB0aGlzLmNlbnRlciA9IGNlbnRlcjtcbiAgICB9LFxuXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW8gJiYgdGhpcy52aWRlby5yZWFkeVN0YXRlID49IDI7XG4gICAgfSxcblxuICAgIHVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9LFxuXG4gICAgcmVuZGVyOiBmdW5jdGlvbihsYXllcnMsIHBhaW50ZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMudmlkZW8ucmVhZHlTdGF0ZSA8IDIpIHJldHVybjsgLy8gbm90IGVub3VnaCBkYXRhIGZvciBjdXJyZW50IHBvc2l0aW9uXG5cbiAgICAgICAgdmFyIGMgPSB0aGlzLmNlbnRlcjtcbiAgICAgICAgdGhpcy50aWxlLmNhbGN1bGF0ZU1hdHJpY2VzKGMuem9vbSwgYy5jb2x1bW4sIGMucm93LCB0aGlzLm1hcC50cmFuc2Zvcm0sIHBhaW50ZXIpO1xuXG4gICAgICAgIHZhciBnbCA9IHBhaW50ZXIuZ2w7XG4gICAgICAgIGlmICghdGhpcy50aWxlLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZS50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50aWxlLnRleHR1cmUpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMudmlkZW8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50aWxlLnRleHR1cmUpO1xuICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLnZpZGVvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhaW50ZXIuZHJhd0xheWVycyhsYXllcnMsIHRoaXMudGlsZS5wb3NNYXRyaXgsIHRoaXMudGlsZSk7XG4gICAgfSxcblxuICAgIGZlYXR1cmVzQXQ6IGZ1bmN0aW9uKHBvaW50LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBbXSk7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBBY3RvciA9IHJlcXVpcmUoJy4uL3V0aWwvYWN0b3InKTtcbnZhciBXb3JrZXJUaWxlID0gcmVxdWlyZSgnLi93b3JrZXJfdGlsZScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG52YXIgdnQgPSByZXF1aXJlKCd2ZWN0b3ItdGlsZScpO1xudmFyIFByb3RvYnVmID0gcmVxdWlyZSgncGJmJyk7XG5cbnZhciBnZW9qc29udnQgPSByZXF1aXJlKCdnZW9qc29uLXZ0Jyk7XG52YXIgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2dlb2pzb25fd3JhcHBlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdvcmtlcjtcblxuZnVuY3Rpb24gV29ya2VyKHNlbGYpIHtcbiAgICB0aGlzLnNlbGYgPSBzZWxmO1xuICAgIHRoaXMuYWN0b3IgPSBuZXcgQWN0b3Ioc2VsZiwgdGhpcyk7XG4gICAgdGhpcy5sb2FkaW5nID0ge307XG5cbiAgICB0aGlzLmxvYWRlZCA9IHt9O1xuICAgIHRoaXMubGF5ZXJzID0gW107XG4gICAgdGhpcy5nZW9KU09OSW5kZXhlcyA9IHt9O1xufVxuXG51dGlsLmV4dGVuZChXb3JrZXIucHJvdG90eXBlLCB7XG4gICAgJ3NldCBsYXllcnMnOiBmdW5jdGlvbihsYXllcnMpIHtcbiAgICAgICAgdGhpcy5sYXllcnMgPSBsYXllcnM7XG4gICAgfSxcblxuICAgICdsb2FkIHRpbGUnOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBwYXJhbXMuc291cmNlLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcblxuICAgICAgICBpZiAoIXRoaXMubG9hZGluZ1tzb3VyY2VdKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nW3NvdXJjZV0gPSB7fTtcblxuXG4gICAgICAgIHZhciB0aWxlID0gdGhpcy5sb2FkaW5nW3NvdXJjZV1bdWlkXSA9IG5ldyBXb3JrZXJUaWxlKHBhcmFtcyk7XG5cbiAgICAgICAgdGlsZS54aHIgPSBhamF4LmdldEFycmF5QnVmZmVyKHBhcmFtcy51cmwsIGRvbmUuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdbc291cmNlXVt1aWRdO1xuXG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAgICAgdGlsZS5kYXRhID0gbmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKG5ldyBVaW50OEFycmF5KGRhdGEpKSk7XG4gICAgICAgICAgICB0aWxlLnBhcnNlKHRpbGUuZGF0YSwgdGhpcy5sYXllcnMsIHRoaXMuYWN0b3IsIGNhbGxiYWNrKTtcblxuICAgICAgICAgICAgdGhpcy5sb2FkZWRbc291cmNlXSA9IHRoaXMubG9hZGVkW3NvdXJjZV0gfHwge307XG4gICAgICAgICAgICB0aGlzLmxvYWRlZFtzb3VyY2VdW3VpZF0gPSB0aWxlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdyZWxvYWQgdGlsZSc6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGxvYWRlZCA9IHRoaXMubG9hZGVkW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgdmFyIHRpbGUgPSBsb2FkZWRbdWlkXTtcbiAgICAgICAgICAgIHRpbGUucGFyc2UodGlsZS5kYXRhLCB0aGlzLmxheWVycywgdGhpcy5hY3RvciwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdhYm9ydCB0aWxlJzogZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgICAgIHZhciBsb2FkaW5nID0gdGhpcy5sb2FkaW5nW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRpbmcgJiYgbG9hZGluZ1t1aWRdKSB7XG4gICAgICAgICAgICBsb2FkaW5nW3VpZF0ueGhyLmFib3J0KCk7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGluZ1t1aWRdO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdyZW1vdmUgdGlsZSc6IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgICAgICB2YXIgbG9hZGVkID0gdGhpcy5sb2FkZWRbcGFyYW1zLnNvdXJjZV0sXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkO1xuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGVkW3VpZF07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ3JlZG8gcGxhY2VtZW50JzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgbG9hZGVkID0gdGhpcy5sb2FkZWRbcGFyYW1zLnNvdXJjZV0sXG4gICAgICAgICAgICBsb2FkaW5nID0gdGhpcy5sb2FkaW5nW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcblxuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICB2YXIgdGlsZSA9IGxvYWRlZFt1aWRdO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRpbGUucmVkb1BsYWNlbWVudChwYXJhbXMuYW5nbGUsIHBhcmFtcy5waXRjaCwgcGFyYW1zLmNvbGxpc2lvbkRlYnVnKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQucmVzdWx0LCByZXN1bHQudHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChsb2FkaW5nICYmIGxvYWRpbmdbdWlkXSkge1xuICAgICAgICAgICAgbG9hZGluZ1t1aWRdLmFuZ2xlID0gcGFyYW1zLmFuZ2xlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdwYXJzZSBnZW9qc29uJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaW5kZXhEYXRhID0gZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIHRoaXMuZ2VvSlNPTkluZGV4ZXNbcGFyYW1zLnNvdXJjZV0gPSBnZW9qc29udnQoZGF0YSwge2Jhc2Vab29tOiBwYXJhbXMubWF4Wm9vbX0pO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcblxuICAgICAgICAvLyBUT0RPIGFjY2VwdCBwYXJhbXMudXJsIGZvciB1cmxzIGluc3RlYWRcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMuZGF0YSA9PT0gJ3N0cmluZycpIGFqYXguZ2V0SlNPTihwYXJhbXMuZGF0YSwgaW5kZXhEYXRhKTtcbiAgICAgICAgZWxzZSBpbmRleERhdGEobnVsbCwgcGFyYW1zLmRhdGEpO1xuICAgIH0sXG5cbiAgICAnbG9hZCBnZW9qc29uIHRpbGUnOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBwYXJhbXMuc291cmNlLFxuICAgICAgICAgICAgY29vcmQgPSBwYXJhbXMuY29vcmQ7XG5cbiAgICAgICAgLy8gY29uc29sZS50aW1lKCd0aWxlICcgKyBjb29yZC56ICsgJyAnICsgY29vcmQueCArICcgJyArIGNvb3JkLnkpO1xuXG4gICAgICAgIHZhciBnZW9KU09OVGlsZSA9IHRoaXMuZ2VvSlNPTkluZGV4ZXNbc291cmNlXS5nZXRUaWxlKGNvb3JkLnosIGNvb3JkLngsIGNvb3JkLnkpO1xuXG4gICAgICAgIC8vIGNvbnNvbGUudGltZUVuZCgndGlsZSAnICsgY29vcmQueiArICcgJyArIGNvb3JkLnggKyAnICcgKyBjb29yZC55KTtcblxuICAgICAgICAvLyBpZiAoIWdlb0pTT05UaWxlKSBjb25zb2xlLmxvZygnbm90IGZvdW5kJywgdGhpcy5nZW9KU09OSW5kZXhlc1tzb3VyY2VdLCBjb29yZCk7XG5cbiAgICAgICAgaWYgKCFnZW9KU09OVGlsZSkgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG51bGwpOyAvLyBub3RoaW5nIGluIHRoZSBnaXZlbiB0aWxlXG5cbiAgICAgICAgdmFyIHRpbGUgPSBuZXcgV29ya2VyVGlsZShwYXJhbXMpO1xuICAgICAgICB0aWxlLnBhcnNlKG5ldyBHZW9KU09OV3JhcHBlcihnZW9KU09OVGlsZS5mZWF0dXJlcyksIHRoaXMubGF5ZXJzLCB0aGlzLmFjdG9yLCBjYWxsYmFjayk7XG5cbiAgICAgICAgdGhpcy5sb2FkZWRbc291cmNlXSA9IHRoaXMubG9hZGVkW3NvdXJjZV0gfHwge307XG4gICAgICAgIHRoaXMubG9hZGVkW3NvdXJjZV1bcGFyYW1zLnVpZF0gPSB0aWxlO1xuICAgIH0sXG5cbiAgICAncXVlcnkgZmVhdHVyZXMnOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciB0aWxlID0gdGhpcy5sb2FkZWRbcGFyYW1zLnNvdXJjZV0gJiYgdGhpcy5sb2FkZWRbcGFyYW1zLnNvdXJjZV1bcGFyYW1zLnVpZF07XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aWxlLmZlYXR1cmVUcmVlLnF1ZXJ5KHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgW10pO1xuICAgICAgICB9XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBGZWF0dXJlVHJlZSA9IHJlcXVpcmUoJy4uL2RhdGEvZmVhdHVyZV90cmVlJyk7XG52YXIgQ29sbGlzaW9uID0gcmVxdWlyZSgnLi4vc3ltYm9sL2NvbGxpc2lvbl90aWxlJyk7XG52YXIgQnVmZmVyU2V0ID0gcmVxdWlyZSgnLi4vZGF0YS9idWZmZXIvYnVmZmVyX3NldCcpO1xudmFyIGNyZWF0ZUJ1Y2tldCA9IHJlcXVpcmUoJy4uL2RhdGEvY3JlYXRlX2J1Y2tldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdvcmtlclRpbGU7XG5cbmZ1bmN0aW9uIFdvcmtlclRpbGUocGFyYW1zKSB7XG4gICAgdGhpcy5jb29yZCA9IHBhcmFtcy5jb29yZDtcbiAgICB0aGlzLnVpZCA9IHBhcmFtcy51aWQ7XG4gICAgdGhpcy56b29tID0gcGFyYW1zLnpvb207XG4gICAgdGhpcy5tYXhab29tID0gcGFyYW1zLm1heFpvb207XG4gICAgdGhpcy50aWxlU2l6ZSA9IHBhcmFtcy50aWxlU2l6ZTtcbiAgICB0aGlzLnNvdXJjZSA9IHBhcmFtcy5zb3VyY2U7XG4gICAgdGhpcy5vdmVyc2NhbGluZyA9IHBhcmFtcy5vdmVyc2NhbGluZztcbiAgICB0aGlzLmFuZ2xlID0gcGFyYW1zLmFuZ2xlO1xuICAgIHRoaXMucGl0Y2ggPSBwYXJhbXMucGl0Y2g7XG4gICAgdGhpcy5jb2xsaXNpb25EZWJ1ZyA9IHBhcmFtcy5jb2xsaXNpb25EZWJ1ZztcblxuICAgIHRoaXMuc3RhY2tzID0ge307XG59XG5cbldvcmtlclRpbGUucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oZGF0YSwgbGF5ZXJzLCBhY3RvciwgY2FsbGJhY2spIHtcblxuICAgIHRoaXMuc3RhdHVzID0gJ3BhcnNpbmcnO1xuXG4gICAgdGhpcy5mZWF0dXJlVHJlZSA9IG5ldyBGZWF0dXJlVHJlZSh0aGlzLmNvb3JkLCB0aGlzLm92ZXJzY2FsaW5nKTtcblxuICAgIHZhciBpLCBrLFxuICAgICAgICB0aWxlID0gdGhpcyxcbiAgICAgICAgbGF5ZXIsXG4gICAgICAgIGJ1Y2tldCxcbiAgICAgICAgYnVmZmVycyA9IG5ldyBCdWZmZXJTZXQoKSxcbiAgICAgICAgY29sbGlzaW9uID0gdGhpcy5jb2xsaXNpb24gPSBuZXcgQ29sbGlzaW9uKHRoaXMuem9vbSwgNDA5NiwgdGhpcy50aWxlU2l6ZSksXG4gICAgICAgIGJ1Y2tldHMgPSB7fSxcbiAgICAgICAgYnVja2V0c0luT3JkZXIgPSB0aGlzLmJ1Y2tldHNJbk9yZGVyID0gW10sXG4gICAgICAgIGJ1Y2tldHNCeVNvdXJjZUxheWVyID0ge307XG5cbiAgICBjb2xsaXNpb24ucmVzZXQodGhpcy5hbmdsZSwgdGhpcy5waXRjaCk7XG5cbiAgICAvLyBNYXAgbm9uLXJlZiBsYXllcnMgdG8gYnVja2V0cy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxheWVyID0gbGF5ZXJzW2ldO1xuXG4gICAgICAgIGlmIChsYXllci5zb3VyY2UgIT09IHRoaXMuc291cmNlKVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgaWYgKGxheWVyLnJlZilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIHZhciBtaW56b29tID0gbGF5ZXIubWluem9vbTtcbiAgICAgICAgaWYgKG1pbnpvb20gJiYgdGhpcy56b29tIDwgbWluem9vbSAmJiBtaW56b29tIDwgdGhpcy5tYXhab29tKVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgdmFyIG1heHpvb20gPSBsYXllci5tYXh6b29tO1xuICAgICAgICBpZiAobWF4em9vbSAmJiB0aGlzLnpvb20gPj0gbWF4em9vbSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIHZhciB2aXNpYmlsaXR5ID0gbGF5ZXIubGF5b3V0LnZpc2liaWxpdHk7XG4gICAgICAgIGlmICh2aXNpYmlsaXR5ID09PSAnbm9uZScpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBidWNrZXQgPSBjcmVhdGVCdWNrZXQobGF5ZXIsIGJ1ZmZlcnMsIGNvbGxpc2lvbiwgdGhpcy56b29tLCB0aGlzLm92ZXJzY2FsaW5nLCB0aGlzLmNvbGxpc2lvbkRlYnVnKTtcbiAgICAgICAgYnVja2V0LmxheWVycyA9IFtsYXllci5pZF07XG5cbiAgICAgICAgYnVja2V0c1tidWNrZXQuaWRdID0gYnVja2V0O1xuICAgICAgICBidWNrZXRzSW5PcmRlci5wdXNoKGJ1Y2tldCk7XG5cbiAgICAgICAgaWYgKGRhdGEubGF5ZXJzKSB7XG4gICAgICAgICAgICAvLyB2ZWN0b3J0aWxlXG4gICAgICAgICAgICB2YXIgc291cmNlTGF5ZXIgPSBsYXllclsnc291cmNlLWxheWVyJ107XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldHNCeVNvdXJjZUxheWVyW3NvdXJjZUxheWVyXSlcbiAgICAgICAgICAgICAgICBidWNrZXRzQnlTb3VyY2VMYXllcltzb3VyY2VMYXllcl0gPSB7fTtcbiAgICAgICAgICAgIGJ1Y2tldHNCeVNvdXJjZUxheWVyW3NvdXJjZUxheWVyXVtidWNrZXQuaWRdID0gYnVja2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZ2VvanNvbiB0aWxlXG4gICAgICAgICAgICBidWNrZXRzQnlTb3VyY2VMYXllcltidWNrZXQuaWRdID0gYnVja2V0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5kZXggcmVmIGxheWVycy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxheWVyID0gbGF5ZXJzW2ldO1xuXG4gICAgICAgIGlmIChsYXllci5zb3VyY2UgIT09IHRoaXMuc291cmNlKVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgaWYgKCFsYXllci5yZWYpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBidWNrZXQgPSBidWNrZXRzW2xheWVyLnJlZl07XG4gICAgICAgIGlmICghYnVja2V0KVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgYnVja2V0LmxheWVycy5wdXNoKGxheWVyLmlkKTtcbiAgICB9XG5cbiAgICAvLyByZWFkIGVhY2ggbGF5ZXIsIGFuZCBzb3J0IGl0cyBmZWF0dXJlcyBpbnRvIGJ1Y2tldHNcbiAgICBpZiAoZGF0YS5sYXllcnMpIHtcbiAgICAgICAgLy8gdmVjdG9ydGlsZVxuICAgICAgICBmb3IgKGsgaW4gYnVja2V0c0J5U291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgIGxheWVyID0gZGF0YS5sYXllcnNba107XG4gICAgICAgICAgICBpZiAoIWxheWVyKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNvcnRMYXllckludG9CdWNrZXRzKGxheWVyLCBidWNrZXRzQnlTb3VyY2VMYXllcltrXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBnZW9qc29uXG4gICAgICAgIHNvcnRMYXllckludG9CdWNrZXRzKGRhdGEsIGJ1Y2tldHNCeVNvdXJjZUxheWVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzb3J0TGF5ZXJJbnRvQnVja2V0cyhsYXllciwgYnVja2V0cykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoaSk7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYnVja2V0cykge1xuICAgICAgICAgICAgICAgIHZhciBidWNrZXQgPSBidWNrZXRzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5maWx0ZXIoZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LmZlYXR1cmVzLnB1c2goZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZQbGFjZW1lbnRCdWNrZXQ7XG4gICAgdmFyIHJlbWFpbmluZyA9IGJ1Y2tldHNJbk9yZGVyLmxlbmd0aDtcblxuICAgIC8qXG4gICAgICogIFRoZSBhc3luYyBwYXJzaW5nIGhlcmUgaXMgYSBiaXQgdHJpY2t5LlxuICAgICAqICBTb21lIGJ1Y2tldHMgZGVwZW5kIG9uIHJlc291cmNlcyB0aGF0IG1heSBuZWVkIHRvIGJlIGxvYWRlZCBhc3luYyAoZ2x5cGhzKS5cbiAgICAgKiAgU29tZSBidWNrZXRzIG5lZWQgdG8gYmUgcGFyc2VkIGluIG9yZGVyICh0byBnZXQgY29sbGlzaW9uIHByaW9yaXRpZXMgcmlnaHQpLlxuICAgICAqXG4gICAgICogIERlcGVuZGVuY2llcyBjYWxscyBhcmUgaW5pdGlhdGVkIGZpcnN0IHRvIGdldCB0aG9zZSByb2xsaW5nLlxuICAgICAqICBCdWNrZXRzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBwYXJzZWQgaW4gb3JkZXIsIGFyZW4ndCB0byBzYXZlIHRpbWUuXG4gICAgICovXG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgYnVja2V0c0luT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYnVja2V0ID0gYnVja2V0c0luT3JkZXJbaV07XG5cbiAgICAgICAgLy8gTGluayBidWNrZXRzIHRoYXQgbmVlZCB0byBiZSBwYXJzZWQgaW4gb3JkZXJcbiAgICAgICAgaWYgKGJ1Y2tldC5jb2xsaXNpb24pIHtcbiAgICAgICAgICAgIGlmIChwcmV2UGxhY2VtZW50QnVja2V0KSB7XG4gICAgICAgICAgICAgICAgcHJldlBsYWNlbWVudEJ1Y2tldC5uZXh0ID0gYnVja2V0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWNrZXQucHJldmlvdXNQbGFjZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldlBsYWNlbWVudEJ1Y2tldCA9IGJ1Y2tldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChidWNrZXQuZ2V0RGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICBidWNrZXQuZ2V0RGVwZW5kZW5jaWVzKHRoaXMsIGFjdG9yLCBkZXBlbmRlbmNpZXNEb25lKGJ1Y2tldCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgcGFyc2UgYnVja2V0cyB3aGVyZSBvcmRlciBkb2Vzbid0IG1hdHRlciBhbmQgbm8gZGVwZW5kZW5jaWVzXG4gICAgICAgIGlmICghYnVja2V0LmNvbGxpc2lvbiAmJiAhYnVja2V0LmdldERlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgcGFyc2VCdWNrZXQodGlsZSwgYnVja2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcGVuZGVuY2llc0RvbmUoYnVja2V0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5kZXBlbmRlbmNpZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgcGFyc2VCdWNrZXQodGlsZSwgYnVja2V0LCBlcnIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlQnVja2V0KHRpbGUsIGJ1Y2tldCwgc2tpcCkge1xuICAgICAgICBpZiAoYnVja2V0LmdldERlcGVuZGVuY2llcyAmJiAhYnVja2V0LmRlcGVuZGVuY2llc0xvYWRlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoYnVja2V0LmNvbGxpc2lvbiAmJiAhYnVja2V0LnByZXZpb3VzUGxhY2VkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCFza2lwKSB7XG4gICAgICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGlmIChidWNrZXQuZmVhdHVyZXMubGVuZ3RoKSBidWNrZXQuYWRkRmVhdHVyZXMoKTtcbiAgICAgICAgICAgIHZhciB0aW1lID0gRGF0ZS5ub3coKSAtIG5vdztcbiAgICAgICAgICAgIGlmIChidWNrZXQuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Y2tldC5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZSA9IGJ1Y2tldC5mZWF0dXJlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5mZWF0dXJlVHJlZS5pbnNlcnQoZmVhdHVyZS5iYm94KCksIGJ1Y2tldC5sYXllcnMsIGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmJ1Y2tldFN0YXRzID0gc2VsZi5idWNrZXRTdGF0cyB8fCB7X3RvdGFsOiAwfTtcbiAgICAgICAgICAgICAgICBzZWxmLmJ1Y2tldFN0YXRzLl90b3RhbCArPSB0aW1lO1xuICAgICAgICAgICAgICAgIHNlbGYuYnVja2V0U3RhdHNbYnVja2V0LmlkXSA9IChzZWxmLmJ1Y2tldFN0YXRzW2J1Y2tldC5pZF0gfHwgMCkgKyB0aW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVtYWluaW5nLS07XG5cbiAgICAgICAgaWYgKCFyZW1haW5pbmcpIHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyeSBwYXJzaW5nIHRoZSBuZXh0IGJ1Y2tldCwgaWYgaXQgaXMgcmVhZHlcbiAgICAgICAgaWYgKGJ1Y2tldC5uZXh0KSB7XG4gICAgICAgICAgICBidWNrZXQubmV4dC5wcmV2aW91c1BsYWNlZCA9IHRydWU7XG4gICAgICAgICAgICBwYXJzZUJ1Y2tldCh0aWxlLCBidWNrZXQubmV4dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkb25lKCkge1xuXG4gICAgICAgIHRpbGUuc3RhdHVzID0gJ2RvbmUnO1xuXG4gICAgICAgIGlmICh0aWxlLnJlZG9QbGFjZW1lbnRBZnRlckRvbmUpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aWxlLnJlZG9QbGFjZW1lbnQodGlsZS5hbmdsZSwgdGlsZS5waXRjaCkucmVzdWx0O1xuICAgICAgICAgICAgYnVmZmVycy5nbHlwaFZlcnRleCA9IHJlc3VsdC5idWZmZXJzLmdseXBoVmVydGV4O1xuICAgICAgICAgICAgYnVmZmVycy5pY29uVmVydGV4ID0gcmVzdWx0LmJ1ZmZlcnMuaWNvblZlcnRleDtcbiAgICAgICAgICAgIGJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4ID0gcmVzdWx0LmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyYW5zZmVyYWJsZXMgPSBbXSxcbiAgICAgICAgICAgIGVsZW1lbnRHcm91cHMgPSB7fTtcblxuICAgICAgICBmb3IgKGsgaW4gYnVmZmVycykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGJ1ZmZlcnNba10uYXJyYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChrIGluIGJ1Y2tldHMpIHtcbiAgICAgICAgICAgIGVsZW1lbnRHcm91cHNba10gPSBidWNrZXRzW2tdLmVsZW1lbnRHcm91cHM7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgICAgICBlbGVtZW50R3JvdXBzOiBlbGVtZW50R3JvdXBzLFxuICAgICAgICAgICAgYnVmZmVyczogYnVmZmVyc1xuICAgICAgICB9LCB0cmFuc2ZlcmFibGVzKTtcbiAgICB9XG59O1xuXG5Xb3JrZXJUaWxlLnByb3RvdHlwZS5yZWRvUGxhY2VtZW50ID0gZnVuY3Rpb24oYW5nbGUsIHBpdGNoLCBjb2xsaXNpb25EZWJ1Zykge1xuXG4gICAgaWYgKHRoaXMuc3RhdHVzICE9PSAnZG9uZScpIHtcbiAgICAgICAgdGhpcy5yZWRvUGxhY2VtZW50QWZ0ZXJEb25lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlcnMgPSBuZXcgQnVmZmVyU2V0KCk7XG4gICAgdmFyIHRyYW5zZmVyYWJsZXMgPSBbXTtcbiAgICB2YXIgZWxlbWVudEdyb3VwcyA9IHt9O1xuICAgIHZhciBjb2xsaXNpb24gPSB0aGlzLmNvbGxpc2lvbjtcblxuICAgIGNvbGxpc2lvbi5yZXNldChhbmdsZSwgcGl0Y2gpO1xuXG4gICAgdmFyIGJ1Y2tldHNJbk9yZGVyID0gdGhpcy5idWNrZXRzSW5PcmRlcjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Y2tldHNJbk9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBidWNrZXQgPSBidWNrZXRzSW5PcmRlcltpXTtcblxuICAgICAgICBpZiAoYnVja2V0LnR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICBidWNrZXQucGxhY2VGZWF0dXJlcyhidWZmZXJzLCBjb2xsaXNpb25EZWJ1Zyk7XG4gICAgICAgICAgICBlbGVtZW50R3JvdXBzW2J1Y2tldC5pZF0gPSBidWNrZXQuZWxlbWVudEdyb3VwcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGsgaW4gYnVmZmVycykge1xuICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2goYnVmZmVyc1trXS5hcnJheSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICBlbGVtZW50R3JvdXBzOiBlbGVtZW50R3JvdXBzLFxuICAgICAgICAgICAgYnVmZmVyczogYnVmZmVyc1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2ZlcmFibGVzOiB0cmFuc2ZlcmFibGVzXG4gICAgfTtcblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBBbmltYXRpb25Mb29wO1xuXG5mdW5jdGlvbiBBbmltYXRpb25Mb29wKCkge1xuICAgIHRoaXMubiA9IDA7XG4gICAgdGhpcy50aW1lcyA9IFtdO1xufVxuXG4vLyBBcmUgYWxsIGFuaW1hdGlvbnMgZG9uZT9cbkFuaW1hdGlvbkxvb3AucHJvdG90eXBlLnN0b3BwZWQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRpbWVzID0gdGhpcy50aW1lcy5maWx0ZXIoZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gdC50aW1lID49IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuICF0aGlzLnRpbWVzLmxlbmd0aDtcbn07XG5cbi8vIEFkZCBhIG5ldyBhbmltYXRpb24gdGhhdCB3aWxsIHJ1biB0IG1pbGxpc2Vjb25kc1xuLy8gUmV0dXJucyBhbiBpZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbmNlbCBpdCBsYXllclxuQW5pbWF0aW9uTG9vcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGltZXMucHVzaCh7IGlkOiB0aGlzLm4sIHRpbWU6IHQgKyAobmV3IERhdGUoKSkuZ2V0VGltZSgpIH0pO1xuICAgIHJldHVybiB0aGlzLm4rKztcbn07XG5cbi8vIENhbmNlbCBhbiBhbmltYXRpb25cbkFuaW1hdGlvbkxvb3AucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uKG4pIHtcbiAgICB0aGlzLnRpbWVzID0gdGhpcy50aW1lcy5maWx0ZXIoZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gdC5pZCAhPT0gbjtcbiAgICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG52YXIgYWpheCA9IHJlcXVpcmUoJy4uL3V0aWwvYWpheCcpO1xudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbWFnZVNwcml0ZTtcblxuZnVuY3Rpb24gSW1hZ2VTcHJpdGUoYmFzZSkge1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5yZXRpbmEgPSBicm93c2VyLmRldmljZVBpeGVsUmF0aW8gPiAxO1xuXG4gICAgYmFzZSA9IHRoaXMuYmFzZSArICh0aGlzLnJldGluYSA/ICdAMngnIDogJycpO1xuXG4gICAgYWpheC5nZXRKU09OKGJhc2UgKyAnLmpzb24nLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtlcnJvcjogZXJyfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICBpZiAodGhpcy5pbWcpIHRoaXMuZmlyZSgnbG9hZCcpO1xuICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICBhamF4LmdldEltYWdlKGJhc2UgKyAnLnBuZycsIGZ1bmN0aW9uKGVyciwgaW1nKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IGVycn0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJlbXVsdGlwbHkgdGhlIHNwcml0ZVxuICAgICAgICB2YXIgZGF0YSA9IGltZy5nZXREYXRhKCk7XG4gICAgICAgIHZhciBuZXdkYXRhID0gaW1nLmRhdGEgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgICAgdmFyIGFscGhhID0gZGF0YVtpICsgM10gLyAyNTU7XG4gICAgICAgICAgICBuZXdkYXRhW2kgKyAwXSA9IGRhdGFbaSArIDBdICogYWxwaGE7XG4gICAgICAgICAgICBuZXdkYXRhW2kgKyAxXSA9IGRhdGFbaSArIDFdICogYWxwaGE7XG4gICAgICAgICAgICBuZXdkYXRhW2kgKyAyXSA9IGRhdGFbaSArIDJdICogYWxwaGE7XG4gICAgICAgICAgICBuZXdkYXRhW2kgKyAzXSA9IGRhdGFbaSArIDNdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbWcgPSBpbWc7XG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHRoaXMuZmlyZSgnbG9hZCcpO1xuICAgIH0uYmluZCh0aGlzKSk7XG59XG5cbkltYWdlU3ByaXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXZlbnRlZCk7XG5cbkltYWdlU3ByaXRlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlO1xufTtcblxuSW1hZ2VTcHJpdGUucHJvdG90eXBlLmxvYWRlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhISh0aGlzLmRhdGEgJiYgdGhpcy5pbWcpO1xufTtcblxuSW1hZ2VTcHJpdGUucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uKC8qZ2wqLykge1xuICAgIGlmIChicm93c2VyLmRldmljZVBpeGVsUmF0aW8gPiAxICE9PSB0aGlzLnJldGluYSkge1xuICAgICAgICB2YXIgbmV3U3ByaXRlID0gbmV3IEltYWdlU3ByaXRlKHRoaXMuYmFzZSk7XG4gICAgICAgIG5ld1Nwcml0ZS5vbignbG9hZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5pbWcgPSBuZXdTcHJpdGUuaW1nO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3U3ByaXRlLmRhdGE7XG4gICAgICAgICAgICB0aGlzLnJldGluYSA9IG5ld1Nwcml0ZS5yZXRpbmE7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gU3ByaXRlUG9zaXRpb24oKSB7fVxuU3ByaXRlUG9zaXRpb24ucHJvdG90eXBlID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwLCBwaXhlbFJhdGlvOiAxLCBzZGY6IGZhbHNlIH07XG5cbkltYWdlU3ByaXRlLnByb3RvdHlwZS5nZXRTcHJpdGVQb3NpdGlvbiA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBpZiAoIXRoaXMubG9hZGVkKCkpIHJldHVybiBuZXcgU3ByaXRlUG9zaXRpb24oKTtcblxuICAgIHZhciBwb3MgPSB0aGlzLmRhdGEgJiYgdGhpcy5kYXRhW25hbWVdO1xuICAgIGlmIChwb3MgJiYgdGhpcy5pbWcpIHJldHVybiBwb3M7XG5cbiAgICByZXR1cm4gbmV3IFNwcml0ZVBvc2l0aW9uKCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVmZXJlbmNlID0gcmVxdWlyZSgnLi9yZWZlcmVuY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7fTtcblxucmVmZXJlbmNlLmxheW91dC5mb3JFYWNoKGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgIHZhciBQcm9wZXJ0aWVzID0gZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBwcm9wcykge1xuICAgICAgICAgICAgdGhpc1twXSA9IHByb3BzW3BdO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBwcm9wZXJ0aWVzID0gcmVmZXJlbmNlW2NsYXNzTmFtZV07XG4gICAgZm9yICh2YXIgcHJvcCBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzW3Byb3BdLmRlZmF1bHQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgIFByb3BlcnRpZXMucHJvdG90eXBlW3Byb3BdID0gcHJvcGVydGllc1twcm9wXS5kZWZhdWx0O1xuICAgIH1cbiAgICBtb2R1bGUuZXhwb3J0c1tjbGFzc05hbWUucmVwbGFjZSgnbGF5b3V0XycsICcnKV0gPSBQcm9wZXJ0aWVzO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZWZlcmVuY2UgPSByZXF1aXJlKCcuL3JlZmVyZW5jZScpO1xudmFyIHBhcnNlQ1NTQ29sb3IgPSByZXF1aXJlKCdjc3Njb2xvcnBhcnNlcicpLnBhcnNlQ1NTQ29sb3I7XG5cbm1vZHVsZS5leHBvcnRzID0ge307XG5cbnJlZmVyZW5jZS5wYWludC5mb3JFYWNoKGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgIHZhciBDYWxjdWxhdGVkID0gZnVuY3Rpb24oKSB7fTtcblxuICAgIHZhciBwcm9wZXJ0aWVzID0gcmVmZXJlbmNlW2NsYXNzTmFtZV07XG4gICAgZm9yICh2YXIgcCBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1twXSxcbiAgICAgICAgICAgIHZhbHVlID0gcHJvcC5kZWZhdWx0O1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gJ2NvbG9yJykgdmFsdWUgPSBwYXJzZUNTU0NvbG9yKHZhbHVlKTtcblxuICAgICAgICBDYWxjdWxhdGVkLnByb3RvdHlwZVtwXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIENhbGN1bGF0ZWQucHJvdG90eXBlLmhpZGRlbiA9IGZhbHNlO1xuICAgIG1vZHVsZS5leHBvcnRzW2NsYXNzTmFtZS5yZXBsYWNlKCdwYWludF8nLCAnJyldID0gQ2FsY3VsYXRlZDtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG52YXIgU291cmNlID0gcmVxdWlyZSgnLi4vc291cmNlL3NvdXJjZScpO1xudmFyIFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuL3N0eWxlX2xheWVyJyk7XG52YXIgSW1hZ2VTcHJpdGUgPSByZXF1aXJlKCcuL2ltYWdlX3Nwcml0ZScpO1xudmFyIEdseXBoU291cmNlID0gcmVxdWlyZSgnLi4vc3ltYm9sL2dseXBoX3NvdXJjZScpO1xudmFyIEdseXBoQXRsYXMgPSByZXF1aXJlKCcuLi9zeW1ib2wvZ2x5cGhfYXRsYXMnKTtcbnZhciBTcHJpdGVBdGxhcyA9IHJlcXVpcmUoJy4uL3N5bWJvbC9zcHJpdGVfYXRsYXMnKTtcbnZhciBMaW5lQXRsYXMgPSByZXF1aXJlKCcuLi9yZW5kZXIvbGluZV9hdGxhcycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG52YXIgbm9ybWFsaXplVVJMID0gcmVxdWlyZSgnLi4vdXRpbC9tYXBib3gnKS5ub3JtYWxpemVTdHlsZVVSTDtcbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4uL3V0aWwvZGlzcGF0Y2hlcicpO1xudmFyIEFuaW1hdGlvbkxvb3AgPSByZXF1aXJlKCcuL2FuaW1hdGlvbl9sb29wJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGUvbGF0ZXN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3R5bGU7XG5cbmZ1bmN0aW9uIFN0eWxlKHN0eWxlc2hlZXQsIGFuaW1hdGlvbkxvb3ApIHtcbiAgICB0aGlzLmFuaW1hdGlvbkxvb3AgPSBhbmltYXRpb25Mb29wIHx8IG5ldyBBbmltYXRpb25Mb29wKCk7XG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IERpc3BhdGNoZXIoTWF0aC5tYXgoYnJvd3Nlci5oYXJkd2FyZUNvbmN1cnJlbmN5IC0gMSwgMSksIHRoaXMpO1xuICAgIHRoaXMuZ2x5cGhBdGxhcyA9IG5ldyBHbHlwaEF0bGFzKDEwMjQsIDEwMjQpO1xuICAgIHRoaXMuc3ByaXRlQXRsYXMgPSBuZXcgU3ByaXRlQXRsYXMoNTEyLCA1MTIpO1xuICAgIHRoaXMuc3ByaXRlQXRsYXMucmVzaXplKGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgdGhpcy5saW5lQXRsYXMgPSBuZXcgTGluZUF0bGFzKDI1NiwgNTEyKTtcblxuICAgIHRoaXMuX2xheWVycyA9IHt9O1xuICAgIHRoaXMuX29yZGVyICA9IFtdO1xuICAgIHRoaXMuX2dyb3VwcyA9IFtdO1xuICAgIHRoaXMuc291cmNlcyA9IHt9O1xuXG4gICAgdGhpcy56b29tSGlzdG9yeSA9IHt9O1xuXG4gICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgJ19mb3J3YXJkU291cmNlRXZlbnQnLFxuICAgICAgICAnX2ZvcndhcmRUaWxlRXZlbnQnLFxuICAgICAgICAnX3JlZG9QbGFjZW1lbnQnXG4gICAgXSwgdGhpcyk7XG5cbiAgICB2YXIgbG9hZGVkID0gZnVuY3Rpb24oZXJyLCBzdHlsZXNoZWV0KSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IGVycn0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHZhbGlkID0gdmFsaWRhdGUoc3R5bGVzaGVldCk7XG4gICAgICAgIGlmICh2YWxpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhbGlkLmZvckVhY2goZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0eWxlc2hlZXQgPSBzdHlsZXNoZWV0O1xuXG4gICAgICAgIHZhciBzb3VyY2VzID0gc3R5bGVzaGVldC5zb3VyY2VzO1xuICAgICAgICBmb3IgKHZhciBpZCBpbiBzb3VyY2VzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFNvdXJjZShpZCwgc291cmNlc1tpZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0eWxlc2hlZXQuc3ByaXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNwcml0ZSA9IG5ldyBJbWFnZVNwcml0ZShzdHlsZXNoZWV0LnNwcml0ZSk7XG4gICAgICAgICAgICB0aGlzLnNwcml0ZS5vbignbG9hZCcsIHRoaXMuZmlyZS5iaW5kKHRoaXMsICdjaGFuZ2UnKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdseXBoU291cmNlID0gbmV3IEdseXBoU291cmNlKHN0eWxlc2hlZXQuZ2x5cGhzLCB0aGlzLmdseXBoQXRsYXMpO1xuICAgICAgICB0aGlzLl9yZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuZmlyZSgnbG9hZCcpO1xuICAgIH0uYmluZCh0aGlzKTtcblxuICAgIGlmICh0eXBlb2Ygc3R5bGVzaGVldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgYWpheC5nZXRKU09OKG5vcm1hbGl6ZVVSTChzdHlsZXNoZWV0KSwgbG9hZGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBicm93c2VyLmZyYW1lKGxvYWRlZC5iaW5kKHRoaXMsIG51bGwsIHN0eWxlc2hlZXQpKTtcbiAgICB9XG59XG5cblN0eWxlLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChFdmVudGVkLCB7XG4gICAgX2xvYWRlZDogZmFsc2UsXG5cbiAgICBsb2FkZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICBpZiAoIXRoaXMuc291cmNlc1tpZF0ubG9hZGVkKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLnNwcml0ZSAmJiAhdGhpcy5zcHJpdGUubG9hZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIF9yZXNvbHZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGlkLCBsYXllcjtcblxuICAgICAgICB0aGlzLl9sYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fb3JkZXIgID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0eWxlc2hlZXQubGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsYXllciA9IG5ldyBTdHlsZUxheWVyKHRoaXMuc3R5bGVzaGVldC5sYXllcnNbaV0sIHRoaXMuc3R5bGVzaGVldC5jb25zdGFudHMgfHwge30pO1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2xheWVyLmlkXSA9IGxheWVyO1xuICAgICAgICAgICAgdGhpcy5fb3JkZXIucHVzaChsYXllci5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNvbHZlIGxheW91dCBwcm9wZXJ0aWVzLlxuICAgICAgICBmb3IgKGlkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXS5yZXNvbHZlTGF5b3V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNvbHZlIHJlZmVyZW5jZSBhbmQgcGFpbnQgcHJvcGVydGllcy5cbiAgICAgICAgZm9yIChpZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX2xheWVyc1tpZF0ucmVzb2x2ZVJlZmVyZW5jZSh0aGlzLl9sYXllcnMpO1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXS5yZXNvbHZlUGFpbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dyb3VwTGF5ZXJzKCk7XG4gICAgICAgIHRoaXMuX2Jyb2FkY2FzdExheWVycygpO1xuICAgIH0sXG5cbiAgICBfZ3JvdXBMYXllcnM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZ3JvdXA7XG5cbiAgICAgICAgdGhpcy5fZ3JvdXBzID0gW107XG5cbiAgICAgICAgLy8gU3BsaXQgaW50byBncm91cHMgb2YgY29uc2VjdXRpdmUgdG9wLWxldmVsIGxheWVycyB3aXRoIHRoZSBzYW1lIHNvdXJjZS5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9vcmRlci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW3RoaXMuX29yZGVyW2ldXTtcblxuICAgICAgICAgICAgaWYgKCFncm91cCB8fCBsYXllci5zb3VyY2UgIT09IGdyb3VwLnNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGdyb3VwID0gW107XG4gICAgICAgICAgICAgICAgZ3JvdXAuc291cmNlID0gbGF5ZXIuc291cmNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ3JvdXAucHVzaChsYXllcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2Jyb2FkY2FzdExheWVyczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvcmRlcmVkID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICBvcmRlcmVkLnB1c2godGhpcy5fbGF5ZXJzW2lkXS5qc29uKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnc2V0IGxheWVycycsIG9yZGVyZWQpO1xuICAgIH0sXG5cbiAgICBfY2FzY2FkZTogZnVuY3Rpb24oY2xhc3Nlcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZCkgcmV0dXJuO1xuXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHtcbiAgICAgICAgICAgIHRyYW5zaXRpb246IHRydWVcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX2xheWVyc1tpZF0uY2FzY2FkZShjbGFzc2VzLCBvcHRpb25zLFxuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVzaGVldC50cmFuc2l0aW9uIHx8IHt9LFxuICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uTG9vcCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUoJ2NoYW5nZScpO1xuICAgIH0sXG5cbiAgICBfcmVjYWxjdWxhdGU6IGZ1bmN0aW9uKHopIHtcbiAgICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5zb3VyY2VzKVxuICAgICAgICAgICAgdGhpcy5zb3VyY2VzW2lkXS51c2VkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlWm9vbUhpc3Rvcnkoeik7XG5cbiAgICAgICAgdGhpcy5yYXN0ZXJGYWRlRHVyYXRpb24gPSAzMDA7XG4gICAgICAgIGZvciAoaWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuXG4gICAgICAgICAgICBpZiAobGF5ZXIucmVjYWxjdWxhdGUoeiwgdGhpcy56b29tSGlzdG9yeSkgJiYgbGF5ZXIuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW2xheWVyLnNvdXJjZV0udXNlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWF4Wm9vbVRyYW5zaXRpb25EdXJhdGlvbiA9IDMwMDtcbiAgICAgICAgaWYgKE1hdGguZmxvb3IodGhpcy56KSAhPT0gTWF0aC5mbG9vcih6KSkge1xuICAgICAgICAgICAgdGhpcy5hbmltYXRpb25Mb29wLnNldChtYXhab29tVHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMueiA9IHo7XG4gICAgICAgIHRoaXMuZmlyZSgnem9vbScpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlWm9vbUhpc3Rvcnk6IGZ1bmN0aW9uKHopIHtcblxuICAgICAgICB2YXIgemggPSB0aGlzLnpvb21IaXN0b3J5O1xuXG4gICAgICAgIGlmICh6aC5sYXN0SW50ZWdlclpvb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gZmlyc3QgdGltZVxuICAgICAgICAgICAgemgubGFzdEludGVnZXJab29tID0gTWF0aC5mbG9vcih6KTtcbiAgICAgICAgICAgIHpoLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSAwO1xuICAgICAgICAgICAgemgubGFzdFpvb20gPSB6O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciBhbiBpbnRlZ2VyIHpvb20gbGV2ZWwgYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IGZyYW1lXG4gICAgICAgIC8vIGFuZCBpZiB5ZXMsIHJlY29yZCBpdCB3aXRoIHRoZSB0aW1lLiBVc2VkIGZvciB0cmFuc2l0aW9uaW5nIHBhdHRlcm5zLlxuICAgICAgICBpZiAoTWF0aC5mbG9vcih6aC5sYXN0Wm9vbSkgPCBNYXRoLmZsb29yKHopKSB7XG4gICAgICAgICAgICB6aC5sYXN0SW50ZWdlclpvb20gPSBNYXRoLmZsb29yKHopO1xuICAgICAgICAgICAgemgubGFzdEludGVnZXJab29tVGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChNYXRoLmZsb29yKHpoLmxhc3Rab29tKSA+IE1hdGguZmxvb3IoeikpIHtcbiAgICAgICAgICAgIHpoLmxhc3RJbnRlZ2VyWm9vbSA9IE1hdGguZmxvb3IoeiArIDEpO1xuICAgICAgICAgICAgemgubGFzdEludGVnZXJab29tVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIH1cblxuICAgICAgICB6aC5sYXN0Wm9vbSA9IHo7XG4gICAgfSxcblxuICAgIGFkZFNvdXJjZTogZnVuY3Rpb24oaWQsIHNvdXJjZSkge1xuICAgICAgICBpZiAodGhpcy5zb3VyY2VzW2lkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIGFscmVhZHkgYSBzb3VyY2Ugd2l0aCB0aGlzIElEJyk7XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlID0gU291cmNlLmNyZWF0ZShzb3VyY2UpO1xuICAgICAgICB0aGlzLnNvdXJjZXNbaWRdID0gc291cmNlO1xuICAgICAgICBzb3VyY2UuaWQgPSBpZDtcbiAgICAgICAgc291cmNlLnN0eWxlID0gdGhpcztcbiAgICAgICAgc291cmNlLmRpc3BhdGNoZXIgPSB0aGlzLmRpc3BhdGNoZXI7XG4gICAgICAgIHNvdXJjZS5nbHlwaEF0bGFzID0gdGhpcy5nbHlwaEF0bGFzO1xuICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIC5vbignbG9hZCcsIHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vbignZXJyb3InLCB0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQpXG4gICAgICAgICAgICAub24oJ2NoYW5nZScsIHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5hZGQnLCB0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KVxuICAgICAgICAgICAgLm9uKCd0aWxlLmxvYWQnLCB0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KVxuICAgICAgICAgICAgLm9uKCd0aWxlLmVycm9yJywgdGhpcy5fZm9yd2FyZFRpbGVFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5yZW1vdmUnLCB0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KTtcbiAgICAgICAgdGhpcy5maXJlKCdzb3VyY2UuYWRkJywge3NvdXJjZTogc291cmNlfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBzb3VyY2UgZnJvbSB0aGlzIHN0eWxlc2hlZXQsIGdpdmVuIGl0cyBpZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgaWQgb2YgdGhlIHNvdXJjZSB0byByZW1vdmVcbiAgICAgKiBAcmV0dXJucyB7U3R5bGV9IHRoaXMgc3R5bGVcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgbm8gc291cmNlIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuIElEXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2U6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLnNvdXJjZXNbaWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgbm8gc291cmNlIHdpdGggdGhpcyBJRCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VzW2lkXTtcbiAgICAgICAgc291cmNlXG4gICAgICAgICAgICAub2ZmKCdsb2FkJywgdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KVxuICAgICAgICAgICAgLm9mZignZXJyb3InLCB0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQpXG4gICAgICAgICAgICAub2ZmKCdjaGFuZ2UnLCB0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQpXG4gICAgICAgICAgICAub2ZmKCd0aWxlLmFkZCcsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAub2ZmKCd0aWxlLmxvYWQnLCB0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KVxuICAgICAgICAgICAgLm9mZigndGlsZS5lcnJvcicsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAub2ZmKCd0aWxlLnJlbW92ZScsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpO1xuICAgICAgICB0aGlzLmZpcmUoJ3NvdXJjZS5yZW1vdmUnLCB7c291cmNlOiBzb3VyY2V9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNvdXJjZSBieSBpZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgaWQgb2YgdGhlIGRlc2lyZWQgc291cmNlXG4gICAgICogQHJldHVybnMge09iamVjdH0gc291cmNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRTb3VyY2U6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNbaWRdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYXllciB0byB0aGUgbWFwIHN0eWxlLiBUaGUgbGF5ZXIgd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIGxheWVyIHdpdGhcbiAgICAgKiBJRCBgYmVmb3JlYCwgb3IgYXBwZW5kZWQgaWYgYGJlZm9yZWAgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1N0eWxlTGF5ZXJ8T2JqZWN0fSBsYXllclxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYmVmb3JlICBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgYmVmb3JlXG4gICAgICogQGZpcmVzIGxheWVyLmFkZFxuICAgICAqIEByZXR1cm5zIHtTdHlsZX0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkTGF5ZXI6IGZ1bmN0aW9uKGxheWVyLCBiZWZvcmUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xheWVyc1tsYXllci5pZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgbGF5ZXIgd2l0aCB0aGlzIElEJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEobGF5ZXIgaW5zdGFuY2VvZiBTdHlsZUxheWVyKSkge1xuICAgICAgICAgICAgbGF5ZXIgPSBuZXcgU3R5bGVMYXllcihsYXllciwgdGhpcy5zdHlsZXNoZWV0LmNvbnN0YW50cyB8fCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGF5ZXJzW2xheWVyLmlkXSA9IGxheWVyO1xuICAgICAgICB0aGlzLl9vcmRlci5zcGxpY2UoYmVmb3JlID8gdGhpcy5fb3JkZXIuaW5kZXhPZihiZWZvcmUpIDogSW5maW5pdHksIDAsIGxheWVyLmlkKTtcbiAgICAgICAgbGF5ZXIucmVzb2x2ZUxheW91dCgpO1xuICAgICAgICBsYXllci5yZXNvbHZlUmVmZXJlbmNlKHRoaXMuX2xheWVycyk7XG4gICAgICAgIGxheWVyLnJlc29sdmVQYWludCgpO1xuICAgICAgICB0aGlzLl9ncm91cExheWVycygpO1xuICAgICAgICB0aGlzLl9icm9hZGNhc3RMYXllcnMoKTtcbiAgICAgICAgdGhpcy5maXJlKCdsYXllci5hZGQnLCB7bGF5ZXI6IGxheWVyfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBsYXllciBmcm9tIHRoaXMgc3R5bGVzaGVldCwgZ2l2ZW4gaXRzIGlkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBpZCBvZiB0aGUgbGF5ZXIgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMge1N0eWxlfSB0aGlzIHN0eWxlXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIG5vIGxheWVyIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuIElEXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZW1vdmVMYXllcjogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgICAgaWYgKGxheWVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgbm8gbGF5ZXIgd2l0aCB0aGlzIElEJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXllcnNbaV0ucmVmID09PSBpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGF5ZXIoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZSh0aGlzLl9vcmRlci5pbmRleE9mKGlkKSwgMSk7XG4gICAgICAgIHRoaXMuX2dyb3VwTGF5ZXJzKCk7XG4gICAgICAgIHRoaXMuX2Jyb2FkY2FzdExheWVycygpO1xuICAgICAgICB0aGlzLmZpcmUoJ2xheWVyLnJlbW92ZScsIHtsYXllcjogbGF5ZXJ9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhIGxheWVyIGJ5IGlkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBpZCBvZiB0aGUgZGVzaXJlZCBsYXllclxuICAgICAqIEByZXR1cm5zIHtMYXllcn0gbGF5ZXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldExheWVyOiBmdW5jdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgYSBsYXllciBoYXMgYSBgcmVmYCBwcm9wZXJ0eSB0aGF0IG1ha2VzIGl0IGRlcml2ZSBzb21lIHZhbHVlc1xuICAgICAqIGZyb20gYW5vdGhlciBsYXllciwgcmV0dXJuIHRoYXQgcmVmZXJlbnQgbGF5ZXIuIE90aGVyd2lzZSxcbiAgICAgKiByZXR1cm5zIHRoZSBsYXllciBpdHNlbGYuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIHRoZSBsYXllcidzIGlkXG4gICAgICogQHJldHVybnMge0xheWVyfSB0aGUgcmVmZXJlbnQgbGF5ZXIgb3IgdGhlIGxheWVyIGl0c2VsZlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0UmVmZXJlbnRMYXllcjogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgdmFyIGxheWVyID0gdGhpcy5nZXRMYXllcihpZCk7XG4gICAgICAgIGlmIChsYXllci5yZWYpIHtcbiAgICAgICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllci5yZWYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICB9LFxuXG4gICAgc2V0RmlsdGVyOiBmdW5jdGlvbihsYXllciwgZmlsdGVyKSB7XG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRSZWZlcmVudExheWVyKGxheWVyKTtcbiAgICAgICAgbGF5ZXIuZmlsdGVyID0gZmlsdGVyO1xuICAgICAgICB0aGlzLl9icm9hZGNhc3RMYXllcnMoKTtcbiAgICAgICAgdGhpcy5zb3VyY2VzW2xheWVyLnNvdXJjZV0ucmVsb2FkKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhIGxheWVyJ3MgZmlsdGVyIG9iamVjdFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYXllciB0aGUgbGF5ZXIgdG8gaW5zcGVjdFxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgbGF5ZXIncyBmaWx0ZXIsIGlmIGFueVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RmlsdGVyOiBmdW5jdGlvbihsYXllcikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZWZlcmVudExheWVyKGxheWVyKS5maWx0ZXI7XG4gICAgfSxcblxuICAgIHNldExheW91dFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldFJlZmVyZW50TGF5ZXIobGF5ZXIpO1xuICAgICAgICBsYXllci5zZXRMYXlvdXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2Jyb2FkY2FzdExheWVycygpO1xuICAgICAgICB0aGlzLnNvdXJjZXNbbGF5ZXIuc291cmNlXS5yZWxvYWQoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGF5b3V0IHByb3BlcnR5J3MgdmFsdWUgZnJvbSBhIGdpdmVuIGxheWVyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxheWVyIHRoZSBsYXllciB0byBpbnNwZWN0XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldExheW91dFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZWZlcmVudExheWVyKGxheWVyKS5nZXRMYXlvdXRQcm9wZXJ0eShuYW1lKTtcbiAgICB9LFxuXG4gICAgc2V0UGFpbnRQcm9wZXJ0eTogZnVuY3Rpb24obGF5ZXIsIG5hbWUsIHZhbHVlLCBrbGFzcykge1xuICAgICAgICB0aGlzLmdldExheWVyKGxheWVyKS5zZXRQYWludFByb3BlcnR5KG5hbWUsIHZhbHVlLCBrbGFzcyk7XG4gICAgfSxcblxuICAgIGdldFBhaW50UHJvcGVydHk6IGZ1bmN0aW9uKGxheWVyLCBuYW1lLCBrbGFzcykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMYXllcihsYXllcikuZ2V0UGFpbnRQcm9wZXJ0eShuYW1lLCBrbGFzcyk7XG4gICAgfSxcblxuICAgIGZlYXR1cmVzQXQ6IGZ1bmN0aW9uKGNvb3JkLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuICAgICAgICB2YXIgZXJyb3IgPSBudWxsO1xuXG4gICAgICAgIGlmIChwYXJhbXMubGF5ZXIpIHtcbiAgICAgICAgICAgIHBhcmFtcy5sYXllciA9IHsgaWQ6IHBhcmFtcy5sYXllciB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdXRpbC5hc3luY0VhY2goT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKSwgZnVuY3Rpb24oaWQsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gdGhpcy5zb3VyY2VzW2lkXTtcbiAgICAgICAgICAgIHNvdXJjZS5mZWF0dXJlc0F0KGNvb3JkLCBwYXJhbXMsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgZmVhdHVyZXMgPSBmZWF0dXJlcy5jb25jYXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSBlcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhlcnJvcik7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihmZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sYXllcnNbZmVhdHVyZS5sYXllcl0gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbihmZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUubGF5ZXIgPSB0aGlzLl9sYXllcnNbZmVhdHVyZS5sYXllcl0uanNvbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgX3JlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5yZW1vdmUoKTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZVNvdXJjZXM6IGZ1bmN0aW9uKHRyYW5zZm9ybSkge1xuICAgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlc1tpZF0udXBkYXRlKHRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3JlZG9QbGFjZW1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZXNbaWRdLnJlZG9QbGFjZW1lbnQpIHRoaXMuc291cmNlc1tpZF0ucmVkb1BsYWNlbWVudCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9mb3J3YXJkU291cmNlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy5maXJlKCdzb3VyY2UuJyArIGUudHlwZSwgdXRpbC5leHRlbmQoe3NvdXJjZTogZS50YXJnZXR9LCBlKSk7XG4gICAgfSxcblxuICAgIF9mb3J3YXJkVGlsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRoaXMuZmlyZShlLnR5cGUsIHV0aWwuZXh0ZW5kKHtzb3VyY2U6IGUudGFyZ2V0fSwgZSkpO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsYmFja3MgZnJvbSB3ZWIgd29ya2Vyc1xuXG4gICAgJ2dldCBzcHJpdGUganNvbic6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHNwcml0ZSA9IHRoaXMuc3ByaXRlO1xuICAgICAgICBpZiAoc3ByaXRlLmxvYWRlZCgpKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7IHNwcml0ZTogc3ByaXRlLmRhdGEsIHJldGluYTogc3ByaXRlLnJldGluYSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNwcml0ZS5vbignbG9hZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsgc3ByaXRlOiBzcHJpdGUuZGF0YSwgcmV0aW5hOiBzcHJpdGUucmV0aW5hIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2dldCBpY29ucyc6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHNwcml0ZSA9IHRoaXMuc3ByaXRlO1xuICAgICAgICB2YXIgc3ByaXRlQXRsYXMgPSB0aGlzLnNwcml0ZUF0bGFzO1xuICAgICAgICBpZiAoc3ByaXRlLmxvYWRlZCgpKSB7XG4gICAgICAgICAgICBzcHJpdGVBdGxhcy5zZXRTcHJpdGUoc3ByaXRlKTtcbiAgICAgICAgICAgIHNwcml0ZUF0bGFzLmFkZEljb25zKHBhcmFtcy5pY29ucywgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ByaXRlLm9uKCdsb2FkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc3ByaXRlQXRsYXMuc2V0U3ByaXRlKHNwcml0ZSk7XG4gICAgICAgICAgICAgICAgc3ByaXRlQXRsYXMuYWRkSWNvbnMocGFyYW1zLmljb25zLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnZ2V0IGdseXBocyc6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5nbHlwaFNvdXJjZS5nZXRTaW1wbGVHbHlwaHMocGFyYW1zLmZvbnRzdGFjaywgcGFyYW1zLmNvZGVwb2ludHMsIHBhcmFtcy51aWQsIGNhbGxiYWNrKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxuZXhwb3J0cy5yZXNvbHZlID0gZnVuY3Rpb24odmFsdWUsIGNvbnN0YW50cykge1xuICAgIGZ1bmN0aW9uIHJlc29sdmUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWVbMF0gPT09ICdAJyA/IGNvbnN0YW50c1t2YWx1ZV0gOiB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgaTtcblxuICAgIHZhbHVlID0gcmVzb2x2ZSh2YWx1ZSk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgpO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZhbHVlW2ldIGluIGNvbnN0YW50cykge1xuICAgICAgICAgICAgICAgIHZhbHVlW2ldID0gcmVzb2x2ZSh2YWx1ZVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsdWUuc3RvcHMpIHtcbiAgICAgICAgdmFsdWUgPSB1dGlsLmV4dGVuZCh7fSwgdmFsdWUpO1xuICAgICAgICB2YWx1ZS5zdG9wcyA9IHZhbHVlLnN0b3BzLnNsaWNlKCk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLnN0b3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RvcHNbaV1bMV0gaW4gY29uc3RhbnRzKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuc3RvcHNbaV0gPSBbXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLnN0b3BzW2ldWzBdLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlLnN0b3BzW2ldWzFdKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnRzLnJlc29sdmVBbGwgPSBmdW5jdGlvbiAocHJvcGVydGllcywgY29uc3RhbnRzKSB7XG4gICAgaWYgKCFjb25zdGFudHMpXG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBleHBvcnRzLnJlc29sdmUocHJvcGVydGllc1trZXldLCBjb25zdGFudHMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGFyc2VDU1NDb2xvciA9IHJlcXVpcmUoJ2Nzc2NvbG9ycGFyc2VyJykucGFyc2VDU1NDb2xvcjtcbnZhciBtYXBib3hHTEZ1bmN0aW9uID0gcmVxdWlyZSgnbWFwYm94LWdsLWZ1bmN0aW9uJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0eWxlRGVjbGFyYXRpb247XG5cbmZ1bmN0aW9uIFN0eWxlRGVjbGFyYXRpb24ocmVmZXJlbmNlLCB2YWx1ZSkge1xuICAgIHRoaXMudHlwZSA9IHJlZmVyZW5jZS50eXBlO1xuICAgIHRoaXMudHJhbnNpdGlvbmFibGUgPSByZWZlcmVuY2UudHJhbnNpdGlvbjtcblxuICAgIC8vIGltbXV0YWJsZSByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZS4gdXNlZCBmb3IgY29tcGFyaXNvblxuICAgIHRoaXMuanNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdjb2xvcicpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodmFsdWUuc3RvcHMpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHByZXBhcmVDb2xvckZ1bmN0aW9uKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gcGFyc2VDb2xvcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHJlZmVyZW5jZS5mdW5jdGlvbiA9PT0gJ2ludGVycG9sYXRlZCcpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGUgPSBtYXBib3hHTEZ1bmN0aW9uLmludGVycG9sYXRlZCh0aGlzLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZSA9IG1hcGJveEdMRnVuY3Rpb25bJ3BpZWNld2lzZS1jb25zdGFudCddKHRoaXMudmFsdWUpO1xuICAgICAgICBpZiAocmVmZXJlbmNlLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlID0gdHJhbnNpdGlvbmVkKHRoaXMuY2FsY3VsYXRlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNpdGlvbmVkKGNhbGN1bGF0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbih6LCB6aCwgZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIGZyYWN0aW9uID0geiAlIDE7XG4gICAgICAgIHZhciB0ID0gTWF0aC5taW4oKERhdGUubm93KCkgLSB6aC5sYXN0SW50ZWdlclpvb21UaW1lKSAvIGR1cmF0aW9uLCAxKTtcbiAgICAgICAgdmFyIGZyb21TY2FsZSA9IDE7XG4gICAgICAgIHZhciB0b1NjYWxlID0gMTtcbiAgICAgICAgdmFyIG1peCwgZnJvbSwgdG87XG5cbiAgICAgICAgaWYgKHogPiB6aC5sYXN0SW50ZWdlclpvb20pIHtcbiAgICAgICAgICAgIG1peCA9IGZyYWN0aW9uICsgKDEgLSBmcmFjdGlvbikgKiB0O1xuICAgICAgICAgICAgZnJvbVNjYWxlICo9IDI7XG4gICAgICAgICAgICBmcm9tID0gY2FsY3VsYXRlKHogLSAxKTtcbiAgICAgICAgICAgIHRvID0gY2FsY3VsYXRlKHopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWl4ID0gMSAtICgxIC0gdCkgKiBmcmFjdGlvbjtcbiAgICAgICAgICAgIHRvID0gY2FsY3VsYXRlKHopO1xuICAgICAgICAgICAgZnJvbSA9IGNhbGN1bGF0ZSh6ICsgMSk7XG4gICAgICAgICAgICBmcm9tU2NhbGUgLz0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgZnJvbVNjYWxlOiBmcm9tU2NhbGUsXG4gICAgICAgICAgICB0bzogdG8sXG4gICAgICAgICAgICB0b1NjYWxlOiB0b1NjYWxlLFxuICAgICAgICAgICAgdDogbWl4XG4gICAgICAgIH07XG4gICAgfTtcbn1cblxudmFyIGNvbG9yQ2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gcGFyc2VDb2xvcih2YWx1ZSkge1xuICAgIGlmIChjb2xvckNhY2hlW3ZhbHVlXSkgcmV0dXJuIGNvbG9yQ2FjaGVbdmFsdWVdO1xuICAgIHZhciBjb2xvciA9IHByZXBhcmVDb2xvcihwYXJzZUNTU0NvbG9yKHZhbHVlKSk7XG4gICAgY29sb3JDYWNoZVt2YWx1ZV0gPSBjb2xvcjtcbiAgICByZXR1cm4gY29sb3I7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVDb2xvcihjKSB7XG4gICAgcmV0dXJuIFtjWzBdIC8gMjU1LCBjWzFdIC8gMjU1LCBjWzJdIC8gMjU1LCBjWzNdIC8gMV07XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVDb2xvckZ1bmN0aW9uKGYpIHtcbiAgICByZXR1cm4gdXRpbC5leHRlbmQoe30sIGYsIHtzdG9wczogZi5zdG9wcy5tYXAoZnVuY3Rpb24oc3RvcCkge1xuICAgICAgICByZXR1cm4gW3N0b3BbMF0sIHBhcnNlQ29sb3Ioc3RvcFsxXSldO1xuICAgIH0pfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgcmVmZXJlbmNlID0gcmVxdWlyZSgnLi9yZWZlcmVuY2UnKTtcbnZhciBTdHlsZUNvbnN0YW50ID0gcmVxdWlyZSgnLi9zdHlsZV9jb25zdGFudCcpO1xudmFyIFN0eWxlRGVjbGFyYXRpb24gPSByZXF1aXJlKCcuL3N0eWxlX2RlY2xhcmF0aW9uJyk7XG5cbnZhciBsb29rdXAgPSB7XG4gICAgcGFpbnQ6IHt9LFxuICAgIGxheW91dDoge31cbn07XG5cbnJlZmVyZW5jZS5sYXllci50eXBlLnZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUpIHtcbiAgICBsb29rdXAucGFpbnRbdHlwZV0gPSBtYWtlQ29uc3RydWN0b3IocmVmZXJlbmNlWydwYWludF8nICsgdHlwZV0pO1xuICAgIGxvb2t1cC5sYXlvdXRbdHlwZV0gPSBtYWtlQ29uc3RydWN0b3IocmVmZXJlbmNlWydsYXlvdXRfJyArIHR5cGVdKTtcbn0pO1xuXG5mdW5jdGlvbiBtYWtlQ29uc3RydWN0b3IocmVmZXJlbmNlKSB7XG4gICAgZnVuY3Rpb24gU3R5bGVEZWNsYXJhdGlvblNldChwcm9wZXJ0aWVzLCBjb25zdGFudHMpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzID0ge307XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25zID0ge307XG5cbiAgICAgICAgdGhpcy5fY29uc3RhbnRzID0gY29uc3RhbnRzO1xuXG4gICAgICAgIGZvciAodmFyIGsgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgdGhpc1trXSA9IFN0eWxlQ29uc3RhbnQucmVzb2x2ZShwcm9wZXJ0aWVzW2tdLCB0aGlzLl9jb25zdGFudHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMocmVmZXJlbmNlKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdmFyIHByb3BlcnR5ID0gcmVmZXJlbmNlW2tdO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHlsZURlY2xhcmF0aW9uU2V0LnByb3RvdHlwZSwgaywge1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2tdID0gbmV3IFN0eWxlRGVjbGFyYXRpb24ocHJvcGVydHksIFN0eWxlQ29uc3RhbnQucmVzb2x2ZSh2LCB0aGlzLl9jb25zdGFudHMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNba10udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3R5bGVEZWNsYXJhdGlvblNldC5wcm90b3R5cGUsIGsgKyAnLXRyYW5zaXRpb24nLCB7XG4gICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25zW2tdID0gdjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uc1trXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgU3R5bGVEZWNsYXJhdGlvblNldC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gICAgfTtcblxuICAgIFN0eWxlRGVjbGFyYXRpb25TZXQucHJvdG90eXBlLnRyYW5zaXRpb24gPSBmdW5jdGlvbihrLCBnbG9iYWwpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLl90cmFuc2l0aW9uc1trXSB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB1dGlsLmNvYWxlc2NlKHQuZHVyYXRpb24sIGdsb2JhbC5kdXJhdGlvbiwgMzAwKSxcbiAgICAgICAgICAgIGRlbGF5OiB1dGlsLmNvYWxlc2NlKHQuZGVsYXksIGdsb2JhbC5kZWxheSwgMClcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgU3R5bGVEZWNsYXJhdGlvblNldC5wcm90b3R5cGUuanNvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICAgICAgZm9yICh2YXIgdiBpbiB0aGlzLl92YWx1ZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdFt2XSA9IHRoaXMuX3ZhbHVlc1t2XS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5fdHJhbnNpdGlvbnMpIHtcbiAgICAgICAgICAgIHJlc3VsdFt0ICsgJy10cmFuc2l0aW9uJ10gPSB0aGlzLl90cmFuc2l0aW9uc1t2XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHJldHVybiBTdHlsZURlY2xhcmF0aW9uU2V0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHJlbmRlclR5cGUsIGxheWVyVHlwZSwgcHJvcGVydGllcywgY29uc3RhbnRzKSB7XG4gICAgcmV0dXJuIG5ldyBsb29rdXBbcmVuZGVyVHlwZV1bbGF5ZXJUeXBlXShwcm9wZXJ0aWVzLCBjb25zdGFudHMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBTdHlsZUNvbnN0YW50ID0gcmVxdWlyZSgnLi9zdHlsZV9jb25zdGFudCcpO1xudmFyIFN0eWxlVHJhbnNpdGlvbiA9IHJlcXVpcmUoJy4vc3R5bGVfdHJhbnNpdGlvbicpO1xudmFyIFN0eWxlRGVjbGFyYXRpb25TZXQgPSByZXF1aXJlKCcuL3N0eWxlX2RlY2xhcmF0aW9uX3NldCcpO1xudmFyIExheW91dFByb3BlcnRpZXMgPSByZXF1aXJlKCcuL2xheW91dF9wcm9wZXJ0aWVzJyk7XG52YXIgUGFpbnRQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi9wYWludF9wcm9wZXJ0aWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3R5bGVMYXllcjtcblxuZnVuY3Rpb24gU3R5bGVMYXllcihsYXllciwgY29uc3RhbnRzKSB7XG4gICAgdGhpcy5fbGF5ZXIgPSBsYXllcjtcbiAgICB0aGlzLl9jb25zdGFudHMgPSBjb25zdGFudHM7XG5cbiAgICB0aGlzLmlkID0gbGF5ZXIuaWQ7XG4gICAgdGhpcy5yZWYgPSBsYXllci5yZWY7XG5cbiAgICAvLyBSZXNvbHZlZCBhbmQgY2FzY2FkZWQgcGFpbnQgcHJvcGVydGllcy5cbiAgICB0aGlzLl9yZXNvbHZlZCA9IHt9OyAvLyBjbGFzcyBuYW1lIC0+IFN0eWxlRGVjbGFyYXRpb25TZXRcbiAgICB0aGlzLl9jYXNjYWRlZCA9IHt9OyAvLyBwcm9wZXJ0eSBuYW1lIC0+IFN0eWxlVHJhbnNpdGlvblxuXG4gICAgdGhpcy5hc3NpZ24obGF5ZXIpO1xufVxuXG5TdHlsZUxheWVyLnByb3RvdHlwZSA9IHtcbiAgICByZXNvbHZlTGF5b3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZikge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXQgPSBuZXcgTGF5b3V0UHJvcGVydGllc1t0aGlzLnR5cGVdKFxuICAgICAgICAgICAgICAgIFN0eWxlQ29uc3RhbnQucmVzb2x2ZUFsbCh0aGlzLl9sYXllci5sYXlvdXQsIHRoaXMuX2NvbnN0YW50cykpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmxheW91dC5oYXNPd25Qcm9wZXJ0eSgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dFsndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9ICdtYXAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubGF5b3V0Lmhhc093blByb3BlcnR5KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0WydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID0gJ21hcCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0WydzeW1ib2wtYXZvaWQtZWRnZXMnXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0TGF5b3V0UHJvcGVydHk6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMubGF5b3V0W25hbWVdID0gU3R5bGVDb25zdGFudC5yZXNvbHZlKHZhbHVlLCB0aGlzLl9jb25zdGFudHMpO1xuICAgIH0sXG5cbiAgICBnZXRMYXlvdXRQcm9wZXJ0eTogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRbbmFtZV07XG4gICAgfSxcblxuICAgIHJlc29sdmVSZWZlcmVuY2U6IGZ1bmN0aW9uKGxheWVycykge1xuICAgICAgICBpZiAodGhpcy5yZWYpIHtcbiAgICAgICAgICAgIHRoaXMuYXNzaWduKGxheWVyc1t0aGlzLnJlZl0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlc29sdmVQYWludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gdGhpcy5fbGF5ZXIpIHtcbiAgICAgICAgICAgIHZhciBtYXRjaCA9IHAubWF0Y2goL15wYWludCg/OlxcLiguKikpPyQvKTtcbiAgICAgICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlZFttYXRjaFsxXSB8fCAnJ10gPVxuICAgICAgICAgICAgICAgIG5ldyBTdHlsZURlY2xhcmF0aW9uU2V0KCdwYWludCcsIHRoaXMudHlwZSwgdGhpcy5fbGF5ZXJbcF0sIHRoaXMuX2NvbnN0YW50cyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0UGFpbnRQcm9wZXJ0eTogZnVuY3Rpb24obmFtZSwgdmFsdWUsIGtsYXNzKSB7XG4gICAgICAgIHZhciBkZWNsYXJhdGlvbnMgPSB0aGlzLl9yZXNvbHZlZFtrbGFzcyB8fCAnJ107XG4gICAgICAgIGlmICghZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbnMgPSB0aGlzLl9yZXNvbHZlZFtrbGFzcyB8fCAnJ10gPVxuICAgICAgICAgICAgICAgIG5ldyBTdHlsZURlY2xhcmF0aW9uU2V0KCdwYWludCcsIHRoaXMudHlwZSwge30sIHRoaXMuX2NvbnN0YW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgZGVjbGFyYXRpb25zW25hbWVdID0gdmFsdWU7XG4gICAgfSxcblxuICAgIGdldFBhaW50UHJvcGVydHk6IGZ1bmN0aW9uKG5hbWUsIGtsYXNzKSB7XG4gICAgICAgIHZhciBkZWNsYXJhdGlvbnMgPSB0aGlzLl9yZXNvbHZlZFtrbGFzcyB8fCAnJ107XG4gICAgICAgIGlmICghZGVjbGFyYXRpb25zKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uc1tuYW1lXTtcbiAgICB9LFxuXG4gICAgY2FzY2FkZTogZnVuY3Rpb24oY2xhc3Nlcywgb3B0aW9ucywgZ2xvYmFsVHJhbnMsIGFuaW1hdGlvbkxvb3ApIHtcbiAgICAgICAgZm9yICh2YXIga2xhc3MgaW4gdGhpcy5fcmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIGlmIChrbGFzcyAhPT0gXCJcIiAmJiAhY2xhc3Nlc1trbGFzc10pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIHZhciBkZWNsYXJhdGlvbnMgPSB0aGlzLl9yZXNvbHZlZFtrbGFzc10sXG4gICAgICAgICAgICAgICAgdmFsdWVzID0gZGVjbGFyYXRpb25zLnZhbHVlcygpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykge1xuICAgICAgICAgICAgICAgIHZhciBuZXdEZWNsYXJhdGlvbiA9IHZhbHVlc1trXTtcbiAgICAgICAgICAgICAgICB2YXIgb2xkVHJhbnNpdGlvbiA9IG9wdGlvbnMudHJhbnNpdGlvbiA/IHRoaXMuX2Nhc2NhZGVkW2tdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgLy8gT25seSBjcmVhdGUgYSBuZXcgdHJhbnNpdGlvbiBpZiB0aGUgZGVjbGFyYXRpb24gY2hhbmdlZFxuICAgICAgICAgICAgICAgIGlmICghb2xkVHJhbnNpdGlvbiB8fCBvbGRUcmFuc2l0aW9uLmRlY2xhcmF0aW9uLmpzb24gIT09IG5ld0RlY2xhcmF0aW9uLmpzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1N0eWxlVHJhbnMgPSBkZWNsYXJhdGlvbnMudHJhbnNpdGlvbihrLCBnbG9iYWxUcmFucyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXdUcmFuc2l0aW9uID0gdGhpcy5fY2FzY2FkZWRba10gPVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0eWxlVHJhbnNpdGlvbihuZXdEZWNsYXJhdGlvbiwgb2xkVHJhbnNpdGlvbiwgbmV3U3R5bGVUcmFucyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHRoZSBhbmltYXRpb24gbG9vcCB1bnRpbCB0aGUgZW5kIG9mIHRoZSB0cmFuc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3VHJhbnNpdGlvbi5pbnN0YW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RyYW5zaXRpb24ubG9vcElEID0gYW5pbWF0aW9uTG9vcC5zZXQobmV3VHJhbnNpdGlvbi5lbmRUaW1lIC0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAob2xkVHJhbnNpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uTG9vcC5jYW5jZWwob2xkVHJhbnNpdGlvbi5sb29wSUQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlY2FsY3VsYXRlOiBmdW5jdGlvbih6LCB6b29tSGlzdG9yeSkge1xuICAgICAgICB2YXIgdHlwZSA9IHRoaXMudHlwZSxcbiAgICAgICAgICAgIGNhbGN1bGF0ZWQgPSB0aGlzLnBhaW50ID0gbmV3IFBhaW50UHJvcGVydGllc1t0eXBlXSgpO1xuXG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5fY2FzY2FkZWQpIHtcbiAgICAgICAgICAgIGNhbGN1bGF0ZWRba10gPSB0aGlzLl9jYXNjYWRlZFtrXS5hdCh6LCB6b29tSGlzdG9yeSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhpZGRlbiA9ICh0aGlzLm1pbnpvb20gJiYgeiA8IHRoaXMubWluem9vbSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAodGhpcy5tYXh6b29tICYmIHogPj0gdGhpcy5tYXh6b29tKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgdmlzaWJpbGl0eSBjaGVjayBmb3Igbm9uLWJ1Y2tldGVkIGJhY2tncm91bmQgbGF5ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgKHRoaXMubGF5b3V0LnZpc2liaWxpdHkgPT09ICdub25lJyk7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICBpZiAoKGNhbGN1bGF0ZWRbJ3RleHQtb3BhY2l0eSddID09PSAwIHx8ICF0aGlzLmxheW91dFsndGV4dC1maWVsZCddKSAmJlxuICAgICAgICAgICAgICAgIChjYWxjdWxhdGVkWydpY29uLW9wYWNpdHknXSA9PT0gMCB8fCAhdGhpcy5sYXlvdXRbJ2ljb24taW1hZ2UnXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZW11bHRpcGx5TGF5ZXIoY2FsY3VsYXRlZCwgJ3RleHQnKTtcbiAgICAgICAgICAgICAgICBwcmVtdWx0aXBseUxheWVyKGNhbGN1bGF0ZWQsICdpY29uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChjYWxjdWxhdGVkW3R5cGUgKyAnLW9wYWNpdHknXSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5oaWRkZW4gPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJlbXVsdGlwbHlMYXllcihjYWxjdWxhdGVkLCB0eXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jYXNjYWRlZFsnbGluZS1kYXNoYXJyYXknXSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmUgaXMgZGFzaGVkLCBzY2FsZSB0aGUgZGFzaCBsZW5ndGhzIGJ5IHRoZSBsaW5lXG4gICAgICAgICAgICAvLyB3aWR0aCBhdCB0aGUgcHJldmlvdXMgcm91bmQgem9vbSBsZXZlbC5cbiAgICAgICAgICAgIHZhciBkYXNoQXJyYXkgPSBjYWxjdWxhdGVkWydsaW5lLWRhc2hhcnJheSddO1xuICAgICAgICAgICAgdmFyIGxpbmVXaWR0aCA9IHRoaXMuX2Nhc2NhZGVkWydsaW5lLXdpZHRoJ10gP1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nhc2NhZGVkWydsaW5lLXdpZHRoJ10uYXQoTWF0aC5mbG9vcih6KSwgSW5maW5pdHkpIDpcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVkWydsaW5lLXdpZHRoJ107XG5cbiAgICAgICAgICAgIGRhc2hBcnJheS5mcm9tU2NhbGUgKj0gbGluZVdpZHRoO1xuICAgICAgICAgICAgZGFzaEFycmF5LnRvU2NhbGUgKj0gbGluZVdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICF0aGlzLmhpZGRlbjtcbiAgICB9LFxuXG4gICAgYXNzaWduOiBmdW5jdGlvbihsYXllcikge1xuICAgICAgICB1dGlsLmV4dGVuZCh0aGlzLCB1dGlsLnBpY2sobGF5ZXIsXG4gICAgICAgICAgICBbJ3R5cGUnLCAnc291cmNlJywgJ3NvdXJjZS1sYXllcicsXG4gICAgICAgICAgICAnbWluem9vbScsICdtYXh6b29tJywgJ2ZpbHRlcicsXG4gICAgICAgICAgICAnbGF5b3V0J10pKTtcbiAgICB9LFxuXG4gICAganNvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB1dGlsLmV4dGVuZCh7fSxcbiAgICAgICAgICAgIHRoaXMuX2xheWVyLFxuICAgICAgICAgICAgdXRpbC5waWNrKHRoaXMsXG4gICAgICAgICAgICAgICAgWyd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLFxuICAgICAgICAgICAgICAgICdtaW56b29tJywgJ21heHpvb20nLCAnZmlsdGVyJyxcbiAgICAgICAgICAgICAgICAnbGF5b3V0JywgJ3BhaW50J10pKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBwcmVtdWx0aXBseUxheWVyKGxheWVyLCB0eXBlKSB7XG4gICAgdmFyIGNvbG9yUHJvcCA9IHR5cGUgKyAnLWNvbG9yJyxcbiAgICAgICAgaGFsb1Byb3AgPSB0eXBlICsgJy1oYWxvLWNvbG9yJyxcbiAgICAgICAgb3V0bGluZVByb3AgPSB0eXBlICsgJy1vdXRsaW5lLWNvbG9yJyxcbiAgICAgICAgY29sb3IgPSBsYXllcltjb2xvclByb3BdLFxuICAgICAgICBoYWxvQ29sb3IgPSBsYXllcltoYWxvUHJvcF0sXG4gICAgICAgIG91dGxpbmVDb2xvciA9IGxheWVyW291dGxpbmVQcm9wXSxcbiAgICAgICAgb3BhY2l0eSA9IGxheWVyW3R5cGUgKyAnLW9wYWNpdHknXTtcblxuICAgIHZhciBjb2xvck9wYWNpdHkgPSBjb2xvciAmJiAob3BhY2l0eSAqIGNvbG9yWzNdKTtcbiAgICB2YXIgaGFsb09wYWNpdHkgPSBoYWxvQ29sb3IgJiYgKG9wYWNpdHkgKiBoYWxvQ29sb3JbM10pO1xuICAgIHZhciBvdXRsaW5lT3BhY2l0eSA9IG91dGxpbmVDb2xvciAmJiAob3BhY2l0eSAqIG91dGxpbmVDb2xvclszXSk7XG5cbiAgICBpZiAoY29sb3JPcGFjaXR5ICE9PSB1bmRlZmluZWQgJiYgY29sb3JPcGFjaXR5IDwgMSkge1xuICAgICAgICBsYXllcltjb2xvclByb3BdID0gdXRpbC5wcmVtdWx0aXBseShbY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgY29sb3JPcGFjaXR5XSk7XG4gICAgfVxuICAgIGlmIChoYWxvT3BhY2l0eSAhPT0gdW5kZWZpbmVkICYmIGhhbG9PcGFjaXR5IDwgMSkge1xuICAgICAgICBsYXllcltoYWxvUHJvcF0gPSB1dGlsLnByZW11bHRpcGx5KFtoYWxvQ29sb3JbMF0sIGhhbG9Db2xvclsxXSwgaGFsb0NvbG9yWzJdLCBoYWxvT3BhY2l0eV0pO1xuICAgIH1cbiAgICBpZiAob3V0bGluZU9wYWNpdHkgIT09IHVuZGVmaW5lZCAmJiBvdXRsaW5lT3BhY2l0eSA8IDEpIHtcbiAgICAgICAgbGF5ZXJbb3V0bGluZVByb3BdID0gdXRpbC5wcmVtdWx0aXBseShbb3V0bGluZUNvbG9yWzBdLCBvdXRsaW5lQ29sb3JbMV0sIG91dGxpbmVDb2xvclsyXSwgb3V0bGluZU9wYWNpdHldKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgaW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuLi91dGlsL2ludGVycG9sYXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3R5bGVUcmFuc2l0aW9uO1xuXG4vKlxuICogUmVwcmVzZW50cyBhIHRyYW5zaXRpb24gYmV0d2VlbiB0d28gZGVjbGFyYXRpb25zXG4gKi9cbmZ1bmN0aW9uIFN0eWxlVHJhbnNpdGlvbihkZWNsYXJhdGlvbiwgb2xkVHJhbnNpdGlvbiwgdmFsdWUpIHtcblxuICAgIHRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IHRoaXMuZW5kVGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG5cbiAgICB2YXIgdHlwZSA9IGRlY2xhcmF0aW9uLnR5cGU7XG4gICAgaWYgKCh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnYXJyYXknKSAmJiBkZWNsYXJhdGlvbi50cmFuc2l0aW9uYWJsZSkge1xuICAgICAgICB0aGlzLmludGVycCA9IGludGVycFpvb21UcmFuc2l0aW9uZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnRlcnAgPSBpbnRlcnBvbGF0ZVt0eXBlXTtcbiAgICB9XG5cbiAgICB0aGlzLm9sZFRyYW5zaXRpb24gPSBvbGRUcmFuc2l0aW9uO1xuICAgIHRoaXMuZHVyYXRpb24gPSB2YWx1ZS5kdXJhdGlvbiB8fCAwO1xuICAgIHRoaXMuZGVsYXkgPSB2YWx1ZS5kZWxheSB8fCAwO1xuXG4gICAgaWYgKCF0aGlzLmluc3RhbnQoKSkge1xuICAgICAgICB0aGlzLmVuZFRpbWUgPSB0aGlzLnN0YXJ0VGltZSArIHRoaXMuZHVyYXRpb24gKyB0aGlzLmRlbGF5O1xuICAgICAgICB0aGlzLmVhc2UgPSB1dGlsLmVhc2VDdWJpY0luT3V0O1xuICAgIH1cblxuICAgIGlmIChvbGRUcmFuc2l0aW9uICYmIG9sZFRyYW5zaXRpb24uZW5kVGltZSA8PSB0aGlzLnN0YXJ0VGltZSkge1xuICAgICAgICAvLyBPbGQgdHJhbnNpdGlvbiBpcyBkb25lIHJ1bm5pbmcsIHNvIHdlIGNhblxuICAgICAgICAvLyBkZWxldGUgaXRzIHJlZmVyZW5jZSB0byBpdHMgb2xkIHRyYW5zaXRpb24uXG5cbiAgICAgICAgZGVsZXRlIG9sZFRyYW5zaXRpb24ub2xkVHJhbnNpdGlvbjtcbiAgICB9XG59XG5cblN0eWxlVHJhbnNpdGlvbi5wcm90b3R5cGUuaW5zdGFudCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhdGhpcy5vbGRUcmFuc2l0aW9uIHx8ICF0aGlzLmludGVycCB8fCAodGhpcy5kdXJhdGlvbiA9PT0gMCAmJiB0aGlzLmRlbGF5ID09PSAwKTtcbn07XG5cbi8qXG4gKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB0cmFuc2l0aW9uaW5nIHByb3BlcnR5IGF0IHpvb20gbGV2ZWwgYHpgIGFuZCBvcHRpb25hbCB0aW1lIGB0YFxuICovXG5TdHlsZVRyYW5zaXRpb24ucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24oeiwgem9vbUhpc3RvcnksIHQpIHtcblxuICAgIHZhciB2YWx1ZSA9IHRoaXMuZGVjbGFyYXRpb24uY2FsY3VsYXRlKHosIHpvb21IaXN0b3J5LCB0aGlzLmR1cmF0aW9uKTtcblxuICAgIGlmICh0aGlzLmluc3RhbnQoKSkgcmV0dXJuIHZhbHVlO1xuXG4gICAgdCA9IHQgfHwgRGF0ZS5ub3coKTtcblxuICAgIGlmICh0IDwgdGhpcy5lbmRUaW1lKSB7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMub2xkVHJhbnNpdGlvbi5hdCh6LCB6b29tSGlzdG9yeSwgdGhpcy5zdGFydFRpbWUpO1xuICAgICAgICB2YXIgZWFzZWQgPSB0aGlzLmVhc2UoKHQgLSB0aGlzLnN0YXJ0VGltZSAtIHRoaXMuZGVsYXkpIC8gdGhpcy5kdXJhdGlvbik7XG4gICAgICAgIHZhbHVlID0gdGhpcy5pbnRlcnAob2xkVmFsdWUsIHZhbHVlLCBlYXNlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuXG59O1xuXG5mdW5jdGlvbiBpbnRlcnBab29tVHJhbnNpdGlvbmVkKGZyb20sIHRvLCB0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbTogZnJvbS50byxcbiAgICAgICAgZnJvbVNjYWxlOiBmcm9tLnRvU2NhbGUsXG4gICAgICAgIHRvOiB0by50byxcbiAgICAgICAgdG9TY2FsZTogdG8udG9TY2FsZSxcbiAgICAgICAgdDogdFxuICAgIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQW5jaG9yO1xuXG5mdW5jdGlvbiBBbmNob3IoeCwgeSwgYW5nbGUsIHNlZ21lbnQpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuXG4gICAgaWYgKHNlZ21lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnNlZ21lbnQgPSBzZWdtZW50O1xuICAgIH1cbn1cblxuQW5jaG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUG9pbnQucHJvdG90eXBlKTtcblxuQW5jaG9yLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgQW5jaG9yKHRoaXMueCwgdGhpcy55LCB0aGlzLmFuZ2xlLCB0aGlzLnNlZ21lbnQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBCaW5QYWNrO1xuZnVuY3Rpb24gQmluUGFjayh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuZnJlZSA9IFt7IHg6IDAsIHk6IDAsIHc6IHdpZHRoLCBoOiBoZWlnaHQgfV07XG59XG5cbi8qKlxuICogU2ltcGxlIGFsZ29yaXRobSB0byByZWN1cnNpdmVseSBtZXJnZSB0aGUgbmV3bHkgcmVsZWFzZWQgY2VsbCB3aXRoIGl0c1xuICogbmVpZ2hib3IuIFRoaXMgZG9lc24ndCBtZXJnZSBtb3JlIHRoYW4gdHdvIGNlbGxzIGF0IGEgdGltZSwgYW5kIGZhaWxzXG4gKiBmb3IgY29tcGxpY2F0ZWQgbWVyZ2VzLlxuICogQHByaXZhdGVcbiAqL1xuQmluUGFjay5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uKHJlY3QpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZnJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZnJlZSA9IHRoaXMuZnJlZVtpXTtcblxuICAgICAgICBpZiAoZnJlZS55ID09PSByZWN0LnkgJiYgZnJlZS5oID09PSByZWN0LmggJiYgZnJlZS54ICsgZnJlZS53ID09PSByZWN0LngpIHtcbiAgICAgICAgICAgIGZyZWUudyArPSByZWN0Lnc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChmcmVlLnggPT09IHJlY3QueCAmJiBmcmVlLncgPT09IHJlY3QudyAmJiBmcmVlLnkgKyBmcmVlLmggPT09IHJlY3QueSkge1xuICAgICAgICAgICAgZnJlZS5oICs9IHJlY3QuaDtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY3QueSA9PT0gZnJlZS55ICYmIHJlY3QuaCA9PT0gZnJlZS5oICYmIHJlY3QueCArIHJlY3QudyA9PT0gZnJlZS54KSB7XG4gICAgICAgICAgICBmcmVlLnggPSByZWN0Lng7XG4gICAgICAgICAgICBmcmVlLncgKz0gcmVjdC53O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjdC54ID09PSBmcmVlLnggJiYgcmVjdC53ID09PSBmcmVlLncgJiYgcmVjdC55ICsgcmVjdC5oID09PSBmcmVlLnkpIHtcbiAgICAgICAgICAgIGZyZWUueSA9IHJlY3QueTtcbiAgICAgICAgICAgIGZyZWUuaCArPSByZWN0Lmg7XG5cbiAgICAgICAgfSBlbHNlIGNvbnRpbnVlO1xuXG4gICAgICAgIHRoaXMuZnJlZS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHRoaXMucmVsZWFzZShmcmVlKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgfVxuICAgIHRoaXMuZnJlZS5wdXNoKHJlY3QpO1xufTtcblxuQmluUGFjay5wcm90b3R5cGUuYWxsb2NhdGUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgLy8gRmluZCB0aGUgc21hbGxlc3QgZnJlZSByZWN0IGFuZ2xlXG4gICAgdmFyIHJlY3QgPSB7IHg6IEluZmluaXR5LCB5OiBJbmZpbml0eSwgdzogSW5maW5pdHksIGg6IEluZmluaXR5IH07XG4gICAgdmFyIHNtYWxsZXN0ID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMuZnJlZVtpXTtcbiAgICAgICAgaWYgKHdpZHRoIDw9IHJlZi53ICYmIGhlaWdodCA8PSByZWYuaCAmJiByZWYueSA8PSByZWN0LnkgJiYgcmVmLnggPD0gcmVjdC54KSB7XG4gICAgICAgICAgICByZWN0ID0gcmVmO1xuICAgICAgICAgICAgc21hbGxlc3QgPSBpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNtYWxsZXN0IDwgMCkge1xuICAgICAgICAvLyBUaGVyZSdzIG5vIHNwYWNlIGxlZnQgZm9yIHRoaXMgY2hhci5cbiAgICAgICAgcmV0dXJuIHsgeDogLTEsIHk6IC0xIH07XG4gICAgfVxuXG4gICAgdGhpcy5mcmVlLnNwbGljZShzbWFsbGVzdCwgMSk7XG5cbiAgICAvLyBTaG9ydGVyL0xvbmdlciBBeGlzIFNwbGl0IFJ1bGUgKFNBUylcbiAgICAvLyBodHRwOi8vY2xiLmRlbW9uLmZpL2ZpbGVzL1JlY3RhbmdsZUJpblBhY2sucGRmIHAuIDE1XG4gICAgLy8gSWdub3JlIHRoZSBkaW1lbnNpb24gb2YgUiBhbmQganVzdCBzcGxpdCBsb25nIHRoZSBzaG9ydGVyIGRpbWVuc2lvblxuICAgIC8vIFNlZSBBbHNvOiBodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmNoYXplbGxlL3B1YnMvYmxiaW5wYWNraW5nLnBkZlxuICAgIGlmIChyZWN0LncgPCByZWN0LmgpIHtcbiAgICAgICAgLy8gc3BsaXQgaG9yaXpvbnRhbGx5XG4gICAgICAgIC8vICstLSstLS0rXG4gICAgICAgIC8vIHxfX3xfX198ICA8LS0gYjFcbiAgICAgICAgLy8gKy0tLS0tLSsgIDwtLSBiMlxuICAgICAgICBpZiAocmVjdC53ID4gd2lkdGgpIHRoaXMuZnJlZS5wdXNoKHsgeDogcmVjdC54ICsgd2lkdGgsIHk6IHJlY3QueSwgdzogcmVjdC53IC0gd2lkdGgsIGg6IGhlaWdodCB9KTtcbiAgICAgICAgaWYgKHJlY3QuaCA+IGhlaWdodCkgdGhpcy5mcmVlLnB1c2goeyB4OiByZWN0LngsIHk6IHJlY3QueSArIGhlaWdodCwgdzogcmVjdC53LCBoOiByZWN0LmggLSBoZWlnaHQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3BsaXQgdmVydGljYWxseVxuICAgICAgICAvLyArLS0rLS0tK1xuICAgICAgICAvLyB8X198ICAgfCA8LS0gYjFcbiAgICAgICAgLy8gKy0tfC0tLSsgPC0tIGIyXG4gICAgICAgIGlmIChyZWN0LncgPiB3aWR0aCkgdGhpcy5mcmVlLnB1c2goeyB4OiByZWN0LnggKyB3aWR0aCwgeTogcmVjdC55LCB3OiByZWN0LncgLSB3aWR0aCwgaDogcmVjdC5oIH0pO1xuICAgICAgICBpZiAocmVjdC5oID4gaGVpZ2h0KSB0aGlzLmZyZWUucHVzaCh7IHg6IHJlY3QueCwgeTogcmVjdC55ICsgaGVpZ2h0LCB3OiB3aWR0aCwgaDogcmVjdC5oIC0gaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHg6IHJlY3QueCwgeTogcmVjdC55LCB3OiB3aWR0aCwgaDogaGVpZ2h0IH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrTWF4QW5nbGU7XG5cbmZ1bmN0aW9uIGNoZWNrTWF4QW5nbGUobGluZSwgYW5jaG9yLCBsYWJlbExlbmd0aCwgd2luZG93U2l6ZSwgbWF4QW5nbGUpIHtcblxuICAgIC8vIGhvcml6b250YWwgbGFiZWxzIGFsd2F5cyBwYXNzXG4gICAgaWYgKGFuY2hvci5zZWdtZW50ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuXG4gICAgdmFyIHAgPSBhbmNob3I7XG4gICAgdmFyIGluZGV4ID0gYW5jaG9yLnNlZ21lbnQgKyAxO1xuICAgIHZhciBhbmNob3JEaXN0YW5jZSA9IDA7XG5cbiAgICAvLyBtb3ZlIGJhY2t3YXJkcyBhbG9uZyB0aGUgbGluZSB0byB0aGUgZmlyc3Qgc2VnbWVudCB0aGUgbGFiZWwgYXBwZWFycyBvblxuICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSA+IC1sYWJlbExlbmd0aCAvIDIpIHtcbiAgICAgICAgaW5kZXgtLTtcblxuICAgICAgICAvLyB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBmb3IgdGhlIGxhYmVsIGFmdGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmVcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGFuY2hvckRpc3RhbmNlIC09IGxpbmVbaW5kZXhdLmRpc3QocCk7XG4gICAgICAgIHAgPSBsaW5lW2luZGV4XTtcbiAgICB9XG5cbiAgICBhbmNob3JEaXN0YW5jZSArPSBsaW5lW2luZGV4XS5kaXN0KGxpbmVbaW5kZXggKyAxXSk7XG4gICAgaW5kZXgrKztcblxuICAgIC8vIHN0b3JlIHJlY2VudCBjb3JuZXJzIGFuZCB0aGVpciB0b3RhbCBhbmdsZSBkaWZmZXJlbmNlXG4gICAgdmFyIHJlY2VudENvcm5lcnMgPSBbXTtcbiAgICB2YXIgcmVjZW50QW5nbGVEZWx0YSA9IDA7XG5cbiAgICAvLyBtb3ZlIGZvcndhcmRzIGJ5IHRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGFuZCBjaGVjayBhbmdsZXMgYWxvbmcgdGhlIHdheVxuICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSA8IGxhYmVsTGVuZ3RoIC8gMikge1xuICAgICAgICB2YXIgcHJldiA9IGxpbmVbaW5kZXggLSAxXTtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBsaW5lW2luZGV4XTtcbiAgICAgICAgdmFyIG5leHQgPSBsaW5lW2luZGV4ICsgMV07XG5cbiAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbGluZVxuICAgICAgICBpZiAoIW5leHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB2YXIgYW5nbGVEZWx0YSA9IHByZXYuYW5nbGVUbyhjdXJyZW50KSAtIGN1cnJlbnQuYW5nbGVUbyhuZXh0KTtcbiAgICAgICAgLy8gcmVzdHJpY3QgYW5nbGUgdG8gLXBpLi5waSByYW5nZVxuICAgICAgICBhbmdsZURlbHRhID0gKChhbmdsZURlbHRhICsgMyAqIE1hdGguUEkpICUgKE1hdGguUEkgKiAyKSkgLSBNYXRoLlBJO1xuXG4gICAgICAgIHJlY2VudENvcm5lcnMucHVzaCh7XG4gICAgICAgICAgICBkaXN0YW5jZTogYW5jaG9yRGlzdGFuY2UsXG4gICAgICAgICAgICBhbmdsZURlbHRhOiBhbmdsZURlbHRhXG4gICAgICAgIH0pO1xuICAgICAgICByZWNlbnRBbmdsZURlbHRhICs9IGFuZ2xlRGVsdGE7XG5cbiAgICAgICAgLy8gcmVtb3ZlIGNvcm5lcnMgdGhhdCBhcmUgZmFyIGVub3VnaCBhd2F5IGZyb20gdGhlIGxpc3Qgb2YgcmVjZW50IGFuY2hvcnNcbiAgICAgICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlIC0gcmVjZW50Q29ybmVyc1swXS5kaXN0YW5jZSA+IHdpbmRvd1NpemUpIHtcbiAgICAgICAgICAgIHJlY2VudEFuZ2xlRGVsdGEgLT0gcmVjZW50Q29ybmVycy5zaGlmdCgpLmFuZ2xlRGVsdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgc3VtIG9mIGFuZ2xlcyB3aXRoaW4gdGhlIHdpbmRvdyBhcmVhIGV4Y2VlZHMgdGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZS4gY2hlY2sgZmFpbHMuXG4gICAgICAgIGlmIChNYXRoLmFicyhyZWNlbnRBbmdsZURlbHRhKSA+IG1heEFuZ2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgYW5jaG9yRGlzdGFuY2UgKz0gY3VycmVudC5kaXN0KG5leHQpO1xuICAgIH1cblxuICAgIC8vIG5vIHBhcnQgb2YgdGhlIGxpbmUgaGFkIGFuIGFuZ2xlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkLiBjaGVjayBwYXNzZXMuXG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcExpbmU7XG5cbmZ1bmN0aW9uIGNsaXBMaW5lKGxpbmVzLCB4MSwgeTEsIHgyLCB5Mikge1xuICAgIHZhciBjbGlwcGVkTGluZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbGluZXMubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBsaW5lc1tsXTtcbiAgICAgICAgdmFyIGNsaXBwZWRMaW5lO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwMCA9IGxpbmVbaV07XG4gICAgICAgICAgICB2YXIgcDEgPSBsaW5lW2kgKyAxXTtcblxuXG4gICAgICAgICAgICBpZiAocDAueCA8IHgxICYmIHAxLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC54IDwgeDEpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludCh4MSwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgxIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHgxLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDEgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnkgPCB5MSAmJiBwMS55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueSA8IHkxKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkxIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTEgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwMC54ID49IHgyICYmIHAxLnggPj0geDIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHgyLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDIgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHgyLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDIgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnkgPj0geTIgJiYgcDEueSA+PSB5Mikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkyIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkyIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNsaXBwZWRMaW5lIHx8ICFwMC5lcXVhbHMoY2xpcHBlZExpbmVbY2xpcHBlZExpbmUubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICAgICAgY2xpcHBlZExpbmUgPSBbcDBdO1xuICAgICAgICAgICAgICAgIGNsaXBwZWRMaW5lcy5wdXNoKGNsaXBwZWRMaW5lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xpcHBlZExpbmUucHVzaChwMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcHBlZExpbmVzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxpc2lvbkJveDtcblxuZnVuY3Rpb24gQ29sbGlzaW9uQm94KGFuY2hvciwgeDEsIHkxLCB4MiwgeTIsIG1heFNjYWxlKSB7XG4gICAgLy8gdGhlIGJveCBpcyBjZW50ZXJlZCBhcm91bmQgdGhlIGFuY2hvciBwb2ludFxuICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuXG4gICAgLy8gZGlzdGFuY2VzIHRvIHRoZSBlZGdlcyBmcm9tIHRoZSBhbmNob3JcbiAgICB0aGlzLngxID0geDE7XG4gICAgdGhpcy55MSA9IHkxO1xuICAgIHRoaXMueDIgPSB4MjtcbiAgICB0aGlzLnkyID0geTI7XG5cbiAgICAvLyB0aGUgYm94IGlzIG9ubHkgdmFsaWQgZm9yIHNjYWxlcyA8IG1heFNjYWxlLlxuICAgIC8vIFRoZSBib3ggZG9lcyBub3QgYmxvY2sgb3RoZXIgYm94ZXMgYXQgc2NhbGVzID49IG1heFNjYWxlO1xuICAgIHRoaXMubWF4U2NhbGUgPSBtYXhTY2FsZTtcblxuICAgIC8vIHRoZSBzY2FsZSBhdCB3aGljaCB0aGUgbGFiZWwgY2FuIGZpcnN0IGJlIHNob3duXG4gICAgdGhpcy5wbGFjZW1lbnRTY2FsZSA9IDA7XG5cbiAgICAvLyByb3RhdGVkIGFuZCBzY2FsZWQgYmJveCB1c2VkIGZvciBpbmRleGluZ1xuICAgIHRoaXNbMF0gPSB0aGlzWzFdID0gdGhpc1syXSA9IHRoaXNbM10gPSAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29sbGlzaW9uQm94ID0gcmVxdWlyZSgnLi9jb2xsaXNpb25fYm94Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sbGlzaW9uRmVhdHVyZTtcblxuZnVuY3Rpb24gQ29sbGlzaW9uRmVhdHVyZShsaW5lLCBhbmNob3IsIHNoYXBlZCwgYm94U2NhbGUsIHBhZGRpbmcsIGFsaWduTGluZSkge1xuXG4gICAgdmFyIHkxID0gc2hhcGVkLnRvcCAqIGJveFNjYWxlIC0gcGFkZGluZztcbiAgICB2YXIgeTIgPSBzaGFwZWQuYm90dG9tICogYm94U2NhbGUgKyBwYWRkaW5nO1xuICAgIHZhciB4MSA9IHNoYXBlZC5sZWZ0ICogYm94U2NhbGUgLSBwYWRkaW5nO1xuICAgIHZhciB4MiA9IHNoYXBlZC5yaWdodCAqIGJveFNjYWxlICsgcGFkZGluZztcblxuICAgIHRoaXMuYm94ZXMgPSBbXTtcblxuICAgIGlmIChhbGlnbkxpbmUpIHtcblxuICAgICAgICB2YXIgaGVpZ2h0ID0geTIgLSB5MTtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHgyIC0geDE7XG5cbiAgICAgICAgaWYgKGhlaWdodCA8PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gc2V0IG1pbmltdW0gYm94IGhlaWdodCB0byBhdm9pZCB2ZXJ5IG1hbnkgc21hbGwgbGFiZWxzXG4gICAgICAgIGhlaWdodCA9IE1hdGgubWF4KDEwICogYm94U2NhbGUsIGhlaWdodCk7XG5cbiAgICAgICAgdGhpcy5iYm94aWZ5TGFiZWwobGluZSwgYW5jaG9yLCBsZW5ndGgsIGhlaWdodCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJveGVzLnB1c2gobmV3IENvbGxpc2lvbkJveChhbmNob3IsIHgxLCB5MSwgeDIsIHkyLCBJbmZpbml0eSkpO1xuICAgIH1cbn1cblxuQ29sbGlzaW9uRmVhdHVyZS5wcm90b3R5cGUuYmJveGlmeUxhYmVsID0gZnVuY3Rpb24obGluZSwgYW5jaG9yLCBsYWJlbExlbmd0aCwgYm94U2l6ZSkge1xuICAgIHZhciBzdGVwID0gYm94U2l6ZSAvIDI7XG4gICAgdmFyIG5Cb3hlcyA9IE1hdGguZmxvb3IobGFiZWxMZW5ndGggLyBzdGVwKTtcblxuICAgIC8vIG9mZnNldCB0aGUgY2VudGVyIG9mIHRoZSBmaXJzdCBib3ggYnkgaGFsZiBhIGJveCBzbyB0aGF0IHRoZSBlZGdlIG9mIHRoZVxuICAgIC8vIGJveCBpcyBhdCB0aGUgZWRnZSBvZiB0aGUgbGFiZWwuXG4gICAgdmFyIGZpcnN0Qm94T2Zmc2V0ID0gLWJveFNpemUgLyAyO1xuXG4gICAgdmFyIGJib3hlcyA9IHRoaXMuYm94ZXM7XG5cbiAgICB2YXIgcCA9IGFuY2hvcjtcbiAgICB2YXIgaW5kZXggPSBhbmNob3Iuc2VnbWVudCArIDE7XG4gICAgdmFyIGFuY2hvckRpc3RhbmNlID0gZmlyc3RCb3hPZmZzZXQ7XG5cbiAgICAvLyBtb3ZlIGJhY2t3YXJkcyBhbG9uZyB0aGUgbGluZSB0byB0aGUgZmlyc3Qgc2VnbWVudCB0aGUgbGFiZWwgYXBwZWFycyBvblxuICAgIGRvIHtcbiAgICAgICAgaW5kZXgtLTtcblxuICAgICAgICAvLyB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBmb3IgdGhlIGxhYmVsIGFmdGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmVcbiAgICAgICAgLy8gY2hlY2tNYXhBbmdsZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGNhdWdodCB0aGlzXG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBiYm94ZXM7XG5cbiAgICAgICAgYW5jaG9yRGlzdGFuY2UgLT0gbGluZVtpbmRleF0uZGlzdChwKTtcbiAgICAgICAgcCA9IGxpbmVbaW5kZXhdO1xuICAgIH0gd2hpbGUgKGFuY2hvckRpc3RhbmNlID4gLWxhYmVsTGVuZ3RoIC8gMik7XG5cbiAgICB2YXIgc2VnbWVudExlbmd0aCA9IGxpbmVbaW5kZXhdLmRpc3QobGluZVtpbmRleCArIDFdKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbkJveGVzOyBpKyspIHtcbiAgICAgICAgLy8gdGhlIGRpc3RhbmNlIHRoZSBib3ggd2lsbCBiZSBmcm9tIHRoZSBhbmNob3JcbiAgICAgICAgdmFyIGJveERpc3RhbmNlVG9BbmNob3IgPSAtbGFiZWxMZW5ndGggLyAyICsgaSAqIHN0ZXA7XG5cbiAgICAgICAgLy8gdGhlIGJveCBpcyBub3Qgb24gdGhlIGN1cnJlbnQgc2VnbWVudC4gTW92ZSB0byB0aGUgbmV4dCBzZWdtZW50LlxuICAgICAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgKyBzZWdtZW50TGVuZ3RoIDwgYm94RGlzdGFuY2VUb0FuY2hvcikge1xuICAgICAgICAgICAgYW5jaG9yRGlzdGFuY2UgKz0gc2VnbWVudExlbmd0aDtcbiAgICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAgIC8vIFRoZXJlIGlzbid0IGVub3VnaCByb29tIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSBsaW5lLmxlbmd0aCkgcmV0dXJuIGJib3hlcztcblxuICAgICAgICAgICAgc2VnbWVudExlbmd0aCA9IGxpbmVbaW5kZXhdLmRpc3QobGluZVtpbmRleCArIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZSBkaXN0YW5jZSB0aGUgYm94IHdpbGwgYmUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50XG4gICAgICAgIHZhciBzZWdtZW50Qm94RGlzdGFuY2UgPSBib3hEaXN0YW5jZVRvQW5jaG9yIC0gYW5jaG9yRGlzdGFuY2U7XG5cbiAgICAgICAgdmFyIHAwID0gbGluZVtpbmRleF07XG4gICAgICAgIHZhciBwMSA9IGxpbmVbaW5kZXggKyAxXTtcbiAgICAgICAgdmFyIGJveEFuY2hvciA9IHAxLnN1YihwMCkuX3VuaXQoKS5fbXVsdChzZWdtZW50Qm94RGlzdGFuY2UpLl9hZGQocDApO1xuXG4gICAgICAgIHZhciBkaXN0YW5jZVRvSW5uZXJFZGdlID0gTWF0aC5tYXgoTWF0aC5hYnMoYm94RGlzdGFuY2VUb0FuY2hvciAtIGZpcnN0Qm94T2Zmc2V0KSAtIHN0ZXAgLyAyLCAwKTtcbiAgICAgICAgdmFyIG1heFNjYWxlID0gbGFiZWxMZW5ndGggLyAyIC8gZGlzdGFuY2VUb0lubmVyRWRnZTtcblxuICAgICAgICBiYm94ZXMucHVzaChuZXcgQ29sbGlzaW9uQm94KGJveEFuY2hvciwgLWJveFNpemUgLyAyLCAtYm94U2l6ZSAvIDIsIGJveFNpemUgLyAyLCBib3hTaXplIC8gMiwgbWF4U2NhbGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmJveGVzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJidXNoID0gcmVxdWlyZSgncmJ1c2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb2xsaXNpb25UaWxlO1xuXG5mdW5jdGlvbiBDb2xsaXNpb25UaWxlKHpvb20sIHRpbGVFeHRlbnQsIHRpbGVTaXplKSB7XG4gICAgdGhpcy56b29tID0gem9vbTtcbiAgICB0aGlzLnRpbGVQaXhlbFJhdGlvID0gdGlsZUV4dGVudCAvIHRpbGVTaXplO1xufVxuXG5Db2xsaXNpb25UaWxlLnByb3RvdHlwZS5taW5TY2FsZSA9IDAuMjU7XG5Db2xsaXNpb25UaWxlLnByb3RvdHlwZS5tYXhTY2FsZSA9IDI7XG5cbkNvbGxpc2lvblRpbGUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oYW5nbGUsIHBpdGNoKSB7XG4gICAgdGhpcy50cmVlID0gcmJ1c2goKTtcbiAgICB0aGlzLmFuZ2xlID0gYW5nbGU7XG5cbiAgICB2YXIgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgdGhpcy5yb3RhdGlvbk1hdHJpeCA9IFtjb3MsIC1zaW4sIHNpbiwgY29zXTtcblxuICAgIC8vIFN0cmV0Y2ggYm94ZXMgaW4geSBkaXJlY3Rpb24gdG8gYWNjb3VudCBmb3IgdGhlIG1hcCB0aWx0LlxuICAgIHRoaXMueVN0cmV0Y2ggPSAxIC8gTWF0aC5jb3MocGl0Y2ggLyAxODAgKiBNYXRoLlBJKTtcblxuICAgIC8vIFRoZSBhbW91bnQgdGhlIG1hcCBpcyBzcXVpc2hlZCBkZXBlbmRzIG9uIHRoZSB5IHBvc2l0aW9uLlxuICAgIC8vIFNvcnQgb2YgYWNjb3VudCBmb3IgdGhpcyBieSBtYWtpbmcgYWxsIGJveGVzIGEgYml0IGJpZ2dlci5cbiAgICB0aGlzLnlTdHJldGNoID0gTWF0aC5wb3codGhpcy55U3RyZXRjaCwgMS4zKTtcbn07XG5cbkNvbGxpc2lvblRpbGUucHJvdG90eXBlLnBsYWNlRmVhdHVyZSA9IGZ1bmN0aW9uKGZlYXR1cmUpIHtcblxuICAgIHZhciBtaW5QbGFjZW1lbnRTY2FsZSA9IHRoaXMubWluU2NhbGU7XG4gICAgdmFyIHJvdGF0aW9uTWF0cml4ID0gdGhpcy5yb3RhdGlvbk1hdHJpeDtcbiAgICB2YXIgeVN0cmV0Y2ggPSB0aGlzLnlTdHJldGNoO1xuXG4gICAgZm9yICh2YXIgYiA9IDA7IGIgPCBmZWF0dXJlLmJveGVzLmxlbmd0aDsgYisrKSB7XG5cbiAgICAgICAgdmFyIGJveCA9IGZlYXR1cmUuYm94ZXNbYl07XG5cbiAgICAgICAgdmFyIGFuY2hvciA9IGJveC5hbmNob3IubWF0TXVsdChyb3RhdGlvbk1hdHJpeCk7XG4gICAgICAgIHZhciB4ID0gYW5jaG9yLng7XG4gICAgICAgIHZhciB5ID0gYW5jaG9yLnk7XG5cbiAgICAgICAgYm94WzBdID0geCArIGJveC54MTtcbiAgICAgICAgYm94WzFdID0geSArIGJveC55MSAqIHlTdHJldGNoO1xuICAgICAgICBib3hbMl0gPSB4ICsgYm94LngyO1xuICAgICAgICBib3hbM10gPSB5ICsgYm94LnkyICogeVN0cmV0Y2g7XG5cbiAgICAgICAgdmFyIGJsb2NraW5nQm94ZXMgPSB0aGlzLnRyZWUuc2VhcmNoKGJveCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja2luZ0JveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYmxvY2tpbmcgPSBibG9ja2luZ0JveGVzW2ldO1xuICAgICAgICAgICAgdmFyIGJsb2NraW5nQW5jaG9yID0gYmxvY2tpbmcuYW5jaG9yLm1hdE11bHQocm90YXRpb25NYXRyaXgpO1xuXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBsb3dlc3Qgc2NhbGUgYXQgd2hpY2ggdGhlIHR3byBib3hlcyBjYW4gZml0IHNpZGUgYnkgc2lkZSB3aXRob3V0IG92ZXJsYXBwaW5nLlxuICAgICAgICAgICAgLy8gT3JpZ2luYWwgYWxnb3JpdGhtOlxuICAgICAgICAgICAgdmFyIHMxID0gKGJsb2NraW5nLngxIC0gYm94LngyKSAvICh4IC0gYmxvY2tpbmdBbmNob3IueCk7IC8vIHNjYWxlIGF0IHdoaWNoIG5ldyBib3ggaXMgdG8gdGhlIGxlZnQgb2Ygb2xkIGJveFxuICAgICAgICAgICAgdmFyIHMyID0gKGJsb2NraW5nLngyIC0gYm94LngxKSAvICh4IC0gYmxvY2tpbmdBbmNob3IueCk7IC8vIHNjYWxlIGF0IHdoaWNoIG5ldyBib3ggaXMgdG8gdGhlIHJpZ2h0IG9mIG9sZCBib3hcbiAgICAgICAgICAgIHZhciBzMyA9IChibG9ja2luZy55MSAtIGJveC55MikgKiB5U3RyZXRjaCAvICh5IC0gYmxvY2tpbmdBbmNob3IueSk7IC8vIHNjYWxlIGF0IHdoaWNoIG5ldyBib3ggaXMgdG8gdGhlIHRvcCBvZiBvbGQgYm94XG4gICAgICAgICAgICB2YXIgczQgPSAoYmxvY2tpbmcueTIgLSBib3gueTEpICogeVN0cmV0Y2ggLyAoeSAtIGJsb2NraW5nQW5jaG9yLnkpOyAvLyBzY2FsZSBhdCB3aGljaCBuZXcgYm94IGlzIHRvIHRoZSBib3R0b20gb2Ygb2xkIGJveFxuXG4gICAgICAgICAgICBpZiAoaXNOYU4oczEpIHx8IGlzTmFOKHMyKSkgczEgPSBzMiA9IDE7XG4gICAgICAgICAgICBpZiAoaXNOYU4oczMpIHx8IGlzTmFOKHM0KSkgczMgPSBzNCA9IDE7XG5cbiAgICAgICAgICAgIHZhciBjb2xsaXNpb25GcmVlU2NhbGUgPSBNYXRoLm1pbihNYXRoLm1heChzMSwgczIpLCBNYXRoLm1heChzMywgczQpKTtcblxuICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkZyZWVTY2FsZSA+IGJsb2NraW5nLm1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYSBib3gncyBtYXhTY2FsZSB0aGUgbGFiZWwgaGFzIHNocnVuayBlbm91Z2ggdGhhdCB0aGUgYm94IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gY292ZXIgaXQsXG4gICAgICAgICAgICAgICAgLy8gc28gdW5ibG9jayB0aGUgbmV3IGJveCBhdCB0aGUgc2NhbGUgdGhhdCB0aGUgb2xkIGJveCBkaXNhcHBlYXJzLlxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZyZWVTY2FsZSA9IGJsb2NraW5nLm1heFNjYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uRnJlZVNjYWxlID4gYm94Lm1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGJveCBjYW4gb25seSBiZSBzaG93biBhZnRlciBpdCBpcyB2aXNpYmxlLCB0aGVuIHRoZSBib3ggY2FuIG5ldmVyIGJlIHNob3duLlxuICAgICAgICAgICAgICAgIC8vIEJ1dCB0aGUgbGFiZWwgY2FuIGJlIHNob3duIGFmdGVyIHRoaXMgYm94IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZyZWVTY2FsZSA9IGJveC5tYXhTY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkZyZWVTY2FsZSA+IG1pblBsYWNlbWVudFNjYWxlICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZyZWVTY2FsZSA+PSBibG9ja2luZy5wbGFjZW1lbnRTY2FsZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgY29sbGlzaW9uIG9jY3VycyBhdCBhIGxvd2VyIHNjYWxlIHRoYW4gcHJldmlvdXNseSBmb3VuZCBjb2xsaXNpb25zXG4gICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBjb2xsaXNpb24gb2NjdXJzIHdoaWxlIHRoZSBvdGhlciBsYWJlbCBpcyB2aXNpYmxlXG5cbiAgICAgICAgICAgICAgICAvLyB0aGlzIHRoaXMgaXMgdGhlIGxvd2VzdCBzY2FsZSBhdCB3aGljaCB0aGUgbGFiZWwgd29uJ3QgY29sbGlkZSB3aXRoIGFueXRoaW5nXG4gICAgICAgICAgICAgICAgbWluUGxhY2VtZW50U2NhbGUgPSBjb2xsaXNpb25GcmVlU2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtaW5QbGFjZW1lbnRTY2FsZSA+PSB0aGlzLm1heFNjYWxlKSByZXR1cm4gbWluUGxhY2VtZW50U2NhbGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWluUGxhY2VtZW50U2NhbGU7XG59O1xuXG5Db2xsaXNpb25UaWxlLnByb3RvdHlwZS5pbnNlcnRGZWF0dXJlID0gZnVuY3Rpb24oZmVhdHVyZSwgbWluUGxhY2VtZW50U2NhbGUpIHtcblxuICAgIHZhciBib3hlcyA9IGZlYXR1cmUuYm94ZXM7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBib3hlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICBib3hlc1trXS5wbGFjZW1lbnRTY2FsZSA9IG1pblBsYWNlbWVudFNjYWxlO1xuICAgIH1cblxuICAgIGlmIChtaW5QbGFjZW1lbnRTY2FsZSA8IHRoaXMubWF4U2NhbGUpIHtcbiAgICAgICAgdGhpcy50cmVlLmxvYWQoYm94ZXMpO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbnRlcnBvbGF0ZSA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJwb2xhdGUnKTtcbnZhciBBbmNob3IgPSByZXF1aXJlKCcuLi9zeW1ib2wvYW5jaG9yJyk7XG52YXIgY2hlY2tNYXhBbmdsZSA9IHJlcXVpcmUoJy4vY2hlY2tfbWF4X2FuZ2xlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QW5jaG9ycztcblxuZnVuY3Rpb24gZ2V0QW5jaG9ycyhsaW5lLCBzcGFjaW5nLCBtYXhBbmdsZSwgc2hhcGVkVGV4dCwgZ2x5cGhTaXplLCBib3hTY2FsZSwgb3ZlcnNjYWxpbmcpIHtcblxuICAgIC8vIFJlc2FtcGxlIGEgbGluZSB0byBnZXQgYW5jaG9yIHBvaW50cyBmb3IgbGFiZWxzIGFuZCBjaGVjayB0aGF0IGVhY2hcbiAgICAvLyBwb3RlbnRpYWwgbGFiZWwgcGFzc2VzIHRleHQtbWF4LWFuZ2xlIGNoZWNrIGFuZCBoYXMgZW5vdWdoIGZyb29tIHRvIGZpdFxuICAgIC8vIG9uIHRoZSBsaW5lLlxuXG4gICAgdmFyIGFuZ2xlV2luZG93U2l6ZSA9IHNoYXBlZFRleHQgP1xuICAgICAgICAzIC8gNSAqIGdseXBoU2l6ZSAqIGJveFNjYWxlIDpcbiAgICAgICAgMDtcblxuICAgIC8vIE9mZnNldCB0aGUgZmlyc3QgYW5jaG9yIGJ5IGhhbGYgdGhlIGxhYmVsIGxlbmd0aCAob3IgaGFsZiB0aGUgc3BhY2luZyBkaXN0YW5jZSBmb3IgaWNvbnMpLlxuICAgIC8vIEFkZCBhIGJpdCBvZiBleHRyYSBvZmZzZXQgdG8gYXZvaWQgY29sbGlzaW9ucyBhdCBUIGludGVyc2VjdGlvbnMuXG4gICAgdmFyIGxhYmVsTGVuZ3RoID0gc2hhcGVkVGV4dCA/IHNoYXBlZFRleHQucmlnaHQgLSBzaGFwZWRUZXh0LmxlZnQgOiBzcGFjaW5nO1xuICAgIHZhciBleHRyYU9mZnNldCA9IGdseXBoU2l6ZSAqIDI7XG4gICAgdmFyIG9mZnNldCA9ICgobGFiZWxMZW5ndGggLyAyICsgZXh0cmFPZmZzZXQpICogYm94U2NhbGUgKiBvdmVyc2NhbGluZykgJSBzcGFjaW5nO1xuXG4gICAgcmV0dXJuIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGggKiBib3hTY2FsZSwgZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIHBsYWNlQXRNaWRkbGUpIHtcblxuICAgIHZhciBkaXN0YW5jZSA9IDAsXG4gICAgICAgIG1hcmtlZERpc3RhbmNlID0gb2Zmc2V0ID8gb2Zmc2V0IC0gc3BhY2luZyA6IDA7XG5cbiAgICB2YXIgYW5jaG9ycyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKykge1xuXG4gICAgICAgIHZhciBhID0gbGluZVtpXSxcbiAgICAgICAgICAgIGIgPSBsaW5lW2kgKyAxXTtcblxuICAgICAgICB2YXIgc2VnbWVudERpc3QgPSBhLmRpc3QoYiksXG4gICAgICAgICAgICBhbmdsZSA9IGIuYW5nbGVUbyhhKTtcblxuICAgICAgICB3aGlsZSAobWFya2VkRGlzdGFuY2UgKyBzcGFjaW5nIDwgZGlzdGFuY2UgKyBzZWdtZW50RGlzdCkge1xuICAgICAgICAgICAgbWFya2VkRGlzdGFuY2UgKz0gc3BhY2luZztcblxuICAgICAgICAgICAgdmFyIHQgPSAobWFya2VkRGlzdGFuY2UgLSBkaXN0YW5jZSkgLyBzZWdtZW50RGlzdCxcbiAgICAgICAgICAgICAgICB4ID0gaW50ZXJwb2xhdGUoYS54LCBiLngsIHQpLFxuICAgICAgICAgICAgICAgIHkgPSBpbnRlcnBvbGF0ZShhLnksIGIueSwgdCk7XG5cbiAgICAgICAgICAgIGlmICh4ID49IDAgJiYgeCA8IDQwOTYgJiYgeSA+PSAwICYmIHkgPCA0MDk2KSB7XG4gICAgICAgICAgICAgICAgeCA9IE1hdGgucm91bmQoeCk7XG4gICAgICAgICAgICAgICAgeSA9IE1hdGgucm91bmQoeSk7XG4gICAgICAgICAgICAgICAgdmFyIGFuY2hvciA9IG5ldyBBbmNob3IoeCwgeSwgYW5nbGUsIGkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFhbmdsZVdpbmRvd1NpemUgfHwgY2hlY2tNYXhBbmdsZShsaW5lLCBhbmNob3IsIGxhYmVsTGVuZ3RoLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlKSkge1xuICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnB1c2goYW5jaG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkaXN0YW5jZSArPSBzZWdtZW50RGlzdDtcbiAgICB9XG5cbiAgICBpZiAoIXBsYWNlQXRNaWRkbGUgJiYgIWFuY2hvcnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBhdHRlbXB0IGF0IGZpbmRpbmcgYW5jaG9ycyBhdCB3aGljaCBsYWJlbHMgY2FuIGJlIHBsYWNlZCBmYWlsZWQuXG4gICAgICAgIC8vIFRyeSBhZ2FpbiwgYnV0IHRoaXMgdGltZSBqdXN0IHRyeSBwbGFjaW5nIG9uZSBhbmNob3IgYXQgdGhlIG1pZGRsZSBvZiB0aGUgbGluZS5cbiAgICAgICAgLy8gVGhpcyBoYXMgdGhlIG1vc3QgZWZmZWN0IGZvciBzaG9ydCBsaW5lcyBpbiBvdmVyc2NhbGVkIHRpbGVzLCBzaW5jZSB0aGVcbiAgICAgICAgLy8gaW5pdGlhbCBvZmZzZXQgdXNlZCBpbiBvdmVyc2NhbGVkIHRpbGVzIGlzIGNhbGN1bGF0ZWQgdG8gYWxpZ24gbGFiZWxzIHdpdGggcG9zaXRpb25zIGluXG4gICAgICAgIC8vIHBhcmVudCB0aWxlcyBpbnN0ZWFkIG9mIHBsYWNpbmcgdGhlIGxhYmVsIGFzIGNsb3NlIHRvIHRoZSBiZWdpbm5pbmcgYXMgcG9zc2libGUuXG4gICAgICAgIGFuY2hvcnMgPSByZXNhbXBsZShsaW5lLCBkaXN0YW5jZSAvIDIsIHNwYWNpbmcsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUsIGxhYmVsTGVuZ3RoLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jaG9ycztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEJpblBhY2sgPSByZXF1aXJlKCcuL2Jpbl9wYWNrJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gR2x5cGhBdGxhcztcbmZ1bmN0aW9uIEdseXBoQXRsYXMod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuICAgIHRoaXMuYmluID0gbmV3IEJpblBhY2sod2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5pbmRleCA9IHt9O1xuICAgIHRoaXMuaWRzID0ge307XG4gICAgdGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpO1xufVxuXG5HbHlwaEF0bGFzLnByb3RvdHlwZSA9IHtcbiAgICBnZXQgZGVidWcoKSB7XG4gICAgICAgIHJldHVybiAnY2FudmFzJyBpbiB0aGlzO1xuICAgIH0sXG4gICAgc2V0IGRlYnVnKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiB0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jdHg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYW52YXM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5HbHlwaEF0bGFzLnByb3RvdHlwZS5nZXRHbHlwaHMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2x5cGhzID0ge30sXG4gICAgICAgIHNwbGl0LFxuICAgICAgICBuYW1lLFxuICAgICAgICBpZDtcblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmlkcykge1xuICAgICAgICBzcGxpdCA9IGtleS5zcGxpdCgnIycpO1xuICAgICAgICBuYW1lID0gc3BsaXRbMF07XG4gICAgICAgIGlkID0gc3BsaXRbMV07XG5cbiAgICAgICAgaWYgKCFnbHlwaHNbbmFtZV0pIGdseXBoc1tuYW1lXSA9IFtdO1xuICAgICAgICBnbHlwaHNbbmFtZV0ucHVzaChpZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdseXBocztcbn07XG5cbkdseXBoQXRsYXMucHJvdG90eXBlLmdldFJlY3RzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlY3RzID0ge30sXG4gICAgICAgIHNwbGl0LFxuICAgICAgICBuYW1lLFxuICAgICAgICBpZDtcblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmlkcykge1xuICAgICAgICBzcGxpdCA9IGtleS5zcGxpdCgnIycpO1xuICAgICAgICBuYW1lID0gc3BsaXRbMF07XG4gICAgICAgIGlkID0gc3BsaXRbMV07XG5cbiAgICAgICAgaWYgKCFyZWN0c1tuYW1lXSkgcmVjdHNbbmFtZV0gPSB7fTtcbiAgICAgICAgcmVjdHNbbmFtZV1baWRdID0gdGhpcy5pbmRleFtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiByZWN0cztcbn07XG5cbkdseXBoQXRsYXMucHJvdG90eXBlLnJlbW92ZUdseXBocyA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuaWRzKSB7XG5cbiAgICAgICAgdmFyIGlkcyA9IHRoaXMuaWRzW2tleV07XG5cbiAgICAgICAgdmFyIHBvcyA9IGlkcy5pbmRleE9mKGlkKTtcbiAgICAgICAgaWYgKHBvcyA+PSAwKSBpZHMuc3BsaWNlKHBvcywgMSk7XG4gICAgICAgIHRoaXMuaWRzW2tleV0gPSBpZHM7XG5cbiAgICAgICAgaWYgKCFpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgcmVjdCA9IHRoaXMuaW5kZXhba2V5XTtcblxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuZGF0YTtcbiAgICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgcmVjdC5oOyB5KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgeTEgPSB0aGlzLndpZHRoICogKHJlY3QueSArIHkpICsgcmVjdC54O1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgcmVjdC53OyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3kxICsgeF0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuYmluLnJlbGVhc2UocmVjdCk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmluZGV4W2tleV07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5pZHNba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgdGhpcy51cGRhdGVUZXh0dXJlKHRoaXMuZ2wpO1xufTtcblxuR2x5cGhBdGxhcy5wcm90b3R5cGUuYWRkR2x5cGggPSBmdW5jdGlvbihpZCwgbmFtZSwgZ2x5cGgsIGJ1ZmZlcikge1xuICAgIGlmICghZ2x5cGgpIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCdtaXNzaW5nIGdseXBoJywgY29kZSwgU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIga2V5ID0gbmFtZSArIFwiI1wiICsgZ2x5cGguaWQ7XG5cbiAgICAvLyBUaGUgZ2x5cGggaXMgYWxyZWFkeSBpbiB0aGlzIHRleHR1cmUuXG4gICAgaWYgKHRoaXMuaW5kZXhba2V5XSkge1xuICAgICAgICBpZiAodGhpcy5pZHNba2V5XS5pbmRleE9mKGlkKSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuaWRzW2tleV0ucHVzaChpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhba2V5XTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZ2x5cGggYml0bWFwIGhhcyB6ZXJvIHdpZHRoLlxuICAgIGlmICghZ2x5cGguYml0bWFwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBidWZmZXJlZFdpZHRoID0gZ2x5cGgud2lkdGggKyBidWZmZXIgKiAyO1xuICAgIHZhciBidWZmZXJlZEhlaWdodCA9IGdseXBoLmhlaWdodCArIGJ1ZmZlciAqIDI7XG5cbiAgICAvLyBBZGQgYSAxcHggYm9yZGVyIGFyb3VuZCBldmVyeSBpbWFnZS5cbiAgICB2YXIgcGFkZGluZyA9IDE7XG4gICAgdmFyIHBhY2tXaWR0aCA9IGJ1ZmZlcmVkV2lkdGggKyAyICogcGFkZGluZztcbiAgICB2YXIgcGFja0hlaWdodCA9IGJ1ZmZlcmVkSGVpZ2h0ICsgMiAqIHBhZGRpbmc7XG5cbiAgICAvLyBJbmNyZWFzZSB0byBuZXh0IG51bWJlciBkaXZpc2libGUgYnkgNCwgYnV0IGF0IGxlYXN0IDEuXG4gICAgLy8gVGhpcyBpcyBzbyB3ZSBjYW4gc2NhbGUgZG93biB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyBhbmQgcGFjayB0aGVtXG4gICAgLy8gaW50byAyIGJ5dGVzIHJhdGhlciB0aGFuIDQgYnl0ZXMuXG4gICAgcGFja1dpZHRoICs9ICg0IC0gcGFja1dpZHRoICUgNCk7XG4gICAgcGFja0hlaWdodCArPSAoNCAtIHBhY2tIZWlnaHQgJSA0KTtcblxuICAgIHZhciByZWN0ID0gdGhpcy5iaW4uYWxsb2NhdGUocGFja1dpZHRoLCBwYWNrSGVpZ2h0KTtcbiAgICBpZiAocmVjdC54IDwgMCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ2dseXBoIGJpdG1hcCBvdmVyZmxvdycpO1xuICAgICAgICByZXR1cm4geyBnbHlwaDogZ2x5cGgsIHJlY3Q6IG51bGwgfTtcbiAgICB9XG5cbiAgICB0aGlzLmluZGV4W2tleV0gPSByZWN0O1xuICAgIHRoaXMuaWRzW2tleV0gPSBbaWRdO1xuXG4gICAgdmFyIHRhcmdldCA9IHRoaXMuZGF0YTtcbiAgICB2YXIgc291cmNlID0gZ2x5cGguYml0bWFwO1xuICAgIGZvciAodmFyIHkgPSAwOyB5IDwgYnVmZmVyZWRIZWlnaHQ7IHkrKykge1xuICAgICAgICB2YXIgeTEgPSB0aGlzLndpZHRoICogKHJlY3QueSArIHkgKyBwYWRkaW5nKSArIHJlY3QueCArIHBhZGRpbmc7XG4gICAgICAgIHZhciB5MiA9IGJ1ZmZlcmVkV2lkdGggKiB5O1xuICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGJ1ZmZlcmVkV2lkdGg7IHgrKykge1xuICAgICAgICAgICAgdGFyZ2V0W3kxICsgeF0gPSBzb3VyY2VbeTIgKyB4XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHJlY3Q7XG59O1xuXG5HbHlwaEF0bGFzLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oZ2wpIHtcbiAgICB0aGlzLmdsID0gZ2w7XG4gICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5BTFBIQSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDAsIGdsLkFMUEhBLCBnbC5VTlNJR05FRF9CWVRFLCBudWxsKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgfVxufTtcblxuR2x5cGhBdGxhcy5wcm90b3R5cGUudXBkYXRlVGV4dHVyZSA9IGZ1bmN0aW9uKGdsKSB7XG4gICAgdGhpcy5iaW5kKGdsKTtcbiAgICBpZiAodGhpcy5kaXJ0eSkge1xuXG4gICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIGdsLkFMUEhBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLmRhdGEpO1xuXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIGlmICh0aGlzLmN0eCkge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrLCBqICs9IDQpIHtcbiAgICAgICAgICAgICAgICBkYXRhLmRhdGFbal0gPSB0aGlzLmRhdGFbaV07XG4gICAgICAgICAgICAgICAgZGF0YS5kYXRhW2ogKyAxXSA9IHRoaXMuZGF0YVtpXTtcbiAgICAgICAgICAgICAgICBkYXRhLmRhdGFbaiArIDJdID0gdGhpcy5kYXRhW2ldO1xuICAgICAgICAgICAgICAgIGRhdGEuZGF0YVtqICsgM10gPSAyNTU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN0eC5wdXRJbWFnZURhdGEoZGF0YSwgMCwgMCk7XG5cbiAgICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gJ3JlZCc7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMuYmluLmZyZWUubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJlZSA9IHRoaXMuYmluLmZyZWVba107XG4gICAgICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlUmVjdChmcmVlLngsIGZyZWUueSwgZnJlZS53LCBmcmVlLmgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVORCBERUJVR1xuXG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbm9ybWFsaXplVVJMID0gcmVxdWlyZSgnLi4vdXRpbC9tYXBib3gnKS5ub3JtYWxpemVHbHlwaHNVUkw7XG52YXIgZ2V0QXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKS5nZXRBcnJheUJ1ZmZlcjtcbnZhciBHbHlwaHMgPSByZXF1aXJlKCcuLi91dGlsL2dseXBocycpO1xudmFyIFByb3RvYnVmID0gcmVxdWlyZSgncGJmJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gR2x5cGhTb3VyY2U7XG5cbi8qKlxuICogQSBnbHlwaCBzb3VyY2UgaGFzIGEgVVJMIGZyb20gd2hpY2ggdG8gbG9hZCBuZXcgZ2x5cGhzIGFuZCBvd25zIGEgR2x5cGhBdGxhc1xuICogdGhhdCBzdG9yZXMgY3VycmVudGx5LWxvYWRlZCBnbHlwaHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBnbHlwaCB0ZW1wbGF0ZSB1cmxcbiAqIEBwYXJhbSB7T2JqZWN0fSBnbHlwaEF0bGFzIGdseXBoIGF0bGFzIG9iamVjdFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gR2x5cGhTb3VyY2UodXJsLCBnbHlwaEF0bGFzKSB7XG4gICAgdGhpcy51cmwgPSB1cmwgJiYgbm9ybWFsaXplVVJMKHVybCk7XG4gICAgdGhpcy5nbHlwaEF0bGFzID0gZ2x5cGhBdGxhcztcbiAgICB0aGlzLnN0YWNrcyA9IFtdO1xuICAgIHRoaXMubG9hZGluZyA9IHt9O1xufVxuXG5HbHlwaFNvdXJjZS5wcm90b3R5cGUuZ2V0U2ltcGxlR2x5cGhzID0gZnVuY3Rpb24oZm9udHN0YWNrLCBnbHlwaElEcywgdWlkLCBjYWxsYmFjaykge1xuXG4gICAgaWYgKHRoaXMuc3RhY2tzW2ZvbnRzdGFja10gPT09IHVuZGVmaW5lZCkgdGhpcy5zdGFja3NbZm9udHN0YWNrXSA9IHt9O1xuXG4gICAgdmFyIGdseXBocyA9IHt9O1xuXG4gICAgdmFyIHN0YWNrID0gdGhpcy5zdGFja3NbZm9udHN0YWNrXTtcbiAgICB2YXIgZ2x5cGhBdGxhcyA9IHRoaXMuZ2x5cGhBdGxhcztcblxuICAgIC8vIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoZSBzZGYgYml0bWFwcyBhcmUgcGFkZGVkIGJ5XG4gICAgdmFyIGJ1ZmZlciA9IDM7XG5cbiAgICB2YXIgbWlzc2luZyA9IHt9O1xuICAgIHZhciByZW1haW5pbmcgPSAwO1xuICAgIHZhciByYW5nZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhJRHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGdseXBoSUQgPSBnbHlwaElEc1tpXTtcbiAgICAgICAgcmFuZ2UgPSBNYXRoLmZsb29yKGdseXBoSUQgLyAyNTYpO1xuXG4gICAgICAgIGlmIChzdGFja1tyYW5nZV0pIHtcbiAgICAgICAgICAgIHZhciBnbHlwaCA9IHN0YWNrW3JhbmdlXS5nbHlwaHNbZ2x5cGhJRF07XG4gICAgICAgICAgICB2YXIgcmVjdCAgPSBnbHlwaEF0bGFzLmFkZEdseXBoKHVpZCwgZm9udHN0YWNrLCBnbHlwaCwgYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChnbHlwaCkgZ2x5cGhzW2dseXBoSURdID0gbmV3IFNpbXBsZUdseXBoKGdseXBoLCByZWN0LCBidWZmZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1pc3NpbmdbcmFuZ2VdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtaXNzaW5nW3JhbmdlXSA9IFtdO1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWlzc2luZ1tyYW5nZV0ucHVzaChnbHlwaElEKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcmVtYWluaW5nKSBjYWxsYmFjayh1bmRlZmluZWQsIGdseXBocyk7XG5cbiAgICB2YXIgb25SYW5nZUxvYWRlZCA9IGZ1bmN0aW9uKGVyciwgcmFuZ2UsIGRhdGEpIHtcbiAgICAgICAgLy8gVE9ETyBub3QgYmUgc2lsZW50IGFib3V0IGVycm9yc1xuICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5zdGFja3NbZm9udHN0YWNrXVtyYW5nZV0gPSBkYXRhLnN0YWNrc1swXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWlzc2luZ1tyYW5nZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZ2x5cGhJRCA9IG1pc3NpbmdbcmFuZ2VdW2ldO1xuICAgICAgICAgICAgICAgIHZhciBnbHlwaCA9IHN0YWNrLmdseXBoc1tnbHlwaElEXTtcbiAgICAgICAgICAgICAgICB2YXIgcmVjdCAgPSBnbHlwaEF0bGFzLmFkZEdseXBoKHVpZCwgZm9udHN0YWNrLCBnbHlwaCwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2x5cGgpIGdseXBoc1tnbHlwaElEXSA9IG5ldyBTaW1wbGVHbHlwaChnbHlwaCwgcmVjdCwgYnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW1haW5pbmctLTtcbiAgICAgICAgaWYgKCFyZW1haW5pbmcpIGNhbGxiYWNrKHVuZGVmaW5lZCwgZ2x5cGhzKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBmb3IgKHZhciByIGluIG1pc3NpbmcpIHtcbiAgICAgICAgdGhpcy5sb2FkUmFuZ2UoZm9udHN0YWNrLCByLCBvblJhbmdlTG9hZGVkKTtcbiAgICB9XG59O1xuXG4vLyBBIHNpbXBsaWZpZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdseXBoIGNvbnRhaW5pbmcgb25seSB0aGUgcHJvcGVydGllcyBuZWVkZWQgZm9yIHNoYXBpbmcuXG5mdW5jdGlvbiBTaW1wbGVHbHlwaChnbHlwaCwgcmVjdCwgYnVmZmVyKSB7XG4gICAgdmFyIHBhZGRpbmcgPSAxO1xuICAgIHRoaXMuYWR2YW5jZSA9IGdseXBoLmFkdmFuY2U7XG4gICAgdGhpcy5sZWZ0ID0gZ2x5cGgubGVmdCAtIGJ1ZmZlciAtIHBhZGRpbmc7XG4gICAgdGhpcy50b3AgPSBnbHlwaC50b3AgKyBidWZmZXIgKyBwYWRkaW5nO1xuICAgIHRoaXMucmVjdCA9IHJlY3Q7XG59XG5cbkdseXBoU291cmNlLnByb3RvdHlwZS5sb2FkUmFuZ2UgPSBmdW5jdGlvbihmb250c3RhY2ssIHJhbmdlLCBjYWxsYmFjaykge1xuXG4gICAgaWYgKHJhbmdlICogMjU2ID4gNjU1MzUpIHJldHVybiBjYWxsYmFjaygnZ3lwaHMgPiA2NTUzNSBub3Qgc3VwcG9ydGVkJyk7XG5cbiAgICBpZiAodGhpcy5sb2FkaW5nW2ZvbnRzdGFja10gPT09IHVuZGVmaW5lZCkgdGhpcy5sb2FkaW5nW2ZvbnRzdGFja10gPSB7fTtcbiAgICB2YXIgbG9hZGluZyA9IHRoaXMubG9hZGluZ1tmb250c3RhY2tdO1xuXG4gICAgaWYgKGxvYWRpbmdbcmFuZ2VdKSB7XG4gICAgICAgIGxvYWRpbmdbcmFuZ2VdLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRpbmdbcmFuZ2VdID0gW2NhbGxiYWNrXTtcblxuICAgICAgICB2YXIgcmFuZ2VOYW1lID0gKHJhbmdlICogMjU2KSArICctJyArIChyYW5nZSAqIDI1NiArIDI1NSk7XG4gICAgICAgIHZhciB1cmwgPSBnbHlwaFVybChmb250c3RhY2ssIHJhbmdlTmFtZSwgdGhpcy51cmwpO1xuXG4gICAgICAgIGdldEFycmF5QnVmZmVyKHVybCwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICB2YXIgZ2x5cGhzID0gIWVyciAmJiBuZXcgR2x5cGhzKG5ldyBQcm90b2J1ZihuZXcgVWludDhBcnJheShkYXRhKSkpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2FkaW5nW3JhbmdlXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxvYWRpbmdbcmFuZ2VdW2ldKGVyciwgcmFuZ2UsIGdseXBocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgbG9hZGluZ1tyYW5nZV07XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbi8qKlxuICogVXNlIENOQU1FIHNoYXJkaW5nIHRvIGxvYWQgYSBzcGVjaWZpYyBnbHlwaCByYW5nZSBvdmVyIGEgcmFuZG9taXplZFxuICogYnV0IGNvbnNpc3RlbnQgc3ViZG9tYWluLlxuICogQHBhcmFtIHtzdHJpbmd9IGZvbnRzdGFjayBjb21tYS1qb2luZWQgZm9udHNcbiAqIEBwYXJhbSB7c3RyaW5nfSByYW5nZSBjb21tYS1qb2luZWQgcmFuZ2VcbiAqIEBwYXJhbSB7dXJsfSB1cmwgdGVtcGxhdGVkIHVybFxuICogQHBhcmFtIHtzdHJpbmd9IFtzdWJkb21haW5zPWFiY10gc3ViZG9tYWlucyBhcyBhIHN0cmluZyB3aGVyZSBlYWNoIGxldHRlciBpcyBvbmUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBhIHVybCB0byBsb2FkIHRoYXQgc2VjdGlvbiBvZiBnbHlwaHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdseXBoVXJsKGZvbnRzdGFjaywgcmFuZ2UsIHVybCwgc3ViZG9tYWlucykge1xuICAgIHN1YmRvbWFpbnMgPSBzdWJkb21haW5zIHx8ICdhYmMnO1xuXG4gICAgcmV0dXJuIHVybFxuICAgICAgICAucmVwbGFjZSgne3N9Jywgc3ViZG9tYWluc1tmb250c3RhY2subGVuZ3RoICUgc3ViZG9tYWlucy5sZW5ndGhdKVxuICAgICAgICAucmVwbGFjZSgne2ZvbnRzdGFja30nLCBmb250c3RhY2spXG4gICAgICAgIC5yZXBsYWNlKCd7cmFuZ2V9JywgcmFuZ2UpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmZWF0dXJlcywgdGV4dEZlYXR1cmVzLCBnZW9tZXRyaWVzKSB7XG5cbiAgICB2YXIgbGVmdEluZGV4ID0ge30sXG4gICAgICAgIHJpZ2h0SW5kZXggPSB7fSxcbiAgICAgICAgbWVyZ2VkRmVhdHVyZXMgPSBbXSxcbiAgICAgICAgbWVyZ2VkR2VvbSA9IFtdLFxuICAgICAgICBtZXJnZWRUZXh0cyA9IFtdLFxuICAgICAgICBtZXJnZWRJbmRleCA9IDAsXG4gICAgICAgIGs7XG5cbiAgICBmdW5jdGlvbiBhZGQoaykge1xuICAgICAgICBtZXJnZWRGZWF0dXJlcy5wdXNoKGZlYXR1cmVzW2tdKTtcbiAgICAgICAgbWVyZ2VkR2VvbS5wdXNoKGdlb21ldHJpZXNba10pO1xuICAgICAgICBtZXJnZWRUZXh0cy5wdXNoKHRleHRGZWF0dXJlc1trXSk7XG4gICAgICAgIG1lcmdlZEluZGV4Kys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VGcm9tUmlnaHQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pIHtcbiAgICAgICAgdmFyIGkgPSByaWdodEluZGV4W2xlZnRLZXldO1xuICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtsZWZ0S2V5XTtcbiAgICAgICAgcmlnaHRJbmRleFtyaWdodEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEdlb21baV1bMF0ucG9wKCk7XG4gICAgICAgIG1lcmdlZEdlb21baV1bMF0gPSBtZXJnZWRHZW9tW2ldWzBdLmNvbmNhdChnZW9tWzBdKTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VGcm9tTGVmdChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSkge1xuICAgICAgICB2YXIgaSA9IGxlZnRJbmRleFtyaWdodEtleV07XG4gICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbcmlnaHRLZXldO1xuICAgICAgICBsZWZ0SW5kZXhbbGVmdEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEdlb21baV1bMF0uc2hpZnQoKTtcbiAgICAgICAgbWVyZ2VkR2VvbVtpXVswXSA9IGdlb21bMF0uY29uY2F0KG1lcmdlZEdlb21baV1bMF0pO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRLZXkodGV4dCwgZ2VvbSwgb25SaWdodCkge1xuICAgICAgICB2YXIgcG9pbnQgPSBvblJpZ2h0ID8gZ2VvbVswXVtnZW9tWzBdLmxlbmd0aCAtIDFdIDogZ2VvbVswXVswXTtcbiAgICAgICAgcmV0dXJuIHRleHQgKyAnOicgKyBwb2ludC54ICsgJzonICsgcG9pbnQueTtcbiAgICB9XG5cbiAgICBmb3IgKGsgPSAwOyBrIDwgZmVhdHVyZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGdlb20gPSBnZW9tZXRyaWVzW2tdLFxuICAgICAgICAgICAgdGV4dCA9IHRleHRGZWF0dXJlc1trXTtcblxuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIGFkZChrKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxlZnRLZXkgPSBnZXRLZXkodGV4dCwgZ2VvbSksXG4gICAgICAgICAgICByaWdodEtleSA9IGdldEtleSh0ZXh0LCBnZW9tLCB0cnVlKTtcblxuICAgICAgICBpZiAoKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkgJiYgKHJpZ2h0S2V5IGluIGxlZnRJbmRleCkgJiYgKHJpZ2h0SW5kZXhbbGVmdEtleV0gIT09IGxlZnRJbmRleFtyaWdodEtleV0pKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBsaW5lcyB3aXRoIHRoZSBzYW1lIHRleHQgYWRqYWNlbnQgdG8gYm90aCBlbmRzIG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlIGFsbCB0aHJlZVxuICAgICAgICAgICAgdmFyIGogPSBtZXJnZUZyb21MZWZ0KGxlZnRLZXksIHJpZ2h0S2V5LCBnZW9tKTtcbiAgICAgICAgICAgIHZhciBpID0gbWVyZ2VGcm9tUmlnaHQobGVmdEtleSwgcmlnaHRLZXksIG1lcmdlZEdlb21bal0pO1xuXG4gICAgICAgICAgICBkZWxldGUgbGVmdEluZGV4W2xlZnRLZXldO1xuICAgICAgICAgICAgZGVsZXRlIHJpZ2h0SW5kZXhbcmlnaHRLZXldO1xuXG4gICAgICAgICAgICByaWdodEluZGV4W2dldEtleSh0ZXh0LCBtZXJnZWRHZW9tW2ldLCB0cnVlKV0gPSBpO1xuICAgICAgICAgICAgbWVyZ2VkR2VvbVtqXSA9IG51bGw7XG5cbiAgICAgICAgfSBlbHNlIGlmIChsZWZ0S2V5IGluIHJpZ2h0SW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIG1lcmdlYWJsZSBsaW5lIGFkamFjZW50IHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBsaW5lLCBtZXJnZVxuICAgICAgICAgICAgbWVyZ2VGcm9tUmlnaHQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmlnaHRLZXkgaW4gbGVmdEluZGV4KSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBtZXJnZWFibGUgbGluZSBhZGphY2VudCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlXG4gICAgICAgICAgICBtZXJnZUZyb21MZWZ0KGxlZnRLZXksIHJpZ2h0S2V5LCBnZW9tKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8gYWRqYWNlbnQgbGluZXMsIGFkZCBhcyBhIG5ldyBpdGVtXG4gICAgICAgICAgICBhZGQoayk7XG4gICAgICAgICAgICBsZWZ0SW5kZXhbbGVmdEtleV0gPSBtZXJnZWRJbmRleCAtIDE7XG4gICAgICAgICAgICByaWdodEluZGV4W3JpZ2h0S2V5XSA9IG1lcmdlZEluZGV4IC0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGZlYXR1cmVzOiBtZXJnZWRGZWF0dXJlcyxcbiAgICAgICAgdGV4dEZlYXR1cmVzOiBtZXJnZWRUZXh0cyxcbiAgICAgICAgZ2VvbWV0cmllczogbWVyZ2VkR2VvbVxuICAgIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xudmFyIEFuY2hvciA9IHJlcXVpcmUoJy4uL3N5bWJvbC9hbmNob3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZ2V0SWNvblF1YWRzOiBnZXRJY29uUXVhZHMsXG4gICAgZ2V0R2x5cGhRdWFkczogZ2V0R2x5cGhRdWFkc1xufTtcblxudmFyIG1pblNjYWxlID0gMC41OyAvLyB1bmRlcnNjYWxlIGJ5IDEgem9vbSBsZXZlbFxuXG5mdW5jdGlvbiBTeW1ib2xRdWFkKGFuY2hvciwgdGwsIHRyLCBibCwgYnIsIHRleCwgYW5nbGUsIG1pblNjYWxlLCBtYXhTY2FsZSkge1xuICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuICAgIHRoaXMudGwgPSB0bDtcbiAgICB0aGlzLnRyID0gdHI7XG4gICAgdGhpcy5ibCA9IGJsO1xuICAgIHRoaXMuYnIgPSBicjtcbiAgICB0aGlzLnRleCA9IHRleDtcbiAgICB0aGlzLmFuZ2xlID0gYW5nbGU7XG4gICAgdGhpcy5taW5TY2FsZSA9IG1pblNjYWxlO1xuICAgIHRoaXMubWF4U2NhbGUgPSBtYXhTY2FsZTtcbn1cblxuZnVuY3Rpb24gZ2V0SWNvblF1YWRzKGFuY2hvciwgc2hhcGVkSWNvbiwgYm94U2NhbGUsIGxpbmUsIGxheW91dCwgYWxvbmdMaW5lKSB7XG5cbiAgICB2YXIgcmVjdCA9IHNoYXBlZEljb24uaW1hZ2UucmVjdDtcblxuICAgIHZhciBib3JkZXIgPSAxO1xuICAgIHZhciBsZWZ0ID0gc2hhcGVkSWNvbi5sZWZ0IC0gYm9yZGVyO1xuICAgIHZhciByaWdodCA9IGxlZnQgKyByZWN0Lnc7XG4gICAgdmFyIHRvcCA9IHNoYXBlZEljb24udG9wIC0gYm9yZGVyO1xuICAgIHZhciBib3R0b20gPSB0b3AgKyByZWN0Lmg7XG4gICAgdmFyIHRsID0gbmV3IFBvaW50KGxlZnQsIHRvcCk7XG4gICAgdmFyIHRyID0gbmV3IFBvaW50KHJpZ2h0LCB0b3ApO1xuICAgIHZhciBiciA9IG5ldyBQb2ludChyaWdodCwgYm90dG9tKTtcbiAgICB2YXIgYmwgPSBuZXcgUG9pbnQobGVmdCwgYm90dG9tKTtcblxuICAgIHZhciBhbmdsZSA9IGxheW91dFsnaWNvbi1yb3RhdGUnXSAqIE1hdGguUEkgLyAxODA7XG4gICAgaWYgKGFsb25nTGluZSkge1xuICAgICAgICB2YXIgcHJldiA9IGxpbmVbYW5jaG9yLnNlZ21lbnRdO1xuICAgICAgICBhbmdsZSArPSBNYXRoLmF0YW4yKGFuY2hvci55IC0gcHJldi55LCBhbmNob3IueCAtIHByZXYueCk7XG4gICAgfVxuXG4gICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIHZhciBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgdGwgPSB0bC5tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgIHRyID0gdHIubWF0TXVsdChtYXRyaXgpO1xuICAgICAgICBibCA9IGJsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgYnIgPSBici5tYXRNdWx0KG1hdHJpeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtuZXcgU3ltYm9sUXVhZChhbmNob3IsIHRsLCB0ciwgYmwsIGJyLCBzaGFwZWRJY29uLmltYWdlLnJlY3QsIDAsIG1pblNjYWxlLCBJbmZpbml0eSldO1xufVxuXG5mdW5jdGlvbiBnZXRHbHlwaFF1YWRzKGFuY2hvciwgc2hhcGluZywgYm94U2NhbGUsIGxpbmUsIGxheW91dCwgYWxvbmdMaW5lKSB7XG5cbiAgICB2YXIgdGV4dFJvdGF0ZSA9IGxheW91dFsndGV4dC1yb3RhdGUnXSAqIE1hdGguUEkgLyAxODA7XG4gICAgdmFyIGtlZXBVcHJpZ2h0ID0gbGF5b3V0Wyd0ZXh0LWtlZXAtdXByaWdodCddO1xuXG4gICAgdmFyIHBvc2l0aW9uZWRHbHlwaHMgPSBzaGFwaW5nLnBvc2l0aW9uZWRHbHlwaHM7XG4gICAgdmFyIHF1YWRzID0gW107XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIHBvc2l0aW9uZWRHbHlwaCA9IHBvc2l0aW9uZWRHbHlwaHNba107XG4gICAgICAgIHZhciBnbHlwaCA9IHBvc2l0aW9uZWRHbHlwaC5nbHlwaDtcbiAgICAgICAgdmFyIHJlY3QgPSBnbHlwaC5yZWN0O1xuXG4gICAgICAgIGlmICghcmVjdCkgY29udGludWU7XG5cbiAgICAgICAgdmFyIGNlbnRlclggPSAocG9zaXRpb25lZEdseXBoLnggKyBnbHlwaC5hZHZhbmNlIC8gMikgKiBib3hTY2FsZTtcblxuICAgICAgICB2YXIgZ2x5cGhJbnN0YW5jZXM7XG4gICAgICAgIHZhciBsYWJlbE1pblNjYWxlID0gbWluU2NhbGU7XG4gICAgICAgIGlmIChhbG9uZ0xpbmUpIHtcbiAgICAgICAgICAgIGdseXBoSW5zdGFuY2VzID0gW107XG4gICAgICAgICAgICBsYWJlbE1pblNjYWxlID0gZ2V0U2VnbWVudEdseXBocyhnbHlwaEluc3RhbmNlcywgYW5jaG9yLCBjZW50ZXJYLCBsaW5lLCBhbmNob3Iuc2VnbWVudCwgMSk7XG4gICAgICAgICAgICBpZiAoa2VlcFVwcmlnaHQpIHtcbiAgICAgICAgICAgICAgICBsYWJlbE1pblNjYWxlID0gTWF0aC5taW4obGFiZWxNaW5TY2FsZSwgZ2V0U2VnbWVudEdseXBocyhnbHlwaEluc3RhbmNlcywgYW5jaG9yLCBjZW50ZXJYLCBsaW5lLCBhbmNob3Iuc2VnbWVudCwgLTEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2x5cGhJbnN0YW5jZXMgPSBbe1xuICAgICAgICAgICAgICAgIGFuY2hvcjogYW5jaG9yLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgICAgICBhbmdsZTogMCxcbiAgICAgICAgICAgICAgICBtYXhTY2FsZTogSW5maW5pdHksXG4gICAgICAgICAgICAgICAgbWluU2NhbGU6IG1pblNjYWxlXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB4MSA9IHBvc2l0aW9uZWRHbHlwaC54ICsgZ2x5cGgubGVmdCxcbiAgICAgICAgICAgIHkxID0gcG9zaXRpb25lZEdseXBoLnkgLSBnbHlwaC50b3AsXG4gICAgICAgICAgICB4MiA9IHgxICsgcmVjdC53LFxuICAgICAgICAgICAgeTIgPSB5MSArIHJlY3QuaCxcblxuICAgICAgICAgICAgb3RsID0gbmV3IFBvaW50KHgxLCB5MSksXG4gICAgICAgICAgICBvdHIgPSBuZXcgUG9pbnQoeDIsIHkxKSxcbiAgICAgICAgICAgIG9ibCA9IG5ldyBQb2ludCh4MSwgeTIpLFxuICAgICAgICAgICAgb2JyID0gbmV3IFBvaW50KHgyLCB5Mik7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaEluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBnbHlwaEluc3RhbmNlc1tpXSxcbiAgICAgICAgICAgICAgICB0bCA9IG90bCxcbiAgICAgICAgICAgICAgICB0ciA9IG90cixcbiAgICAgICAgICAgICAgICBibCA9IG9ibCxcbiAgICAgICAgICAgICAgICBiciA9IG9icixcbiAgICAgICAgICAgICAgICBhbmdsZSA9IGluc3RhbmNlLmFuZ2xlICsgdGV4dFJvdGF0ZTtcblxuICAgICAgICAgICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgICAgICAgICAgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgICAgICAgICB0bCA9IHRsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICB0ciA9IHRyLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICBibCA9IGJsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICBiciA9IGJyLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJldmVudCBsYWJlbCBmcm9tIGV4dGVuZGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgICAgIHZhciBnbHlwaE1pblNjYWxlID0gTWF0aC5tYXgoaW5zdGFuY2UubWluU2NhbGUsIGxhYmVsTWluU2NhbGUpO1xuXG4gICAgICAgICAgICB2YXIgZ2x5cGhBbmdsZSA9IChhbmNob3IuYW5nbGUgKyB0ZXh0Um90YXRlICsgaW5zdGFuY2Uub2Zmc2V0ICsgMiAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKTtcbiAgICAgICAgICAgIHF1YWRzLnB1c2gobmV3IFN5bWJvbFF1YWQoaW5zdGFuY2UuYW5jaG9yLCB0bCwgdHIsIGJsLCBiciwgcmVjdCwgZ2x5cGhBbmdsZSwgZ2x5cGhNaW5TY2FsZSwgaW5zdGFuY2UubWF4U2NhbGUpKTtcblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1YWRzO1xufVxuXG5mdW5jdGlvbiBnZXRTZWdtZW50R2x5cGhzKGdseXBocywgYW5jaG9yLCBvZmZzZXQsIGxpbmUsIHNlZ21lbnQsIGRpcmVjdGlvbikge1xuICAgIHZhciB1cHNpZGVEb3duID0gZGlyZWN0aW9uIDwgMDtcblxuICAgIGlmIChvZmZzZXQgPCAwKSBkaXJlY3Rpb24gKj0gLTE7XG5cbiAgICBpZiAoZGlyZWN0aW9uID4gMCkgc2VnbWVudCsrO1xuXG4gICAgdmFyIG5ld0FuY2hvciA9IGFuY2hvcjtcbiAgICB2YXIgZW5kID0gbGluZVtzZWdtZW50XTtcbiAgICB2YXIgcHJldlNjYWxlID0gSW5maW5pdHk7XG5cbiAgICBvZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuXG4gICAgdmFyIHBsYWNlbWVudFNjYWxlID0gbWluU2NhbGU7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGlzdGFuY2UgPSBuZXdBbmNob3IuZGlzdChlbmQpO1xuICAgICAgICB2YXIgc2NhbGUgPSBvZmZzZXQgLyBkaXN0YW5jZTtcblxuICAgICAgICAvLyBHZXQgdGhlIGFuZ2xlIG9mIHRoZSBsaW5lIHNlZ21lbnRcbiAgICAgICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihlbmQueSAtIG5ld0FuY2hvci55LCBlbmQueCAtIG5ld0FuY2hvci54KTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA8IDApIGFuZ2xlICs9IE1hdGguUEk7XG4gICAgICAgIGlmICh1cHNpZGVEb3duKSBhbmdsZSArPSBNYXRoLlBJO1xuXG4gICAgICAgIGdseXBocy5wdXNoKHtcbiAgICAgICAgICAgIGFuY2hvcjogbmV3IEFuY2hvcihuZXdBbmNob3IueCwgbmV3QW5jaG9yLnksIGFuY2hvci5hbmdsZSksXG4gICAgICAgICAgICBvZmZzZXQ6IHVwc2lkZURvd24gPyBNYXRoLlBJIDogMCxcbiAgICAgICAgICAgIG1pblNjYWxlOiBzY2FsZSxcbiAgICAgICAgICAgIG1heFNjYWxlOiBwcmV2U2NhbGUsXG4gICAgICAgICAgICBhbmdsZTogKGFuZ2xlICsgMiAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2NhbGUgPD0gcGxhY2VtZW50U2NhbGUpIGJyZWFrO1xuXG4gICAgICAgIG5ld0FuY2hvciA9IGVuZDtcblxuICAgICAgICAvLyBza2lwIGR1cGxpY2F0ZSBub2Rlc1xuICAgICAgICB3aGlsZSAobmV3QW5jaG9yLmVxdWFscyhlbmQpKSB7XG4gICAgICAgICAgICBzZWdtZW50ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgICAgIGVuZCA9IGxpbmVbc2VnbWVudF07XG4gICAgICAgICAgICBpZiAoIWVuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1bml0ID0gZW5kLnN1YihuZXdBbmNob3IpLl91bml0KCk7XG4gICAgICAgIG5ld0FuY2hvciA9IG5ld0FuY2hvci5zdWIodW5pdC5fbXVsdChkaXN0YW5jZSkpO1xuXG4gICAgICAgIHByZXZTY2FsZSA9IHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBwbGFjZW1lbnRTY2FsZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlc29sdmVUb2tlbnMgPSByZXF1aXJlKCcuLi91dGlsL3Rva2VuJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZUljb25zO1xuXG4vLyBGb3IgYW4gYXJyYXkgb2YgZmVhdHVyZXMgZGV0ZXJtaW5lIHdoYXQgaWNvbnMgbmVlZCB0byBiZSBsb2FkZWQuXG5mdW5jdGlvbiByZXNvbHZlSWNvbnMoZmVhdHVyZXMsIGxheW91dFByb3BlcnRpZXMpIHtcbiAgICB2YXIgaWNvbnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBmbCA9IGZlYXR1cmVzLmxlbmd0aDsgaSA8IGZsOyBpKyspIHtcbiAgICAgICAgdmFyIHRleHQgPSByZXNvbHZlVG9rZW5zKGZlYXR1cmVzW2ldLnByb3BlcnRpZXMsIGxheW91dFByb3BlcnRpZXNbJ2ljb24taW1hZ2UnXSk7XG4gICAgICAgIGlmICghdGV4dCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGljb25zLmluZGV4T2YodGV4dCkgPCAwKSB7XG4gICAgICAgICAgICBpY29ucy5wdXNoKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGljb25zO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVzb2x2ZVRva2VucyA9IHJlcXVpcmUoJy4uL3V0aWwvdG9rZW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlVGV4dDtcblxuLyoqXG4gKiBGb3IgYW4gYXJyYXkgb2YgZmVhdHVyZXMgZGV0ZXJtaW5lIHdoYXQgZ2x5cGggcmFuZ2VzIG5lZWQgdG8gYmUgbG9hZGVkXG4gKiBhbmQgYXBwbHkgYW55IHRleHQgcHJlcHJvY2Vzc2luZy4gVGhlIHJlbWFpbmluZyB1c2VycyBvZiB0ZXh0IHNob3VsZFxuICogdXNlIHRoZSBgdGV4dEZlYXR1cmVzYCBrZXkgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmdcbiAqIGZlYXR1cmUgdGV4dCBkaXJlY3RseS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUZXh0KGZlYXR1cmVzLCBsYXlvdXRQcm9wZXJ0aWVzLCBnbHlwaHMpIHtcbiAgICB2YXIgdGV4dEZlYXR1cmVzID0gW107XG4gICAgdmFyIGNvZGVwb2ludHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBmbCA9IGZlYXR1cmVzLmxlbmd0aDsgaSA8IGZsOyBpKyspIHtcbiAgICAgICAgdmFyIHRleHQgPSByZXNvbHZlVG9rZW5zKGZlYXR1cmVzW2ldLnByb3BlcnRpZXMsIGxheW91dFByb3BlcnRpZXNbJ3RleHQtZmllbGQnXSk7XG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgdGV4dEZlYXR1cmVzW2ldID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IGxheW91dFByb3BlcnRpZXNbJ3RleHQtdHJhbnNmb3JtJ107XG4gICAgICAgIGlmICh0cmFuc2Zvcm0gPT09ICd1cHBlcmNhc2UnKSB7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybSA9PT0gJ2xvd2VyY2FzZScpIHtcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBqID0gMCwgamwgPSB0ZXh0Lmxlbmd0aDsgaiA8IGpsOyBqKyspIHtcbiAgICAgICAgICAgIGNvZGVwb2ludHMucHVzaCh0ZXh0LmNoYXJDb2RlQXQoaikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgaW5kZXhlcyBvZiBmZWF0dXJlcyB3aXRoIHRleHQuXG4gICAgICAgIHRleHRGZWF0dXJlc1tpXSA9IHRleHQ7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGEgbGlzdCBvZiB1bmlxdWUgY29kZXBvaW50cyB3ZSBhcmUgbWlzc2luZ1xuICAgIGNvZGVwb2ludHMgPSB1bmlxKGNvZGVwb2ludHMsIGdseXBocyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0RmVhdHVyZXM6IHRleHRGZWF0dXJlcyxcbiAgICAgICAgY29kZXBvaW50czogY29kZXBvaW50c1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHVuaXEoaWRzLCBhbHJlYWR5SGF2ZSkge1xuICAgIHZhciB1ID0gW107XG4gICAgdmFyIGxhc3Q7XG4gICAgaWRzLnNvcnQoc29ydE51bWJlcnMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpZHNbaV0gIT09IGxhc3QpIHtcbiAgICAgICAgICAgIGxhc3QgPSBpZHNbaV07XG4gICAgICAgICAgICBpZiAoIWFscmVhZHlIYXZlW2xhc3RdKSB1LnB1c2goaWRzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdTtcbn1cblxuZnVuY3Rpb24gc29ydE51bWJlcnMoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgc2hhcGVUZXh0OiBzaGFwZVRleHQsXG4gICAgc2hhcGVJY29uOiBzaGFwZUljb25cbn07XG5cblxuLy8gVGhlIHBvc2l0aW9uIG9mIGEgZ2x5cGggcmVsYXRpdmUgdG8gdGhlIHRleHQncyBhbmNob3IgcG9pbnQuXG5mdW5jdGlvbiBQb3NpdGlvbmVkR2x5cGgoY29kZVBvaW50LCB4LCB5LCBnbHlwaCkge1xuICAgIHRoaXMuY29kZVBvaW50ID0gY29kZVBvaW50O1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLmdseXBoID0gZ2x5cGg7XG59XG5cbi8vIEEgY29sbGVjdGlvbiBvZiBwb3NpdGlvbmVkIGdseXBocyBhbmQgc29tZSBtZXRhZGF0YVxuZnVuY3Rpb24gU2hhcGluZyhwb3NpdGlvbmVkR2x5cGhzLCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQpIHtcbiAgICB0aGlzLnBvc2l0aW9uZWRHbHlwaHMgPSBwb3NpdGlvbmVkR2x5cGhzO1xuICAgIHRoaXMudG9wID0gdG9wO1xuICAgIHRoaXMuYm90dG9tID0gYm90dG9tO1xuICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xufVxuXG5mdW5jdGlvbiBzaGFwZVRleHQodGV4dCwgZ2x5cGhzLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBqdXN0aWZ5LCBzcGFjaW5nLCB0cmFuc2xhdGUpIHtcblxuICAgIHZhciBwb3NpdGlvbmVkR2x5cGhzID0gW107XG4gICAgdmFyIHNoYXBpbmcgPSBuZXcgU2hhcGluZyhwb3NpdGlvbmVkR2x5cGhzLCB0cmFuc2xhdGVbMV0sIHRyYW5zbGF0ZVsxXSwgdHJhbnNsYXRlWzBdLCB0cmFuc2xhdGVbMF0pO1xuXG4gICAgLy8gdGhlIHkgb2Zmc2V0ICpzaG91bGQqIGJlIHBhcnQgb2YgdGhlIGZvbnQgbWV0YWRhdGFcbiAgICB2YXIgeU9mZnNldCA9IC0xNztcblxuICAgIHZhciB4ID0gdHJhbnNsYXRlWzBdO1xuICAgIHZhciB5ID0gdHJhbnNsYXRlWzFdICsgeU9mZnNldDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29kZVBvaW50ID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbY29kZVBvaW50XTtcblxuICAgICAgICBpZiAoIWdseXBoKSBjb250aW51ZTtcblxuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzLnB1c2gobmV3IFBvc2l0aW9uZWRHbHlwaChjb2RlUG9pbnQsIHgsIHksIGdseXBoKSk7XG4gICAgICAgIHggKz0gZ2x5cGguYWR2YW5jZSArIHNwYWNpbmc7XG4gICAgfVxuXG4gICAgaWYgKCFwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGluZXdyYXAoc2hhcGluZywgZ2x5cGhzLCBsaW5lSGVpZ2h0LCBtYXhXaWR0aCwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBqdXN0aWZ5KTtcblxuICAgIHJldHVybiBzaGFwaW5nO1xufVxuXG52YXIgYnJlYWthYmxlID0geyAzMjogdHJ1ZSB9OyAvLyBDdXJyZW50bHkgb25seSBicmVha3MgYXQgcmVndWxhciBzcGFjZXNcblxuZnVuY3Rpb24gbGluZXdyYXAoc2hhcGluZywgZ2x5cGhzLCBsaW5lSGVpZ2h0LCBtYXhXaWR0aCwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBqdXN0aWZ5KSB7XG4gICAgdmFyIGxhc3RTYWZlQnJlYWsgPSBudWxsO1xuXG4gICAgdmFyIGxlbmd0aEJlZm9yZUN1cnJlbnRMaW5lID0gMDtcbiAgICB2YXIgbGluZVN0YXJ0SW5kZXggPSAwO1xuICAgIHZhciBsaW5lID0gMDtcblxuICAgIHZhciBtYXhMaW5lTGVuZ3RoID0gMDtcblxuICAgIHZhciBwb3NpdGlvbmVkR2x5cGhzID0gc2hhcGluZy5wb3NpdGlvbmVkR2x5cGhzO1xuXG4gICAgaWYgKG1heFdpZHRoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zaXRpb25lZEdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uZWRHbHlwaCA9IHBvc2l0aW9uZWRHbHlwaHNbaV07XG5cbiAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaC54IC09IGxlbmd0aEJlZm9yZUN1cnJlbnRMaW5lO1xuICAgICAgICAgICAgcG9zaXRpb25lZEdseXBoLnkgKz0gbGluZUhlaWdodCAqIGxpbmU7XG5cbiAgICAgICAgICAgIGlmIChwb3NpdGlvbmVkR2x5cGgueCA+IG1heFdpZHRoICYmIGxhc3RTYWZlQnJlYWsgIT09IG51bGwpIHtcblxuICAgICAgICAgICAgICAgIHZhciBsaW5lTGVuZ3RoID0gcG9zaXRpb25lZEdseXBoc1tsYXN0U2FmZUJyZWFrICsgMV0ueDtcbiAgICAgICAgICAgICAgICBtYXhMaW5lTGVuZ3RoID0gTWF0aC5tYXgobGluZUxlbmd0aCwgbWF4TGluZUxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gbGFzdFNhZmVCcmVhayArIDE7IGsgPD0gaTsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaHNba10ueSArPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2tdLnggLT0gbGluZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoanVzdGlmeSkge1xuICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzLCBnbHlwaHMsIGxpbmVTdGFydEluZGV4LCBsYXN0U2FmZUJyZWFrIC0gMSwganVzdGlmeSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGluZVN0YXJ0SW5kZXggPSBsYXN0U2FmZUJyZWFrICsgMTtcbiAgICAgICAgICAgICAgICBsYXN0U2FmZUJyZWFrID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZW5ndGhCZWZvcmVDdXJyZW50TGluZSArPSBsaW5lTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxpbmUrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGJyZWFrYWJsZVtwb3NpdGlvbmVkR2x5cGguY29kZVBvaW50XSkge1xuICAgICAgICAgICAgICAgIGxhc3RTYWZlQnJlYWsgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhc3RQb3NpdGlvbmVkR2x5cGggPSBwb3NpdGlvbmVkR2x5cGhzW3Bvc2l0aW9uZWRHbHlwaHMubGVuZ3RoIC0gMV07XG4gICAgdmFyIGxhc3RMaW5lTGVuZ3RoID0gbGFzdFBvc2l0aW9uZWRHbHlwaC54ICsgZ2x5cGhzW2xhc3RQb3NpdGlvbmVkR2x5cGguY29kZVBvaW50XS5hZHZhbmNlO1xuICAgIG1heExpbmVMZW5ndGggPSBNYXRoLm1heChtYXhMaW5lTGVuZ3RoLCBsYXN0TGluZUxlbmd0aCk7XG5cbiAgICB2YXIgaGVpZ2h0ID0gKGxpbmUgKyAxKSAqIGxpbmVIZWlnaHQ7XG5cbiAgICBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzLCBnbHlwaHMsIGxpbmVTdGFydEluZGV4LCBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aCAtIDEsIGp1c3RpZnkpO1xuICAgIGFsaWduKHBvc2l0aW9uZWRHbHlwaHMsIGp1c3RpZnksIGhvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbiwgbWF4TGluZUxlbmd0aCwgbGluZUhlaWdodCwgbGluZSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGJvdW5kaW5nIGJveFxuICAgIHNoYXBpbmcudG9wICs9IC12ZXJ0aWNhbEFsaWduICogaGVpZ2h0O1xuICAgIHNoYXBpbmcuYm90dG9tID0gc2hhcGluZy50b3AgKyBoZWlnaHQ7XG4gICAgc2hhcGluZy5sZWZ0ICs9IC1ob3Jpem9udGFsQWxpZ24gKiBtYXhMaW5lTGVuZ3RoO1xuICAgIHNoYXBpbmcucmlnaHQgPSBzaGFwaW5nLmxlZnQgKyBtYXhMaW5lTGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzLCBnbHlwaHMsIHN0YXJ0LCBlbmQsIGp1c3RpZnkpIHtcbiAgICB2YXIgbGFzdEFkdmFuY2UgPSBnbHlwaHNbcG9zaXRpb25lZEdseXBoc1tlbmRdLmNvZGVQb2ludF0uYWR2YW5jZTtcbiAgICB2YXIgbGluZUluZGVudCA9IChwb3NpdGlvbmVkR2x5cGhzW2VuZF0ueCArIGxhc3RBZHZhbmNlKSAqIGp1c3RpZnk7XG5cbiAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPD0gZW5kOyBqKyspIHtcbiAgICAgICAgcG9zaXRpb25lZEdseXBoc1tqXS54IC09IGxpbmVJbmRlbnQ7XG4gICAgfVxuXG59XG5cbmZ1bmN0aW9uIGFsaWduKHBvc2l0aW9uZWRHbHlwaHMsIGp1c3RpZnksIGhvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbiwgbWF4TGluZUxlbmd0aCwgbGluZUhlaWdodCwgbGluZSkge1xuICAgIHZhciBzaGlmdFggPSAoanVzdGlmeSAtIGhvcml6b250YWxBbGlnbikgKiBtYXhMaW5lTGVuZ3RoO1xuICAgIHZhciBzaGlmdFkgPSAoLXZlcnRpY2FsQWxpZ24gKiAobGluZSArIDEpICsgMC41KSAqIGxpbmVIZWlnaHQ7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgcG9zaXRpb25lZEdseXBoc1tqXS54ICs9IHNoaWZ0WDtcbiAgICAgICAgcG9zaXRpb25lZEdseXBoc1tqXS55ICs9IHNoaWZ0WTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gc2hhcGVJY29uKGltYWdlLCBsYXlvdXQpIHtcbiAgICBpZiAoIWltYWdlIHx8ICFpbWFnZS5yZWN0KSByZXR1cm4gbnVsbDtcblxuICAgIHZhciBkeCA9IGxheW91dFsnaWNvbi1vZmZzZXQnXVswXTtcbiAgICB2YXIgZHkgPSBsYXlvdXRbJ2ljb24tb2Zmc2V0J11bMV07XG4gICAgdmFyIHgxID0gZHggLSBpbWFnZS53aWR0aCAvIDI7XG4gICAgdmFyIHgyID0geDEgKyBpbWFnZS53aWR0aDtcbiAgICB2YXIgeTEgPSBkeSAtIGltYWdlLmhlaWdodCAvIDI7XG4gICAgdmFyIHkyID0geTEgKyBpbWFnZS5oZWlnaHQ7XG5cbiAgICByZXR1cm4gbmV3IFBvc2l0aW9uZWRJY29uKGltYWdlLCB5MSwgeTIsIHgxLCB4Mik7XG59XG5cbmZ1bmN0aW9uIFBvc2l0aW9uZWRJY29uKGltYWdlLCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQpIHtcbiAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgdGhpcy50b3AgPSB0b3A7XG4gICAgdGhpcy5ib3R0b20gPSBib3R0b207XG4gICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBCaW5QYWNrID0gcmVxdWlyZSgnLi9iaW5fcGFjaycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNwcml0ZUF0bGFzO1xuZnVuY3Rpb24gU3ByaXRlQXRsYXMod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuICAgIHRoaXMuYmluID0gbmV3IEJpblBhY2sod2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5pbWFnZXMgPSB7fTtcbiAgICB0aGlzLmRhdGEgPSBmYWxzZTtcbiAgICB0aGlzLnRleHR1cmUgPSAwOyAvLyBXZWJHTCBJRFxuICAgIHRoaXMuZmlsdGVyID0gMDsgLy8gV2ViR0wgSURcbiAgICB0aGlzLnBpeGVsUmF0aW8gPSAxO1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xufVxuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IGRlYnVnKCkge1xuICAgICAgICByZXR1cm4gJ2NhbnZhcycgaW4gdGhpcztcbiAgICB9LFxuICAgIHNldCBkZWJ1Zyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgIXRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLndpZHRoICogdGhpcy5waXhlbFJhdGlvO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKiB0aGlzLnBpeGVsUmF0aW87XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiB0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jdHg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYW52YXM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24obmV3UmF0aW8pIHtcbiAgICBpZiAodGhpcy5waXhlbFJhdGlvID09PSBuZXdSYXRpbykgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIG9sZFJhdGlvID0gdGhpcy5waXhlbFJhdGlvO1xuICAgIHRoaXMucGl4ZWxSYXRpbyA9IG5ld1JhdGlvO1xuXG4gICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy53aWR0aCAqIHRoaXMucGl4ZWxSYXRpbztcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKiB0aGlzLnBpeGVsUmF0aW87XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICB2YXIgb2xkRGF0YSA9IHRoaXMuZGF0YTtcblxuICAgICAgICB0aGlzLmRhdGEgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgpO1xuICAgICAgICB0aGlzLnRleHR1cmUgPSBmYWxzZTtcblxuICAgICAgICB2YXIgb2xkV2lkdGggPSB0aGlzLndpZHRoICogb2xkUmF0aW87XG4gICAgICAgIHZhciBvbGRIZWlnaHQgPSB0aGlzLmhlaWdodCAqIG9sZFJhdGlvO1xuICAgICAgICB2YXIgbmV3V2lkdGggPSB0aGlzLndpZHRoICogbmV3UmF0aW87XG4gICAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCAqIG5ld1JhdGlvO1xuXG4gICAgICAgIC8vIEJhc2ljIGltYWdlIHNjYWxpbmcuIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIGJldHRlciBpbWFnZSBzY2FsaW5nLlxuICAgICAgICB2YXIgbmV3SW1hZ2UgPSB0aGlzLmRhdGE7XG4gICAgICAgIHZhciBvbGRJbWFnZSA9IG9sZERhdGE7XG5cbiAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBuZXdIZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgdmFyIG9sZFlPZmZzZXQgPSBNYXRoLmZsb29yKCh5ICogb2xkSGVpZ2h0KSAvIG5ld0hlaWdodCkgKiBvbGRXaWR0aDtcbiAgICAgICAgICAgIHZhciBuZXdZT2Zmc2V0ID0geSAqIG5ld1dpZHRoO1xuICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBuZXdXaWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9sZFggPSBNYXRoLmZsb29yKCh4ICogb2xkV2lkdGgpIC8gbmV3V2lkdGgpO1xuICAgICAgICAgICAgICAgIG5ld0ltYWdlW25ld1lPZmZzZXQgKyB4XSA9IG9sZEltYWdlW29sZFlPZmZzZXQgKyBvbGRYXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9sZERhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kaXJ0eTtcbn07XG5cbmZ1bmN0aW9uIGNvcHlCaXRtYXAoc3JjLCBzcmNTdHJpZGUsIHNyY1gsIHNyY1ksIGRzdCwgZHN0U3RyaWRlLCBkc3RYLCBkc3RZLCB3aWR0aCwgaGVpZ2h0LCB3cmFwKSB7XG4gICAgdmFyIHNyY0kgPSBzcmNZICogc3JjU3RyaWRlICsgc3JjWDtcbiAgICB2YXIgZHN0SSA9IGRzdFkgKiBkc3RTdHJpZGUgKyBkc3RYO1xuICAgIHZhciB4LCB5O1xuXG4gICAgaWYgKHdyYXApIHtcbiAgICAgICAgLy8gYWRkIDEgcGl4ZWwgd3JhcHBlZCBwYWRkaW5nIG9uIGVhY2ggc2lkZSBvZiB0aGUgaW1hZ2VcbiAgICAgICAgZHN0SSAtPSBkc3RTdHJpZGU7XG4gICAgICAgIGZvciAoeSA9IC0xOyB5IDw9IGhlaWdodDsgeSsrLCBzcmNJID0gKCh5ICsgaGVpZ2h0KSAlIGhlaWdodCArIHNyY1kpICogc3JjU3RyaWRlICsgc3JjWCwgZHN0SSArPSBkc3RTdHJpZGUpIHtcbiAgICAgICAgICAgIGZvciAoeCA9IC0xOyB4IDw9IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBkc3RbZHN0SSArIHhdID0gc3JjW3NyY0kgKyAoKHggKyB3aWR0aCkgJSB3aWR0aCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyssIHNyY0kgKz0gc3JjU3RyaWRlLCBkc3RJICs9IGRzdFN0cmlkZSkge1xuICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBkc3RbZHN0SSArIHhdID0gc3JjW3NyY0kgKyB4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuU3ByaXRlQXRsYXMucHJvdG90eXBlLmFsbG9jYXRlSW1hZ2UgPSBmdW5jdGlvbihwaXhlbFdpZHRoLCBwaXhlbEhlaWdodCkge1xuXG4gICAgLy8gSW5jcmVhc2UgdG8gbmV4dCBudW1iZXIgZGl2aXNpYmxlIGJ5IDQsIGJ1dCBhdCBsZWFzdCAxLlxuICAgIC8vIFRoaXMgaXMgc28gd2UgY2FuIHNjYWxlIGRvd24gdGhlIHRleHR1cmUgY29vcmRpbmF0ZXMgYW5kIHBhY2sgdGhlbVxuICAgIC8vIGludG8gMiBieXRlcyByYXRoZXIgdGhhbiA0IGJ5dGVzLlxuICAgIC8vIFBhZCBpY29ucyB0byBwcmV2ZW50IHRoZW0gZnJvbSBwb2xsdXRpbmcgbmVpZ2hib3VycyBkdXJpbmcgbGluZWFyIGludGVycG9sYXRpb25cbiAgICB2YXIgcGFkZGluZyA9IDI7XG4gICAgdmFyIHBhY2tXaWR0aCA9IHBpeGVsV2lkdGggKyBwYWRkaW5nICsgKDQgLSAocGl4ZWxXaWR0aCArIHBhZGRpbmcpICUgNCk7XG4gICAgdmFyIHBhY2tIZWlnaHQgPSBwaXhlbEhlaWdodCArIHBhZGRpbmcgKyAoNCAtIChwaXhlbEhlaWdodCArIHBhZGRpbmcpICUgNCk7Ly8gKyA0O1xuXG4gICAgLy8gV2UgaGF2ZSB0byBhbGxvY2F0ZSBhIG5ldyBhcmVhIGluIHRoZSBiaW4sIGFuZCBzdG9yZSBhbiBlbXB0eSBpbWFnZSBpbiBpdC5cbiAgICAvLyBBZGQgYSAxcHggYm9yZGVyIGFyb3VuZCBldmVyeSBpbWFnZS5cbiAgICB2YXIgcmVjdCA9IHRoaXMuYmluLmFsbG9jYXRlKHBhY2tXaWR0aCwgcGFja0hlaWdodCk7XG4gICAgaWYgKHJlY3QudyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG5cbiAgICByZWN0Lm9yaWdpbmFsV2lkdGggPSBwaXhlbFdpZHRoO1xuICAgIHJlY3Qub3JpZ2luYWxIZWlnaHQgPSBwaXhlbEhlaWdodDtcblxuICAgIHJldHVybiByZWN0O1xufTtcblxuU3ByaXRlQXRsYXMucHJvdG90eXBlLmdldEltYWdlID0gZnVuY3Rpb24obmFtZSwgd3JhcCkge1xuICAgIGlmICh0aGlzLmltYWdlc1tuYW1lXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbbmFtZV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNwcml0ZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgcG9zID0gdGhpcy5zcHJpdGUuZ2V0U3ByaXRlUG9zaXRpb24obmFtZSk7XG4gICAgaWYgKCFwb3Mud2lkdGggfHwgIXBvcy5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHdpZHRoID0gcG9zLndpZHRoIC8gcG9zLnBpeGVsUmF0aW87XG4gICAgdmFyIGhlaWdodCA9IHBvcy5oZWlnaHQgLyBwb3MucGl4ZWxSYXRpbztcbiAgICB2YXIgcmVjdCA9IHRoaXMuYWxsb2NhdGVJbWFnZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAocmVjdC53ID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cblxuICAgIHZhciBpbWFnZSA9IG5ldyBBdGxhc0ltYWdlKHJlY3QsIHdpZHRoLCBoZWlnaHQsIHBvcy5zZGYpO1xuICAgIHRoaXMuaW1hZ2VzW25hbWVdID0gaW1hZ2U7XG5cbiAgICB0aGlzLmNvcHkocmVjdCwgcG9zLCB3cmFwKTtcblxuICAgIHJldHVybiBpbWFnZTtcbn07XG5cblxuU3ByaXRlQXRsYXMucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24obmFtZSwgcmVwZWF0aW5nKSB7XG4gICAgdmFyIGltYWdlID0gdGhpcy5nZXRJbWFnZShuYW1lLCByZXBlYXRpbmcpO1xuICAgIHZhciByZWN0ID0gaW1hZ2UgJiYgaW1hZ2UucmVjdDtcblxuICAgIGlmICghcmVjdCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBXaGVuIHRoZSBpbWFnZSBpcyByZXBlYXRpbmcsIGdldCB0aGUgY29ycmVjdCBwb3NpdGlvbiBvZiB0aGUgaW1hZ2UsIHJhdGhlciB0aGFuIHRoZVxuICAgIC8vIG9uZSByb3VuZGVkIHVwIHRvIDQgcGl4ZWxzLlxuICAgIHZhciB3aWR0aCA9IHJlcGVhdGluZyA/IGltYWdlLndpZHRoIDogcmVjdC53O1xuICAgIHZhciBoZWlnaHQgPSByZXBlYXRpbmcgPyBpbWFnZS5oZWlnaHQgOiByZWN0Lmg7XG4gICAgdmFyIHBhZGRpbmcgPSAxO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2l6ZTogW3dpZHRoLCBoZWlnaHRdLFxuICAgICAgICB0bDogWyhyZWN0LnggKyBwYWRkaW5nKSAgICAgICAgIC8gdGhpcy53aWR0aCwgKHJlY3QueSArIHBhZGRpbmcpICAgICAgICAgIC8gdGhpcy5oZWlnaHRdLFxuICAgICAgICBicjogWyhyZWN0LnggKyBwYWRkaW5nICsgd2lkdGgpIC8gdGhpcy53aWR0aCwgKHJlY3QueSArIHBhZGRpbmcgKyBoZWlnaHQpIC8gdGhpcy5oZWlnaHRdXG4gICAgfTtcbn07XG5cblxuU3ByaXRlQXRsYXMucHJvdG90eXBlLmFsbG9jYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHtcbiAgICAgICAgdmFyIHcgPSBNYXRoLmZsb29yKHRoaXMud2lkdGggKiB0aGlzLnBpeGVsUmF0aW8pO1xuICAgICAgICB2YXIgaCA9IE1hdGguZmxvb3IodGhpcy5oZWlnaHQgKiB0aGlzLnBpeGVsUmF0aW8pO1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDMyQXJyYXkodyAqIGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2ldID0gMDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cblxuU3ByaXRlQXRsYXMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbihkc3QsIHNyYywgd3JhcCkge1xuICAgIC8vIGlmICghc3ByaXRlLT5yYXN0ZXIpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuc3ByaXRlLmltZy5kYXRhKSByZXR1cm47XG4gICAgdmFyIHNyY0ltZyA9IG5ldyBVaW50MzJBcnJheSh0aGlzLnNwcml0ZS5pbWcuZGF0YS5idWZmZXIpO1xuXG4gICAgdGhpcy5hbGxvY2F0ZSgpO1xuICAgIHZhciBkc3RJbWcgPSB0aGlzLmRhdGE7XG5cbiAgICB2YXIgcGFkZGluZyA9IDE7XG5cbiAgICBjb3B5Qml0bWFwKFxuICAgICAgICAvKiBzb3VyY2UgYnVmZmVyICovICBzcmNJbWcsXG4gICAgICAgIC8qIHNvdXJjZSBzdHJpZGUgKi8gIHRoaXMuc3ByaXRlLmltZy53aWR0aCxcbiAgICAgICAgLyogc291cmNlIHggKi8gICAgICAgc3JjLngsXG4gICAgICAgIC8qIHNvdXJjZSB5ICovICAgICAgIHNyYy55LFxuICAgICAgICAvKiBkZXN0IGJ1ZmZlciAqLyAgICBkc3RJbWcsXG4gICAgICAgIC8qIGRlc3Qgc3RyaWRlICovICAgIHRoaXMud2lkdGggKiB0aGlzLnBpeGVsUmF0aW8sXG4gICAgICAgIC8qIGRlc3QgeCAqLyAgICAgICAgIChkc3QueCArIHBhZGRpbmcpICogdGhpcy5waXhlbFJhdGlvLFxuICAgICAgICAvKiBkZXN0IHkgKi8gICAgICAgICAoZHN0LnkgKyBwYWRkaW5nKSAqIHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgICAgLyogaWNvbiBkaW1lbnNpb24gKi8gc3JjLndpZHRoLFxuICAgICAgICAvKiBpY29uIGRpbWVuc2lvbiAqLyBzcmMuaGVpZ2h0LFxuICAgICAgICAvKiB3cmFwICovIHdyYXBcbiAgICApO1xuXG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG59O1xuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuc2V0U3ByaXRlID0gZnVuY3Rpb24oc3ByaXRlKSB7XG4gICAgdGhpcy5zcHJpdGUgPSBzcHJpdGU7XG59O1xuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuYWRkSWNvbnMgPSBmdW5jdGlvbihpY29ucywgY2FsbGJhY2spIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGljb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZ2V0SW1hZ2UoaWNvbnNbaV0pO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHRoaXMuaW1hZ2VzKTtcbn07XG5cblNwcml0ZUF0bGFzLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oZ2wsIGxpbmVhcikge1xuICAgIHZhciBmaXJzdCA9IGZhbHNlO1xuICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICBmaXJzdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICB9XG5cbiAgICB2YXIgZmlsdGVyVmFsID0gbGluZWFyID8gZ2wuTElORUFSIDogZ2wuTkVBUkVTVDtcbiAgICBpZiAoZmlsdGVyVmFsICE9PSB0aGlzLmZpbHRlcikge1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZmlsdGVyVmFsKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlclZhbCk7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyVmFsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoKTtcblxuICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCwgLy8gZW51bSB0YXJnZXRcbiAgICAgICAgICAgICAgICAwLCAvLyBpbmQgbGV2ZWxcbiAgICAgICAgICAgICAgICBnbC5SR0JBLCAvLyBpbmQgaW50ZXJuYWxmb3JtYXRcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoICogdGhpcy5waXhlbFJhdGlvLCAvLyBHTHNpemVpIHdpZHRoXG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgKiB0aGlzLnBpeGVsUmF0aW8sIC8vIEdMc2l6ZWkgaGVpZ2h0XG4gICAgICAgICAgICAgICAgMCwgLy8gaW5kIGJvcmRlclxuICAgICAgICAgICAgICAgIGdsLlJHQkEsIC8vIGVudW0gZm9ybWF0XG4gICAgICAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSwgLy8gZW51bSB0eXBlXG4gICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlcikgLy8gT2JqZWN0IGRhdGFcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKFxuICAgICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsIC8vIGVudW0gdGFyZ2V0XG4gICAgICAgICAgICAgICAgMCwgLy8gaW50IGxldmVsXG4gICAgICAgICAgICAgICAgMCwgLy8gaW50IHhvZmZzZXRcbiAgICAgICAgICAgICAgICAwLCAvLyBpbnQgeW9mZnNldFxuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggKiB0aGlzLnBpeGVsUmF0aW8sIC8vIGxvbmcgd2lkdGhcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbywgLy8gbG9uZyBoZWlnaHRcbiAgICAgICAgICAgICAgICBnbC5SR0JBLCAvLyBlbnVtIGZvcm1hdFxuICAgICAgICAgICAgICAgIGdsLlVOU0lHTkVEX0JZVEUsIC8vIGVudW0gdHlwZVxuICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YS5idWZmZXIpIC8vIE9iamVjdCBwaXhlbHNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgaWYgKHRoaXMuY3R4KSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLndpZHRoICogdGhpcy5waXhlbFJhdGlvLCB0aGlzLmhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbyk7XG4gICAgICAgICAgICBkYXRhLmRhdGEuc2V0KG5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5wdXRJbWFnZURhdGEoZGF0YSwgMCwgMCk7XG5cbiAgICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gJ3JlZCc7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMuYmluLmZyZWUubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJlZSA9IHRoaXMuYmluLmZyZWVba107XG4gICAgICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlUmVjdChmcmVlLnggKiB0aGlzLnBpeGVsUmF0aW8sIGZyZWUueSAqIHRoaXMucGl4ZWxSYXRpbywgZnJlZS53ICogdGhpcy5waXhlbFJhdGlvLCBmcmVlLmggKiB0aGlzLnBpeGVsUmF0aW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVORCBERUJVR1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIEF0bGFzSW1hZ2UocmVjdCwgd2lkdGgsIGhlaWdodCwgc2RmKSB7XG4gICAgdGhpcy5yZWN0ID0gcmVjdDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5zZGYgPSBzZGY7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgaW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuLi91dGlsL2ludGVycG9sYXRlJyk7XG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xudmFyIExhdExuZyA9IHJlcXVpcmUoJy4uL2dlby9sYXRfbG5nJyk7XG52YXIgTGF0TG5nQm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvL2xhdF9sbmdfYm91bmRzJyk7XG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENhbWVyYU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QXJyYXl9IFtjZW50ZXJdIExhdGl0dWRlIGFuZCBsb25naXR1ZGUgKHBhc3NlZCBhcyBgW2xhdCwgbG5nXWApXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3pvb21dIE1hcCB6b29tIGxldmVsXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2JlYXJpbmddIE1hcCByb3RhdGlvbiBiZWFyaW5nIGluIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UgZnJvbSBub3J0aFxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwaXRjaF0gVGhlIGFuZ2xlIGF0IHdoaWNoIHRoZSBjYW1lcmEgaXMgbG9va2luZyBhdCB0aGUgZ3JvdW5kXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBbQW5pbWF0aW9uT3B0aW9uc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZHVyYXRpb249NTAwXSBOdW1iZXIgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBbZWFzaW5nXVxuICogQHByb3BlcnR5IHtBcnJheX0gW29mZnNldD1bMCwwXV0gcG9pbnQsIG9yaWdpbiBvZiBtb3ZlbWVudCByZWxhdGl2ZSB0byBtYXAgY2VudGVyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbmltYXRlPXRydWVdIFdoZW4gc2V0IHRvIGZhbHNlLCBubyBhbmltYXRpb24gaGFwcGVuc1xuICovXG5cbnZhciBDYW1lcmEgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge307XG5cbnV0aWwuZXh0ZW5kKENhbWVyYS5wcm90b3R5cGUsIC8qKiBAbGVuZHMgTWFwLnByb3RvdHlwZSAqL3tcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgdmlldyBnZW9ncmFwaGljYWwgcG9pbnQuXG4gICAgICogQHJldHVybnMge0xhdExuZ31cbiAgICAgKi9cbiAgICBnZXRDZW50ZXI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0uY2VudGVyOyB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIG1hcCBsb2NhdGlvbi4gRXF1aXZhbGVudCB0byBganVtcFRvKHtjZW50ZXI6IGNlbnRlcn0pYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGNlbnRlciBMYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIChwYXNzZWQgYXMgYFtsYXQsIGxuZ11gKVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldENlbnRlcihbLTc0LCAzOF0pO1xuICAgICAqL1xuICAgIHNldENlbnRlcjogZnVuY3Rpb24oY2VudGVyKSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHtjZW50ZXI6IGNlbnRlcn0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYW4gYnkgYSBjZXJ0YWluIG51bWJlciBvZiBwaXhlbHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG9mZnNldCBbeCwgeV1cbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9XG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgcGFuQnk6IGZ1bmN0aW9uKG9mZnNldCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnBhblRvKHRoaXMudHJhbnNmb3JtLmNlbnRlciwgdXRpbC5leHRlbmQoe29mZnNldDogUG9pbnQuY29udmVydChvZmZzZXQpLm11bHQoLTEpfSwgb3B0aW9ucykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFuIHRvIGEgY2VydGFpbiBsb2NhdGlvbiB3aXRoIGVhc2luZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxhdGxuZyBhIGBMYXRMbmdgIG9iamVjdFxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9uc31cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBwYW5UbzogZnVuY3Rpb24obGF0bG5nLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIGxhdGxuZyA9IExhdExuZy5jb252ZXJ0KGxhdGxuZyk7XG5cbiAgICAgICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICBlYXNpbmc6IHV0aWwuZWFzZSxcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgb2Zmc2V0ID0gUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCkucm90YXRlKC10ci5hbmdsZSksXG4gICAgICAgICAgICBmcm9tID0gdHIucG9pbnQsXG4gICAgICAgICAgICB0byA9IHRyLnByb2plY3QobGF0bG5nKS5zdWIob2Zmc2V0KTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubm9Nb3ZlU3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lYXNlKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgIHRyLmNlbnRlciA9IHRyLnVucHJvamVjdChmcm9tLmFkZCh0by5zdWIoZnJvbSkubXVsdChrKSkpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlJyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlZW5kJyk7XG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCB6b29tXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRab29tOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnpvb207IH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbWFwIHpvb20uIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7em9vbTogem9vbX0pYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6b29tIE1hcCB6b29tIGxldmVsXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyB6b29tIHRoZSBtYXAgdG8gNVxuICAgICAqIG1hcC5zZXRab29tKDUpO1xuICAgICAqL1xuICAgIHNldFpvb206IGZ1bmN0aW9uKHpvb20pIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe3pvb206IHpvb219KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogWm9vbXMgdG8gYSBjZXJ0YWluIHpvb20gbGV2ZWwgd2l0aCBlYXNpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gem9vbVxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9uc31cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICB6b29tVG86IGZ1bmN0aW9uKHpvb20sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiA1MDBcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgb3B0aW9ucy5lYXNpbmcgPSB0aGlzLl91cGRhdGVFYXNpbmcob3B0aW9ucy5kdXJhdGlvbiwgem9vbSwgb3B0aW9ucy5lYXNpbmcpO1xuXG4gICAgICAgIHZhciB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgYXJvdW5kID0gdHIuY2VudGVyLFxuICAgICAgICAgICAgc3RhcnRab29tID0gdHIuem9vbTtcblxuICAgICAgICBpZiAob3B0aW9ucy5hcm91bmQpIHtcbiAgICAgICAgICAgIGFyb3VuZCA9IExhdExuZy5jb252ZXJ0KG9wdGlvbnMuYXJvdW5kKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm9mZnNldCkge1xuICAgICAgICAgICAgYXJvdW5kID0gdHIucG9pbnRMb2NhdGlvbih0ci5jZW50ZXJQb2ludC5hZGQoUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlKSBvcHRpb25zLmR1cmF0aW9uID0gMDtcblxuICAgICAgICBpZiAoIXRoaXMuem9vbWluZykge1xuICAgICAgICAgICAgdGhpcy56b29taW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lYXNlKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgIHRyLnNldFpvb21Bcm91bmQoaW50ZXJwb2xhdGUoc3RhcnRab29tLCB6b29tLCBrKSwgYXJvdW5kKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbW92ZScpLmZpcmUoJ3pvb20nKTtcbiAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmVhc2UgPSBudWxsO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZHVyYXRpb24gPj0gMjAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy56b29taW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlZW5kJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmR1cmF0aW9uIDwgMjAwKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fb25ab29tRW5kKTtcbiAgICAgICAgICAgIHRoaXMuX29uWm9vbUVuZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhpcy56b29taW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlZW5kJyk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyksIDIwMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogWm9vbSBpbiBieSAxIGxldmVsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9XG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgem9vbUluOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpICsgMSwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFpvb20gb3V0IGJ5IDEgbGV2ZWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9uc31cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICB6b29tT3V0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpIC0gMSwgb3B0aW9ucyk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGJlYXJpbmcgaW4gZGVncmVlc1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0QmVhcmluZzogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5iZWFyaW5nOyB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIG1hcCByb3RhdGlvbi4gRXF1aXZhbGVudCB0byBganVtcFRvKHtiZWFyaW5nOiBiZWFyaW5nfSlgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgTWFwIHJvdGF0aW9uIGJlYXJpbmcgaW4gZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIG5vcnRoXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyByb3RhdGUgdGhlIG1hcCB0byA5MCBkZWdyZWVzXG4gICAgICogbWFwLnNldEJlYXJpbmcoOTApO1xuICAgICAqL1xuICAgIHNldEJlYXJpbmc6IGZ1bmN0aW9uKGJlYXJpbmcpIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe2JlYXJpbmc6IGJlYXJpbmd9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIGJlYXJpbmcgYnkgYSBjZXJ0YWluIG51bWJlciBvZiBkZWdyZWVzIHdpdGggZWFzaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYmVhcmluZ1xuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9uc31cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICByb3RhdGVUbzogZnVuY3Rpb24oYmVhcmluZywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgICBvcHRpb25zID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgICAgICAgIGVhc2luZzogdXRpbC5lYXNlXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgc3RhcnQgPSB0aGlzLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIGFyb3VuZCA9IHRyLmNlbnRlcjtcblxuICAgICAgICBpZiAob3B0aW9ucy5hcm91bmQpIHtcbiAgICAgICAgICAgIGFyb3VuZCA9IExhdExuZy5jb252ZXJ0KG9wdGlvbnMuYXJvdW5kKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm9mZnNldCkge1xuICAgICAgICAgICAgYXJvdW5kID0gdHIucG9pbnRMb2NhdGlvbih0ci5jZW50ZXJQb2ludC5hZGQoUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJlYXJpbmcgPSB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKGJlYXJpbmcsIHN0YXJ0KTtcblxuICAgICAgICB0aGlzLnJvdGF0aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5maXJlKCdtb3Zlc3RhcnQnKTtcblxuICAgICAgICB0aGlzLl9lYXNlKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgIHRyLnNldEJlYXJpbmdBcm91bmQoaW50ZXJwb2xhdGUoc3RhcnQsIGJlYXJpbmcsIGspLCBhcm91bmQpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlJykuZmlyZSgncm90YXRlJyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5yb3RhdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlZW5kJyk7XG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG1hcCBiZWFyaW5nIHRvIDAgKG5vcnRoKSB3aXRoIGVhc2luZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zfVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIHJlc2V0Tm9ydGg6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm90YXRlVG8oMCwgdXRpbC5leHRlbmQoe2R1cmF0aW9uOiAxMDAwfSwgb3B0aW9ucykpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBhbmdsZSBpbiBkZWdyZWVzXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRQaXRjaDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5waXRjaDsgfSxcblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBtYXAgYW5nbGUuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7cGl0Y2g6IHBpdGNofSlgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBpdGNoIFRoZSBhbmdsZSBhdCB3aGljaCB0aGUgY2FtZXJhIGlzIGxvb2tpbmcgYXQgdGhlIGdyb3VuZFxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFBpdGNoOiBmdW5jdGlvbihwaXRjaCkge1xuICAgICAgICB0aGlzLmp1bXBUbyh7cGl0Y2g6IHBpdGNofSk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogWm9vbSB0byBjb250YWluIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGJvdW5kc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gYm91bmRzIFtbbWluTGF0LCBtaW5MbmddLCBbbWF4TGF0LCBtYXhMbmddXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNwZWVkPTEuMl0gSG93IGZhc3QgYW5pbWF0aW9uIG9jY3Vyc1xuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jdXJ2ZT0xLjQyXSBIb3cgbXVjaCB6b29taW5nIG91dCBvY2N1cnMgZHVyaW5nIGFuaW1hdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMuZWFzaW5nXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMucGFkZGluZyBob3cgbXVjaCBwYWRkaW5nIHRoZXJlIGlzIGFyb3VuZCB0aGUgZ2l2ZW4gYm91bmRzIG9uIGVhY2ggc2lkZSBpbiBwaXhlbHNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5tYXhab29tXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgZml0Qm91bmRzOiBmdW5jdGlvbihib3VuZHMsIG9wdGlvbnMpIHtcblxuICAgICAgICBvcHRpb25zID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgbWF4Wm9vbTogSW5maW5pdHlcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgYm91bmRzID0gTGF0TG5nQm91bmRzLmNvbnZlcnQoYm91bmRzKTtcblxuICAgICAgICB2YXIgb2Zmc2V0ID0gUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCksXG4gICAgICAgICAgICB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgbncgPSB0ci5wcm9qZWN0KGJvdW5kcy5nZXROb3J0aFdlc3QoKSksXG4gICAgICAgICAgICBzZSA9IHRyLnByb2plY3QoYm91bmRzLmdldFNvdXRoRWFzdCgpKSxcbiAgICAgICAgICAgIHNpemUgPSBzZS5zdWIobncpLFxuICAgICAgICAgICAgc2NhbGVYID0gKHRyLndpZHRoIC0gb3B0aW9ucy5wYWRkaW5nICogMiAtIE1hdGguYWJzKG9mZnNldC54KSAqIDIpIC8gc2l6ZS54LFxuICAgICAgICAgICAgc2NhbGVZID0gKHRyLmhlaWdodCAtIG9wdGlvbnMucGFkZGluZyAqIDIgLSBNYXRoLmFicyhvZmZzZXQueSkgKiAyKSAvIHNpemUueTtcblxuICAgICAgICBvcHRpb25zLmNlbnRlciA9IHRyLnVucHJvamVjdChudy5hZGQoc2UpLmRpdigyKSk7XG4gICAgICAgIG9wdGlvbnMuem9vbSA9IE1hdGgubWluKHRyLnNjYWxlWm9vbSh0ci5zY2FsZSAqIE1hdGgubWluKHNjYWxlWCwgc2NhbGVZKSksIG9wdGlvbnMubWF4Wm9vbSk7XG4gICAgICAgIG9wdGlvbnMuYmVhcmluZyA9IDA7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubGluZWFyID9cbiAgICAgICAgICAgIHRoaXMuZWFzZVRvKG9wdGlvbnMpIDpcbiAgICAgICAgICAgIHRoaXMuZmx5VG8ob3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoYW5nZSBhbnkgY29tYmluYXRpb24gb2YgY2VudGVyLCB6b29tLCBiZWFyaW5nLCBhbmQgcGl0Y2gsIHdpdGhvdXRcbiAgICAgKiBhIHRyYW5zaXRpb24uIFRoZSBtYXAgd2lsbCByZXRhaW4gdGhlIGN1cnJlbnQgdmFsdWVzIGZvciBhbnkgb3B0aW9uc1xuICAgICAqIG5vdCBpbmNsdWRlZCBpbiBgb3B0aW9uc2AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0NhbWVyYU9wdGlvbnN9IG9wdGlvbnMgbWFwIHZpZXcgb3B0aW9uc1xuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGp1bXBUbzogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgICB2YXIgdHIgPSB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIHpvb21DaGFuZ2VkID0gZmFsc2UsXG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IGZhbHNlLFxuICAgICAgICAgICAgcGl0Y2hDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCdjZW50ZXInIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRyLmNlbnRlciA9IExhdExuZy5jb252ZXJ0KG9wdGlvbnMuY2VudGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnem9vbScgaW4gb3B0aW9ucyAmJiB0ci56b29tICE9PSArb3B0aW9ucy56b29tKSB7XG4gICAgICAgICAgICB6b29tQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0ci56b29tID0gK29wdGlvbnMuem9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnYmVhcmluZycgaW4gb3B0aW9ucyAmJiB0ci5iZWFyaW5nICE9PSArb3B0aW9ucy5iZWFyaW5nKSB7XG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0ci5iZWFyaW5nID0gK29wdGlvbnMuYmVhcmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgncGl0Y2gnIGluIG9wdGlvbnMgJiYgdHIucGl0Y2ggIT09ICtvcHRpb25zLnBpdGNoKSB7XG4gICAgICAgICAgICBwaXRjaENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHIucGl0Y2ggPSArb3B0aW9ucy5waXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0JylcbiAgICAgICAgICAgIC5maXJlKCdtb3ZlJyk7XG5cbiAgICAgICAgaWYgKHpvb21DaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3pvb20nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiZWFyaW5nQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdyb3RhdGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwaXRjaENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgncGl0Y2gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZpcmUoJ21vdmVlbmQnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRWFzaW5nIGFuaW1hdGlvbiB0byBhIHNwZWNpZmllZCBsb2NhdGlvbi96b29tL2JlYXJpbmdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q2FtZXJhT3B0aW9ucytBbmltYXRpb25PcHRpb25zfSBvcHRpb25zIG1hcCB2aWV3IGFuZCBhbmltYXRpb24gb3B0aW9uc1xuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGVhc2VUbzogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgICBvcHRpb25zID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgICAgICAgZWFzaW5nOiB1dGlsLmVhc2VcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBvZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KS5yb3RhdGUoLXRyLmFuZ2xlKSxcbiAgICAgICAgICAgIGZyb20gPSB0ci5wb2ludCxcbiAgICAgICAgICAgIHN0YXJ0Wm9vbSA9IHRoaXMuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgc3RhcnRCZWFyaW5nID0gdGhpcy5nZXRCZWFyaW5nKCksXG4gICAgICAgICAgICBzdGFydFBpdGNoID0gdGhpcy5nZXRQaXRjaCgpO1xuXG4gICAgICAgIHZhciB6b29tID0gJ3pvb20nIGluIG9wdGlvbnMgPyArb3B0aW9ucy56b29tIDogc3RhcnRab29tO1xuICAgICAgICB2YXIgYmVhcmluZyA9ICdiZWFyaW5nJyBpbiBvcHRpb25zID8gdGhpcy5fbm9ybWFsaXplQmVhcmluZyhvcHRpb25zLmJlYXJpbmcsIHN0YXJ0QmVhcmluZykgOiBzdGFydEJlYXJpbmc7XG4gICAgICAgIHZhciBwaXRjaCA9ICdwaXRjaCcgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnBpdGNoIDogc3RhcnRQaXRjaDtcblxuICAgICAgICB2YXIgc2NhbGUgPSB0ci56b29tU2NhbGUoem9vbSAtIHN0YXJ0Wm9vbSksXG4gICAgICAgICAgICB0byA9ICdjZW50ZXInIGluIG9wdGlvbnMgPyB0ci5wcm9qZWN0KExhdExuZy5jb252ZXJ0KG9wdGlvbnMuY2VudGVyKSkuc3ViKG9mZnNldC5kaXYoc2NhbGUpKSA6IGZyb20sXG4gICAgICAgICAgICBhcm91bmQ7XG5cbiAgICAgICAgaWYgKHpvb20gIT09IHN0YXJ0Wm9vbSkge1xuICAgICAgICAgICAgYXJvdW5kID0gdHIucG9pbnRMb2NhdGlvbih0ci5jZW50ZXJQb2ludC5hZGQodG8uc3ViKGZyb20pLmRpdigxIC0gMSAvIHNjYWxlKSkpO1xuICAgICAgICAgICAgdGhpcy56b29taW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucm90YXRpbmcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKCdtb3Zlc3RhcnQnKTtcblxuICAgICAgICB0aGlzLl9lYXNlKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICBpZiAoem9vbSAhPT0gc3RhcnRab29tKSB7XG4gICAgICAgICAgICAgICAgdHIuc2V0Wm9vbUFyb3VuZChpbnRlcnBvbGF0ZShzdGFydFpvb20sIHpvb20sIGspLCBhcm91bmQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ci5jZW50ZXIgPSB0ci51bnByb2plY3QoZnJvbS5hZGQodG8uc3ViKGZyb20pLm11bHQoaykpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGJlYXJpbmcgIT09IHN0YXJ0QmVhcmluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGl0Y2ggIT09IHN0YXJ0UGl0Y2gpIHtcbiAgICAgICAgICAgICAgICB0ci5waXRjaCA9IGludGVycG9sYXRlKHN0YXJ0UGl0Y2gsIHBpdGNoLCBrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlJyk7XG4gICAgICAgICAgICBpZiAodGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCd6b29tJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb3RhdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgncm90YXRlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy56b29taW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJvdGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZseWluZyBhbmltYXRpb24gdG8gYSBzcGVjaWZpZWQgbG9jYXRpb24vem9vbS9iZWFyaW5nIHdpdGggYXV0b21hdGljIGN1cnZlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0NhbWVyYU9wdGlvbnN9IG9wdGlvbnMgbWFwIHZpZXcgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zcGVlZD0xLjJdIEhvdyBmYXN0IGFuaW1hdGlvbiBvY2N1cnNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY3VydmU9MS40Ml0gSG93IG11Y2ggem9vbWluZyBvdXQgb2NjdXJzIGR1cmluZyBhbmltYXRpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5lYXNpbmddXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBmbHkgd2l0aCBkZWZhdWx0IG9wdGlvbnMgdG8gbnVsbCBpc2xhbmRcbiAgICAgKiBtYXAuZmx5VG8oe2NlbnRlcjogWzAsIDBdLCB6b29tOiA5fSk7XG4gICAgICogLy8gdXNpbmcgZmx5VG8gb3B0aW9uc1xuICAgICAqIG1hcC5mbHlUbyh7XG4gICAgICogICBjZW50ZXI6IFswLCAwXSxcbiAgICAgKiAgIHpvb206IDksXG4gICAgICogICBzcGVlZDogMC4yLFxuICAgICAqICAgY3VydmU6IDEsXG4gICAgICogICBlYXNpbmc6IGZ1bmN0aW9uKHQpIHtcbiAgICAgKiAgICAgcmV0dXJuIHQ7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICovXG4gICAgZmx5VG86IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgc3BlZWQ6IDEuMixcbiAgICAgICAgICAgIGN1cnZlOiAxLjQyLFxuICAgICAgICAgICAgZWFzaW5nOiB1dGlsLmVhc2VcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBvZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSxcbiAgICAgICAgICAgIHN0YXJ0Wm9vbSA9IHRoaXMuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgc3RhcnRCZWFyaW5nID0gdGhpcy5nZXRCZWFyaW5nKCk7XG5cbiAgICAgICAgdmFyIGNlbnRlciA9ICdjZW50ZXInIGluIG9wdGlvbnMgPyBMYXRMbmcuY29udmVydChvcHRpb25zLmNlbnRlcikgOiB0aGlzLmdldENlbnRlcigpO1xuICAgICAgICB2YXIgem9vbSA9ICd6b29tJyBpbiBvcHRpb25zID8gICtvcHRpb25zLnpvb20gOiBzdGFydFpvb207XG4gICAgICAgIHZhciBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZztcblxuICAgICAgICB2YXIgc2NhbGUgPSB0ci56b29tU2NhbGUoem9vbSAtIHN0YXJ0Wm9vbSksXG4gICAgICAgICAgICBmcm9tID0gdHIucG9pbnQsXG4gICAgICAgICAgICB0byA9IHRyLnByb2plY3QoY2VudGVyKS5zdWIob2Zmc2V0LmRpdihzY2FsZSkpO1xuXG4gICAgICAgIHZhciBzdGFydFdvcmxkU2l6ZSA9IHRyLndvcmxkU2l6ZSxcbiAgICAgICAgICAgIHJobyA9IG9wdGlvbnMuY3VydmUsXG4gICAgICAgICAgICBWID0gb3B0aW9ucy5zcGVlZCxcblxuICAgICAgICAgICAgdzAgPSBNYXRoLm1heCh0ci53aWR0aCwgdHIuaGVpZ2h0KSxcbiAgICAgICAgICAgIHcxID0gdzAgLyBzY2FsZSxcbiAgICAgICAgICAgIHUxID0gdG8uc3ViKGZyb20pLm1hZygpLFxuICAgICAgICAgICAgcmhvMiA9IHJobyAqIHJobztcblxuICAgICAgICBmdW5jdGlvbiByKGkpIHtcbiAgICAgICAgICAgIHZhciBiID0gKHcxICogdzEgLSB3MCAqIHcwICsgKGkgPyAtMSA6IDEpICogcmhvMiAqIHJobzIgKiB1MSAqIHUxKSAvICgyICogKGkgPyB3MSA6IHcwKSAqIHJobzIgKiB1MSk7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5sb2coTWF0aC5zcXJ0KGIgKiBiICsgMSkgLSBiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNpbmgobikgeyByZXR1cm4gKE1hdGguZXhwKG4pIC0gTWF0aC5leHAoLW4pKSAvIDI7IH1cbiAgICAgICAgZnVuY3Rpb24gY29zaChuKSB7IHJldHVybiAoTWF0aC5leHAobikgKyBNYXRoLmV4cCgtbikpIC8gMjsgfVxuICAgICAgICBmdW5jdGlvbiB0YW5oKG4pIHsgcmV0dXJuIHNpbmgobikgLyBjb3NoKG4pOyB9XG5cbiAgICAgICAgdmFyIHIwID0gcigwKSxcbiAgICAgICAgICAgIHcgPSBmdW5jdGlvbiAocykgeyByZXR1cm4gKGNvc2gocjApIC8gY29zaChyMCArIHJobyAqIHMpKTsgfSxcbiAgICAgICAgICAgIHUgPSBmdW5jdGlvbiAocykgeyByZXR1cm4gdzAgKiAoKGNvc2gocjApICogdGFuaChyMCArIHJobyAqIHMpIC0gc2luaChyMCkpIC8gcmhvMikgLyB1MTsgfSxcbiAgICAgICAgICAgIFMgPSAocigxKSAtIHIwKSAvIHJobztcblxuICAgICAgICBpZiAoTWF0aC5hYnModTEpIDwgMC4wMDAwMDEpIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh3MCAtIHcxKSA8IDAuMDAwMDAxKSByZXR1cm4gdGhpcztcblxuICAgICAgICAgICAgdmFyIGsgPSB3MSA8IHcwID8gLTEgOiAxO1xuICAgICAgICAgICAgUyA9IE1hdGguYWJzKE1hdGgubG9nKHcxIC8gdzApKSAvIHJobztcblxuICAgICAgICAgICAgdSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiAgICAgICAgICAgIHcgPSBmdW5jdGlvbihzKSB7IHJldHVybiBNYXRoLmV4cChrICogcmhvICogcyk7IH07XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLmR1cmF0aW9uID0gMTAwMCAqIFMgLyBWO1xuXG4gICAgICAgIHRoaXMuem9vbWluZyA9IHRydWU7XG4gICAgICAgIGlmIChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpIHRoaXMucm90YXRpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0Jyk7XG5cbiAgICAgICAgdGhpcy5fZWFzZShmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgdmFyIHMgPSBrICogUyxcbiAgICAgICAgICAgICAgICB1cyA9IHUocyk7XG5cbiAgICAgICAgICAgIHRyLnpvb20gPSBzdGFydFpvb20gKyB0ci5zY2FsZVpvb20oMSAvIHcocykpO1xuICAgICAgICAgICAgdHIuY2VudGVyID0gdHIudW5wcm9qZWN0KGZyb20uYWRkKHRvLnN1Yihmcm9tKS5tdWx0KHVzKSksIHN0YXJ0V29ybGRTaXplKTtcblxuICAgICAgICAgICAgaWYgKGJlYXJpbmcgIT09IHN0YXJ0QmVhcmluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmUnKS5maXJlKCd6b29tJyk7XG4gICAgICAgICAgICBpZiAoYmVhcmluZyAhPT0gc3RhcnRCZWFyaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdyb3RhdGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucm90YXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbW92ZWVuZCcpO1xuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgaXNFYXNpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9hYm9ydEZuO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIGN1cnJlbnQgYW5pbWF0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Fib3J0Rm4pIHtcbiAgICAgICAgICAgIHRoaXMuX2Fib3J0Rm4uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9hYm9ydEZuO1xuXG4gICAgICAgICAgICB0aGlzLl9maW5pc2hGbi5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2ZpbmlzaEZuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZWFzZTogZnVuY3Rpb24oZnJhbWUsIGZpbmlzaCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9maW5pc2hGbiA9IGZpbmlzaDtcbiAgICAgICAgdGhpcy5fYWJvcnRGbiA9IGJyb3dzZXIudGltZWQoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGZyYW1lLmNhbGwodGhpcywgb3B0aW9ucy5lYXNpbmcodCkpO1xuICAgICAgICAgICAgaWYgKHQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fYWJvcnRGbjtcbiAgICAgICAgICAgICAgICB0aGlzLl9maW5pc2hGbi5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9maW5pc2hGbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgb3B0aW9ucy5hbmltYXRlID09PSBmYWxzZSA/IDAgOiBvcHRpb25zLmR1cmF0aW9uLCB0aGlzKTtcbiAgICB9LFxuXG4gICAgLy8gY29udmVydCBiZWFyaW5nIHNvIHRoYXQgaXQncyBudW1lcmljYWxseSBjbG9zZSB0byB0aGUgY3VycmVudCBvbmUgc28gdGhhdCBpdCBpbnRlcnBvbGF0ZXMgcHJvcGVybHlcbiAgICBfbm9ybWFsaXplQmVhcmluZzogZnVuY3Rpb24oYmVhcmluZywgY3VycmVudEJlYXJpbmcpIHtcbiAgICAgICAgYmVhcmluZyA9IHV0aWwud3JhcChiZWFyaW5nLCAtMTgwLCAxODApO1xuICAgICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKGJlYXJpbmcgLSBjdXJyZW50QmVhcmluZyk7XG4gICAgICAgIGlmIChNYXRoLmFicyhiZWFyaW5nIC0gMzYwIC0gY3VycmVudEJlYXJpbmcpIDwgZGlmZikgYmVhcmluZyAtPSAzNjA7XG4gICAgICAgIGlmIChNYXRoLmFicyhiZWFyaW5nICsgMzYwIC0gY3VycmVudEJlYXJpbmcpIDwgZGlmZikgYmVhcmluZyArPSAzNjA7XG4gICAgICAgIHJldHVybiBiZWFyaW5nO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlRWFzaW5nOiBmdW5jdGlvbihkdXJhdGlvbiwgem9vbSwgYmV6aWVyKSB7XG4gICAgICAgIHZhciBlYXNpbmc7XG5cbiAgICAgICAgaWYgKHRoaXMuZWFzZSkge1xuICAgICAgICAgICAgdmFyIGVhc2UgPSB0aGlzLmVhc2UsXG4gICAgICAgICAgICAgICAgdCA9IChEYXRlLm5vdygpIC0gZWFzZS5zdGFydCkgLyBlYXNlLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHNwZWVkID0gZWFzZS5lYXNpbmcodCArIDAuMDEpIC0gZWFzZS5lYXNpbmcodCksXG5cbiAgICAgICAgICAgICAgICAvLyBRdWljayBoYWNrIHRvIG1ha2UgbmV3IGJlemllciB0aGF0IGlzIGNvbnRpbnVvdXMgd2l0aCBsYXN0XG4gICAgICAgICAgICAgICAgeCA9IDAuMjcgLyBNYXRoLnNxcnQoc3BlZWQgKiBzcGVlZCArIDAuMDAwMSkgKiAwLjAxLFxuICAgICAgICAgICAgICAgIHkgPSBNYXRoLnNxcnQoMC4yNyAqIDAuMjcgLSB4ICogeCk7XG5cbiAgICAgICAgICAgIGVhc2luZyA9IHV0aWwuYmV6aWVyKHgsIHksIDAuMjUsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWFzaW5nID0gYmV6aWVyID8gdXRpbC5iZXppZXIuYXBwbHkodXRpbCwgYmV6aWVyKSA6IHV0aWwuZWFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN0b3JlIGluZm9ybWF0aW9uIG9uIGN1cnJlbnQgZWFzaW5nXG4gICAgICAgIHRoaXMuZWFzZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiAobmV3IERhdGUoKSkuZ2V0VGltZSgpLFxuICAgICAgICAgICAgdG86IE1hdGgucG93KDIsIHpvb20pLFxuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiBlYXNpbmdcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZWFzaW5nO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29udHJvbCA9IHJlcXVpcmUoJy4vY29udHJvbCcpO1xudmFyIERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF0dHJpYnV0aW9uO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXR0cmlidXRpb24gY29udHJvbFxuICogQGNsYXNzIEF0dHJpYnV0aW9uXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZENvbnRyb2wobmV3IG1hcGJveGdsLkF0dHJpYnV0aW9uKCkpO1xuICovXG5mdW5jdGlvbiBBdHRyaWJ1dGlvbigpIHt9XG5cbkF0dHJpYnV0aW9uLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChDb250cm9sLCB7XG4gICAgb3B0aW9uczoge1xuICAgICAgICBwb3NpdGlvbjogJ2JvdHRvbS1yaWdodCdcbiAgICB9LFxuXG4gICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwtYXR0cmliJyxcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsIGNsYXNzTmFtZSwgbWFwLmdldENvbnRhaW5lcigpKTtcblxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgbWFwLm9uKCdzb3VyY2UubG9hZCcsIHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgbWFwLm9uKCdzb3VyY2UuY2hhbmdlJywgdGhpcy5fdXBkYXRlLmJpbmQodGhpcykpO1xuICAgICAgICBtYXAub24oJ3NvdXJjZS5yZW1vdmUnLCB0aGlzLl91cGRhdGUuYmluZCh0aGlzKSk7XG4gICAgICAgIG1hcC5vbignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZUVkaXRMaW5rLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgfSxcblxuICAgIF91cGRhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXR0cmlidXRpb25zID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcC5zdHlsZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5fbWFwLnN0eWxlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gdGhpcy5fbWFwLnN0eWxlLnNvdXJjZXNbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuYXR0cmlidXRpb24gJiYgYXR0cmlidXRpb25zLmluZGV4T2Yoc291cmNlLmF0dHJpYnV0aW9uKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRpb25zLnB1c2goc291cmNlLmF0dHJpYnV0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb250YWluZXIuaW5uZXJIVE1MID0gYXR0cmlidXRpb25zLmpvaW4oJyB8ICcpO1xuICAgICAgICB0aGlzLl9lZGl0TGluayA9IHRoaXMuX2NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtYXBib3gtaW1wcm92ZS1tYXAnKVswXTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRWRpdExpbmsoKTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZUVkaXRMaW5rOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VkaXRMaW5rKSB7XG4gICAgICAgICAgICB2YXIgY2VudGVyID0gdGhpcy5fbWFwLmdldENlbnRlcigpO1xuICAgICAgICAgICAgdGhpcy5fZWRpdExpbmsuaHJlZiA9ICdodHRwczovL3d3dy5tYXBib3guY29tL21hcC1mZWVkYmFjay8jLycgK1xuICAgICAgICAgICAgICAgICAgICBjZW50ZXIubG5nICsgJy8nICsgY2VudGVyLmxhdCArICcvJyArIE1hdGgucm91bmQodGhpcy5fbWFwLmdldFpvb20oKSArIDEpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29udHJvbDtcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIG1hcC1yZWxhdGVkIGludGVyZmFjZSBlbGVtZW50cy5cbiAqXG4gKiBAY2xhc3MgQ29udHJvbFxuICovXG5mdW5jdGlvbiBDb250cm9sKCkge31cblxuQ29udHJvbC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQWRkIHRoaXMgY29udHJvbCB0byB0aGUgbWFwLCByZXR1cm5pbmcgdGhlIGNvbnRyb2wgaXRzZWxmXG4gICAgICogZm9yIGNoYWluaW5nLiBUaGlzIHdpbGwgaW5zZXJ0IHRoZSBjb250cm9sJ3MgRE9NIGVsZW1lbnQgaW50b1xuICAgICAqIHRoZSBtYXAncyBET00gZWxlbWVudCBpZiB0aGUgY29udHJvbCBoYXMgYSBgcG9zaXRpb25gIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TWFwfSBtYXBcbiAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdGhpc1xuICAgICAqL1xuICAgIGFkZFRvOiBmdW5jdGlvbihtYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyID0gdGhpcy5vbkFkZChtYXApO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgICAgIHZhciBjb3JuZXIgPSBtYXAuX2NvbnRyb2xDb3JuZXJzW3Bvc107XG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NOYW1lICs9ICcgbWFwYm94Z2wtY3RybCc7XG4gICAgICAgICAgICBpZiAocG9zLmluZGV4T2YoJ2JvdHRvbScpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvcm5lci5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBjb3JuZXIuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvcm5lci5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGlzIGNvbnRyb2wgZnJvbSB0aGUgbWFwIGl0IGhhcyBiZWVuIGFkZGVkIHRvLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0NvbnRyb2x9IHRoaXNcbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5vblJlbW92ZSkgdGhpcy5vblJlbW92ZSh0aGlzLl9tYXApO1xuICAgICAgICB0aGlzLl9tYXAgPSBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29udHJvbCA9IHJlcXVpcmUoJy4vY29udHJvbCcpO1xudmFyIERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5hdmlnYXRpb247XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5hdmlnYXRpb24gY29udHJvbCB3aXRoIHpvb20gYnV0dG9ucyBhbmQgYSBjb21wYXNzXG4gKiBAY2xhc3MgTmF2aWdhdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBvc2l0aW9uPXRvcC1yaWdodF0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgY29udHJvbCdzIHBvc2l0aW9uIG9uIHRoZSBtYXAuIE9wdGlvbnMgYXJlIGB0b3AtcmlnaHRgLCBgdG9wLWxlZnRgLCBgYm90dG9tLXJpZ2h0YCwgYGJvdHRvbS1sZWZ0YFxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5OYXZpZ2F0aW9uKHtwb3NpdGlvbjogJ3RvcC1sZWZ0J30pKTsgLy8gcG9zaXRpb24gaXMgb3B0aW9uYWxcbiAqL1xuZnVuY3Rpb24gTmF2aWdhdGlvbihvcHRpb25zKSB7XG4gICAgdXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5OYXZpZ2F0aW9uLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChDb250cm9sLCB7XG4gICAgb3B0aW9uczoge1xuICAgICAgICBwb3NpdGlvbjogJ3RvcC1yaWdodCdcbiAgICB9LFxuXG4gICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCBjbGFzc05hbWUgKyAnLWdyb3VwJywgbWFwLmdldENvbnRhaW5lcigpKTtcblxuICAgICAgICB0aGlzLl96b29tSW5CdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oY2xhc3NOYW1lICsgJy1pY29uICcgKyBjbGFzc05hbWUgKyAnLXpvb20taW4nLCBtYXAuem9vbUluLmJpbmQobWFwKSk7XG4gICAgICAgIHRoaXMuX3pvb21PdXRCdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oY2xhc3NOYW1lICsgJy1pY29uICcgKyBjbGFzc05hbWUgKyAnLXpvb20tb3V0JywgbWFwLnpvb21PdXQuYmluZChtYXApKTtcbiAgICAgICAgdGhpcy5fY29tcGFzcyA9IHRoaXMuX2NyZWF0ZUJ1dHRvbihjbGFzc05hbWUgKyAnLWNvbXBhc3MnLCBtYXAucmVzZXROb3J0aC5iaW5kKG1hcCkpO1xuXG4gICAgICAgIHZhciBjb21wYXNzQ2FudmFzID0gdGhpcy5fY29tcGFzc0NhbnZhcyA9IERPTS5jcmVhdGUoJ2NhbnZhcycsIGNsYXNzTmFtZSArICctY29tcGFzcy1jYW52YXMnLCB0aGlzLl9jb21wYXNzKTtcbiAgICAgICAgY29tcGFzc0NhbnZhcy5zdHlsZS5jc3NUZXh0ID0gJ3dpZHRoOjI2cHg7IGhlaWdodDoyNnB4Oyc7XG4gICAgICAgIGNvbXBhc3NDYW52YXMud2lkdGggPSAyNiAqIDI7XG4gICAgICAgIGNvbXBhc3NDYW52YXMuaGVpZ2h0ID0gMjYgKiAyO1xuXG4gICAgICAgIHRoaXMuX2NvbXBhc3MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Db21wYXNzRG93bi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5fb25Db21wYXNzTW92ZSA9IHRoaXMuX29uQ29tcGFzc01vdmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fb25Db21wYXNzVXAgPSB0aGlzLl9vbkNvbXBhc3NVcC5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2NvbXBhc3NDdHggPSBjb21wYXNzQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICAgICAgbWFwLm9uKCdyb3RhdGUnLCB0aGlzLl9kcmF3Tm9ydGguYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX2RyYXdOb3J0aCgpO1xuXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgfSxcblxuICAgIF9vbkNvbXBhc3NEb3duOiBmdW5jdGlvbihlKSB7XG4gICAgICAgIERPTS5kaXNhYmxlRHJhZygpO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uQ29tcGFzc01vdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Db21wYXNzVXApO1xuICAgICAgICB0aGlzLl9wcmV2WCA9IGUuc2NyZWVuWDtcblxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sXG5cbiAgICBfb25Db21wYXNzTW92ZTogZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgeCA9IGUuc2NyZWVuWCxcbiAgICAgICAgICAgIGQgPSB4IDwgMiA/IC01IDogLy8gbGVmdCBlZGdlIG9mIHRoZSBzY3JlZW4sIGNvbnRpbnVlIHJvdGF0aW5nXG4gICAgICAgICAgICAgICAgeCA+IHdpbmRvdy5zY3JlZW4ud2lkdGggLSAyID8gNSA6IC8vIHJpZ2h0IGVkZ2VcbiAgICAgICAgICAgICAgICAoeCAtIHRoaXMuX3ByZXZYKSAvIDQ7XG5cbiAgICAgICAgdGhpcy5fbWFwLnNldEJlYXJpbmcodGhpcy5fbWFwLmdldEJlYXJpbmcoKSAtIGQpO1xuICAgICAgICB0aGlzLl9wcmV2WCA9IGUuc2NyZWVuWDtcbiAgICAgICAgdGhpcy5fbW92ZWQgPSB0cnVlO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuXG4gICAgX29uQ29tcGFzc1VwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Db21wYXNzTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbkNvbXBhc3NVcCk7XG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX21vdmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9tb3ZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgRE9NLnN1cHByZXNzQ2xpY2soKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfY3JlYXRlQnV0dG9uOiBmdW5jdGlvbihjbGFzc05hbWUsIGZuKSB7XG4gICAgICAgIHZhciBhID0gRE9NLmNyZWF0ZSgnYnV0dG9uJywgY2xhc3NOYW1lLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGZuKCk7IH0pO1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9LFxuXG4gICAgX2RyYXdOb3J0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByYWQgPSAyMCxcbiAgICAgICAgICAgIHdpZHRoID0gOCxcbiAgICAgICAgICAgIGNlbnRlciA9IDI2LFxuICAgICAgICAgICAgYW5nbGUgPSB0aGlzLl9tYXAudHJhbnNmb3JtLmFuZ2xlICsgKE1hdGguUEkgLyAyKSxcbiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2NvbXBhc3NDdHg7XG5cbiAgICAgICAgdGhpcy5fY29tcGFzc0NhbnZhcy53aWR0aCA9IHRoaXMuX2NvbXBhc3NDYW52YXMud2lkdGg7XG5cbiAgICAgICAgY3R4LnRyYW5zbGF0ZShjZW50ZXIsIGNlbnRlcik7XG4gICAgICAgIGN0eC5yb3RhdGUoYW5nbGUpO1xuXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjMDAwJztcbiAgICAgICAgY3R4LmxpbmVUbygwLCAtd2lkdGgpO1xuICAgICAgICBjdHgubGluZVRvKC1yYWQsIDApO1xuICAgICAgICBjdHgubGluZVRvKDAsIHdpZHRoKTtcbiAgICAgICAgY3R4LmZpbGwoKTtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSAnI2JiYic7XG4gICAgICAgIGN0eC5tb3ZlVG8oMCwgMCk7XG4gICAgICAgIGN0eC5saW5lVG8oMCwgd2lkdGgpO1xuICAgICAgICBjdHgubGluZVRvKHJhZCwgMCk7XG4gICAgICAgIGN0eC5saW5lVG8oMCwgLXdpZHRoKTtcbiAgICAgICAgY3R4LmZpbGwoKTtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjZmZmJztcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDQ7XG4gICAgICAgIGN0eC5tb3ZlVG8oMCwgLXdpZHRoKTtcbiAgICAgICAgY3R4LmxpbmVUbygwLCB3aWR0aCk7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEludGVyYWN0aW9uID0gcmVxdWlyZSgnLi9pbnRlcmFjdGlvbicpO1xudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9kb20nKTtcbnZhciBMYXRMbmdCb3VuZHMgPSByZXF1aXJlKCcuLi9nZW8vbGF0X2xuZ19ib3VuZHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBIYW5kbGVycztcblxuZnVuY3Rpb24gSGFuZGxlcnMobWFwKSB7XG5cbiAgICB2YXIgcm90YXRlRW5kO1xuXG4gICAgdmFyIGJveDtcblxuICAgIHZhciBpbmVydGlhTGluZWFyaXR5ID0gMC4yLFxuICAgICAgICBpbmVydGlhRWFzaW5nID0gdXRpbC5iZXppZXIoMCwgMCwgaW5lcnRpYUxpbmVhcml0eSwgMSk7XG5cbiAgICBmdW5jdGlvbiBib3h6b29tRmluaXNoKCkge1xuICAgICAgICBpZiAoYm94KSB7XG4gICAgICAgICAgICBib3gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChib3gpO1xuICAgICAgICAgICAgbWFwLmdldENvbnRhaW5lcigpLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWNyb3NzaGFpcicpO1xuICAgICAgICAgICAgYm94ID0gZmFsc2U7XG4gICAgICAgICAgICBET00uZW5hYmxlRHJhZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pbnRlcmFjdGlvbiA9IG5ldyBJbnRlcmFjdGlvbihtYXAuZ2V0Q2FudmFzKCkpXG4gICAgICAgIC5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBlLmxhdExuZyA9IG1hcC51bnByb2plY3QoZS5wb2ludCk7XG4gICAgICAgICAgICBtYXAuZmlyZSgnY2xpY2snLCBlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdkYmxjbGljaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGUubGF0TG5nID0gbWFwLnVucHJvamVjdChlLnBvaW50KTtcbiAgICAgICAgICAgIG1hcC5maXJlKCdkYmxjbGljaycsIGUpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ21vdXNlbW92ZScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGUubGF0TG5nID0gbWFwLnVucHJvamVjdChlLnBvaW50KTtcbiAgICAgICAgICAgIG1hcC5maXJlKCdtb3VzZW1vdmUnLCBlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdkb3duJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBtYXAuZmlyZSgnbW92ZXN0YXJ0Jyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbigncmVzaXplJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBtYXAuc3RvcCgpO1xuICAgICAgICAgICAgbWFwLnJlc2l6ZSgpO1xuICAgICAgICAgICAgbWFwLnVwZGF0ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZiAoZS5hbHRLZXkgfHwgZS5jdHJsS2V5IHx8IGUubWV0YUtleSkgcmV0dXJuO1xuXG4gICAgICAgICAgICB2YXIgcGFuID0gODA7XG4gICAgICAgICAgICB2YXIgcm90YXRlID0gMjtcblxuICAgICAgICAgICAgZnVuY3Rpb24gem9vbUJ5KHopIHtcbiAgICAgICAgICAgICAgICBtYXAuem9vbVRvKE1hdGgucm91bmQobWFwLmdldFpvb20oKSkgKyAoZS5zaGlmdEtleSA/IDIgOiAxKSAqIHopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBwYW5CeSh2KSB7XG4gICAgICAgICAgICAgICAgbWFwLnBhbkJ5KHYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiByb3RhdGVCeSh2KSB7XG4gICAgICAgICAgICAgICAgbWFwLnNldEJlYXJpbmcobWFwLmdldEJlYXJpbmcoKSArIHYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5Q29kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgNjE6XG4gICAgICAgICAgICAgICAgY2FzZSAxMDc6XG4gICAgICAgICAgICAgICAgY2FzZSAxNzE6XG4gICAgICAgICAgICAgICAgY2FzZSAxODc6XG4gICAgICAgICAgICAgICAgICAgIHpvb21CeSgxKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxODk6XG4gICAgICAgICAgICAgICAgY2FzZSAxMDk6XG4gICAgICAgICAgICAgICAgY2FzZSAxNzM6XG4gICAgICAgICAgICAgICAgICAgIHpvb21CeSgtMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVCeSgtcm90YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbkJ5KFstcGFuLCAwXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZUJ5KHJvdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5CeShbcGFuLCAwXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgICAgICAgICAgcGFuQnkoWzAsIC1wYW5dKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgICAgICAgICAgcGFuQnkoWzAsIHBhbl0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbigncGFuJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgbWFwLnN0b3AoKTtcbiAgICAgICAgICAgIHZhciBtb3VzZUxvY2F0aW9uID0gbWFwLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKGUucG9pbnQuYWRkKGUub2Zmc2V0KSk7XG4gICAgICAgICAgICBtYXAudHJhbnNmb3JtLnNldExvY2F0aW9uQXRQb2ludChtb3VzZUxvY2F0aW9uLCBlLnBvaW50KTtcbiAgICAgICAgICAgIG1hcC5maXJlKCdtb3ZlJyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbigncGFuZW5kJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgaWYgKCFlLmluZXJ0aWEpIHtcbiAgICAgICAgICAgICAgICBtYXAuZmlyZSgnbW92ZWVuZCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHZlbG9jaXR5IHRvIHB4L3MgJiBhZGp1c3QgZm9yIGluY3JlYXNlZCBpbml0aWFsIGFuaW1hdGlvbiBzcGVlZCB3aGVuIGVhc2luZyBvdXRcbiAgICAgICAgICAgICAgICB2YXIgdmVsb2NpdHkgPSBlLmluZXJ0aWEubXVsdCgxMDAwICogaW5lcnRpYUxpbmVhcml0eSksXG4gICAgICAgICAgICAgICAgICAgIHNwZWVkID0gdmVsb2NpdHkubWFnKCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbWF4U3BlZWQgPSA0MDAwOyAvLyBweC9zXG5cbiAgICAgICAgICAgICAgICBpZiAoc3BlZWQgPj0gbWF4U3BlZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3BlZWQgPSBtYXhTcGVlZDtcbiAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHkuX3VuaXQoKS5fbXVsdChtYXhTcGVlZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGRlY2VsZXJhdGlvbiA9IDgwMDAsIC8vIHB4L3NeMlxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHNwZWVkIC8gKGRlY2VsZXJhdGlvbiAqIGluZXJ0aWFMaW5lYXJpdHkpLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB2ZWxvY2l0eS5tdWx0KC1kdXJhdGlvbiAvIDIpLnJvdW5kKCk7XG5cbiAgICAgICAgICAgICAgICBtYXAucGFuQnkob2Zmc2V0LCB7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiAqIDEwMDAsXG4gICAgICAgICAgICAgICAgICAgIGVhc2luZzogaW5lcnRpYUVhc2luZyxcbiAgICAgICAgICAgICAgICAgICAgbm9Nb3ZlU3RhcnQ6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCd6b29tJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgLy8gU2NhbGUgYnkgc2lnbW9pZCBvZiBzY3JvbGwgd2hlZWwgZGVsdGEuXG4gICAgICAgICAgICB2YXIgc2NhbGUgPSAyIC8gKDEgKyBNYXRoLmV4cCgtTWF0aC5hYnMoZS5kZWx0YSAvIDEwMCkpKTtcbiAgICAgICAgICAgIGlmIChlLmRlbHRhIDwgMCAmJiBzY2FsZSAhPT0gMCkgc2NhbGUgPSAxIC8gc2NhbGU7XG5cbiAgICAgICAgICAgIHZhciBmcm9tU2NhbGUgPSBtYXAuZWFzZSAmJiBpc0Zpbml0ZShlLmRlbHRhKSA/IG1hcC5lYXNlLnRvIDogbWFwLnRyYW5zZm9ybS5zY2FsZSxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9ICFpc0Zpbml0ZShlLmRlbHRhKSA/IDgwMCA6IDA7XG5cbiAgICAgICAgICAgIG1hcC56b29tVG8obWFwLnRyYW5zZm9ybS5zY2FsZVpvb20oZnJvbVNjYWxlICogc2NhbGUpLCB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIGFyb3VuZDogbWFwLnVucHJvamVjdChlLnBvaW50KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbigncm90YXRlJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIGNlbnRlciA9IG1hcC50cmFuc2Zvcm0uY2VudGVyUG9pbnQsIC8vIENlbnRlciBvZiByb3RhdGlvblxuICAgICAgICAgICAgICAgIHN0YXJ0VG9DZW50ZXIgPSBlLnN0YXJ0LnN1YihjZW50ZXIpLFxuICAgICAgICAgICAgICAgIHN0YXJ0VG9DZW50ZXJEaXN0ID0gc3RhcnRUb0NlbnRlci5tYWcoKTtcblxuICAgICAgICAgICAgbWFwLnJvdGF0aW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IGNsaWNrIHdhcyB0b28gY2xvc2UgdG8gdGhlIGNlbnRlciwgbW92ZSB0aGUgY2VudGVyIG9mIHJvdGF0aW9uIGJ5IDIwMCBwaXhlbHNcbiAgICAgICAgICAgIC8vIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGNsaWNrLlxuICAgICAgICAgICAgaWYgKHN0YXJ0VG9DZW50ZXJEaXN0IDwgMjAwKSB7XG4gICAgICAgICAgICAgICAgY2VudGVyID0gZS5zdGFydC5hZGQobmV3IFBvaW50KC0yMDAsIDApLl9yb3RhdGUoc3RhcnRUb0NlbnRlci5hbmdsZSgpKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBiZWFyaW5nRGlmZiA9IGUucHJldi5zdWIoY2VudGVyKS5hbmdsZVdpdGgoZS5jdXJyZW50LnN1YihjZW50ZXIpKSAvIE1hdGguUEkgKiAxODA7XG4gICAgICAgICAgICBtYXAudHJhbnNmb3JtLmJlYXJpbmcgPSBtYXAuZ2V0QmVhcmluZygpIC0gYmVhcmluZ0RpZmY7XG5cbiAgICAgICAgICAgIG1hcC5maXJlKCdtb3ZlJykuZmlyZSgncm90YXRlJyk7XG5cbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocm90YXRlRW5kKTtcbiAgICAgICAgICAgIHJvdGF0ZUVuZCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIG1hcC5yb3RhdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIG1hcC5fcmVyZW5kZXIoKTtcbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignYm94em9vbXN0YXJ0JywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgaWYgKCFib3gpIHtcbiAgICAgICAgICAgICAgICBib3ggPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtYm94em9vbScsIG1hcC5nZXRDb250YWluZXIoKSk7XG4gICAgICAgICAgICAgICAgbWFwLmdldENvbnRhaW5lcigpLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNyb3NzaGFpcicpO1xuICAgICAgICAgICAgICAgIG1hcC5maXJlKCdib3h6b29tc3RhcnQnKTtcbiAgICAgICAgICAgICAgICBET00uZGlzYWJsZURyYWcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG1pblggPSBNYXRoLm1pbihlLnN0YXJ0LngsIGUuY3VycmVudC54KTtcbiAgICAgICAgICAgIHZhciBtYXhYID0gTWF0aC5tYXgoZS5zdGFydC54LCBlLmN1cnJlbnQueCk7XG4gICAgICAgICAgICB2YXIgbWluWSA9IE1hdGgubWluKGUuc3RhcnQueSwgZS5jdXJyZW50LnkpO1xuICAgICAgICAgICAgdmFyIG1heFkgPSBNYXRoLm1heChlLnN0YXJ0LnksIGUuY3VycmVudC55KTtcblxuICAgICAgICAgICAgRE9NLnNldFRyYW5zZm9ybShib3gsICd0cmFuc2xhdGUoJyArIG1pblggKyAncHgsJyArIG1pblkgKyAncHgpJyk7XG4gICAgICAgICAgICBib3guc3R5bGUud2lkdGggPSAobWF4WCAtIG1pblgpICsgJ3B4JztcbiAgICAgICAgICAgIGJveC5zdHlsZS5oZWlnaHQgPSAobWF4WSAtIG1pblkpICsgJ3B4JztcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdib3h6b29tZW5kJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgYm94em9vbUZpbmlzaCgpO1xuXG4gICAgICAgICAgICB2YXIgYm91bmRzID0gbmV3IExhdExuZ0JvdW5kcyhcbiAgICAgICAgICAgICAgICBtYXAudW5wcm9qZWN0KGUuc3RhcnQpLFxuICAgICAgICAgICAgICAgIG1hcC51bnByb2plY3QoZS5jdXJyZW50KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbWFwLmZpdEJvdW5kcyhib3VuZHMsIHsgbGluZWFyOiB0cnVlIH0pLmZpcmUoJ2JveHpvb21lbmQnLCB7XG4gICAgICAgICAgICAgICAgYm94Wm9vbUJvdW5kczogYm91bmRzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdib3h6b29tY2FuY2VsJywgYm94em9vbUZpbmlzaCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qXG4gKiBBZGRzIHBvc2l0aW9uYWwgY29vcmRpbmF0ZXMgdG8gVVJMIGhhc2hlcy4gUGFzc2VkIGFzIGFuIG9wdGlvbiB0byB0aGUgbWFwIG9iamVjdFxuICpcbiAqIEBjbGFzcyBtYXBib3hnbC5IYXNoXG4gKiBAcmV0dXJucyB7SGFzaH0gYHRoaXNgXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gSGFzaDtcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxuZnVuY3Rpb24gSGFzaCgpIHtcbiAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAnX29uSGFzaENoYW5nZScsXG4gICAgICAgICdfdXBkYXRlSGFzaCdcbiAgICBdLCB0aGlzKTtcbn1cblxuSGFzaC5wcm90b3R5cGUgPSB7XG4gICAgLyogTWFwIGVsZW1lbnQgdG8gbGlzdGVuIGZvciBjb29yZGluYXRlIGNoYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXBcbiAgICAgKiBAcmV0dXJucyB7SGFzaH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkVG86IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgdGhpcy5fb25IYXNoQ2hhbmdlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX21hcC5vbignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZUhhc2gpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyogUmVtb3ZlcyBoYXNoXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgdGhpcy5fb25IYXNoQ2hhbmdlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVIYXNoKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9vbkhhc2hDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbG9jID0gbG9jYXRpb24uaGFzaC5yZXBsYWNlKCcjJywgJycpLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChsb2MubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5qdW1wVG8oe1xuICAgICAgICAgICAgICAgIGNlbnRlcjogWytsb2NbMV0sICtsb2NbMl1dLFxuICAgICAgICAgICAgICAgIHpvb206ICtsb2NbMF0sXG4gICAgICAgICAgICAgICAgYmVhcmluZzogKyhsb2NbM10gfHwgMClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlSGFzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCksXG4gICAgICAgICAgICB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKSxcbiAgICAgICAgICAgIGJlYXJpbmcgPSB0aGlzLl9tYXAuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgcHJlY2lzaW9uID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKE1hdGgubG9nKHpvb20pIC8gTWF0aC5MTjIpKSxcblxuICAgICAgICAgICAgaGFzaCA9ICcjJyArIChNYXRoLnJvdW5kKHpvb20gKiAxMDApIC8gMTAwKSArXG4gICAgICAgICAgICAgICAgJy8nICsgY2VudGVyLmxhdC50b0ZpeGVkKHByZWNpc2lvbikgK1xuICAgICAgICAgICAgICAgICcvJyArIGNlbnRlci5sbmcudG9GaXhlZChwcmVjaXNpb24pICtcbiAgICAgICAgICAgICAgICAoYmVhcmluZyA/ICcvJyArIChNYXRoLnJvdW5kKGJlYXJpbmcgKiAxMCkgLyAxMCkgOiAnJyk7XG5cbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCAnJywgaGFzaCk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50ZWQgPSByZXF1aXJlKCcuLi91dGlsL2V2ZW50ZWQnKTtcbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVyYWN0aW9uO1xuXG4vKipcbiAqIE1vdXNlIGV2ZW50XG4gKlxuICogQGV2ZW50IE1hcCNtb3VzZW1vdmVcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJvcGVydHkge1BvaW50fSBwb2ludCB0aGUgcGl4ZWwgbG9jYXRpb24gb2YgdGhlIGV2ZW50XG4gKiBAcHJvcGVydHkge0V2ZW50fSBvcmlnaW5hbEV2ZW50IHRoZSBvcmlnaW5hbCBET00gZXZlbnRcbiAqL1xuXG4vKipcbiAqIERvdWJsZSBjbGljayBldmVudC5cbiAqXG4gKiBAZXZlbnQgTWFwI2RibGNsaWNrXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByb3BlcnR5IHtQb2ludH0gcG9pbnQgdGhlIHBpeGVsIGxvY2F0aW9uIG9mIHRoZSBldmVudFxuICovXG5cbi8qKlxuICogUGFuIGV2ZW50XG4gKlxuICogQGV2ZW50IE1hcCNwYW5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJvcGVydHkge1BvaW50fSBwb2ludCB0aGUgcGl4ZWwgbG9jYXRpb24gb2YgdGhlIGV2ZW50XG4gKiBAcHJvcGVydHkge1BvaW50fSBvZmZzZXQgYSBwb2ludCByZXByZXNlbnRpbmcgdGhlIG1vdmVtZW50IGZyb20gdGhlIHByZXZpb3VzIG1hcCBsb2NhdGlvbiB0byB0aGUgY3VycmVudCBvbmUuXG4gKi9cblxuLyoqXG4gKiBQYW4gZW5kIGV2ZW50XG4gKlxuICogQGV2ZW50IE1hcCNwYW5lbmRcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVsb2NpdHkgYSBtZWFzdXJlIG9mIGhvdyBtdWNoIGluZXJ0aWEgd2FzIHJlY29yZGVkIGluIHRoaXMgcGFuIG1vdGlvblxuICovXG5cbmZ1bmN0aW9uIEludGVyYWN0aW9uKGVsKSB7XG4gICAgdmFyIGludGVyYWN0aW9uID0gdGhpcztcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICB2YXIgcm90YXRpbmcgPSBmYWxzZSxcbiAgICAgICAgcGFubmVkID0gZmFsc2UsXG4gICAgICAgIGJveHpvb20gPSBmYWxzZSxcbiAgICAgICAgZmlyc3RQb3MgPSBudWxsLFxuICAgICAgICBwb3MgPSBudWxsLFxuICAgICAgICBpbmVydGlhID0gbnVsbCxcbiAgICAgICAgbm93O1xuXG4gICAgZnVuY3Rpb24gbW91c2VQb3MoZSkge1xuICAgICAgICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAgICAgZS5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gZWwuY2xpZW50TGVmdCxcbiAgICAgICAgICAgIGUuY2xpZW50WSAtIHJlY3QudG9wIC0gZWwuY2xpZW50VG9wKTtcbiAgICB9XG5cbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgIHJvdGF0aW5nID0gdHJ1ZTtcbiAgICAgICAgZmlyc3RQb3MgPSBwb3MgPSBtb3VzZVBvcyhldik7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSwgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9ubW91c2Vkb3duLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9ubW91c2V1cCwgZmFsc2UpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9ubW91c2Vtb3ZlLCBmYWxzZSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbmNsaWNrLCBmYWxzZSk7XG4gICAgc2Nyb2xsd2hlZWwoem9vbSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBvbmRvdWJsZWNsaWNrLCBmYWxzZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZSwgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlkb3duLCBmYWxzZSk7XG5cbiAgICBmdW5jdGlvbiB6b29tKHR5cGUsIGRlbHRhLCBwb2ludCkge1xuICAgICAgICBpbnRlcmFjdGlvbi5maXJlKCd6b29tJywge1xuICAgICAgICAgICAgc291cmNlOiB0eXBlLFxuICAgICAgICAgICAgZGVsdGE6IGRlbHRhLFxuICAgICAgICAgICAgcG9pbnQ6IHBvaW50XG4gICAgICAgIH0pO1xuICAgICAgICBpbmVydGlhID0gbnVsbDtcbiAgICAgICAgbm93ID0gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGljayhwb2ludCwgZXYpIHtcbiAgICAgICAgaW50ZXJhY3Rpb24uZmlyZSgnY2xpY2snLCB7cG9pbnQ6IHBvaW50LCBvcmlnaW5hbEV2ZW50OiBldn0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdXNlbW92ZShwb2ludCwgZXYpIHtcbiAgICAgICAgaW50ZXJhY3Rpb24uZmlyZSgnbW91c2Vtb3ZlJywge3BvaW50OiBwb2ludCwgb3JpZ2luYWxFdmVudDogZXZ9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYW4ocG9pbnQpIHtcbiAgICAgICAgaWYgKHBvcykge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHBvcy5zdWIocG9pbnQpO1xuICAgICAgICAgICAgaW50ZXJhY3Rpb24uZmlyZSgncGFuJywge29mZnNldDogb2Zmc2V0LCBwb2ludDogcG9pbnR9KTtcblxuICAgICAgICAgICAgLy8gYWRkIGFuIGF2ZXJhZ2VkIHZlcnNpb24gb2YgdGhpcyBtb3ZlbWVudCB0byB0aGUgaW5lcnRpYSB2ZWN0b3JcbiAgICAgICAgICAgIGlmIChpbmVydGlhKSB7XG4gICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIG5vdztcbiAgICAgICAgICAgICAgICAvLyBzb21ldGltZXMgaXQncyAwIGFmdGVyIHNvbWUgZXJyYXRpYyBwYW5pbmdcbiAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWUgPSBkdXJhdGlvbiArIG5vdztcbiAgICAgICAgICAgICAgICAgICAgaW5lcnRpYS5wdXNoKFt0aW1lLCBwb2ludF0pO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5lcnRpYS5sZW5ndGggPiAyICYmIHRpbWUgLSBpbmVydGlhWzBdWzBdID4gMTAwKSBpbmVydGlhLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZXJ0aWEgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBwb3MgPSBwb2ludDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZSgpIHtcbiAgICAgICAgaW50ZXJhY3Rpb24uZmlyZSgncmVzaXplJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga2V5ZG93bihldikge1xuICAgICAgICBpZiAoYm94em9vbSAmJiBldi5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgICAgaW50ZXJhY3Rpb24uZmlyZSgnYm94em9vbWNhbmNlbCcpO1xuICAgICAgICAgICAgYm94em9vbSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaW50ZXJhY3Rpb24uZmlyZSgna2V5ZG93bicsIGV2KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByb3RhdGUocG9pbnQpIHtcbiAgICAgICAgaWYgKHBvcykge1xuICAgICAgICAgICAgaW50ZXJhY3Rpb24uZmlyZSgncm90YXRlJywge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBmaXJzdFBvcyxcbiAgICAgICAgICAgICAgICBwcmV2OiBwb3MsXG4gICAgICAgICAgICAgICAgY3VycmVudDogcG9pbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcG9zID0gcG9pbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkb3VibGVjbGljayhwb2ludCwgZXYpIHtcbiAgICAgICAgaW50ZXJhY3Rpb24uZmlyZSgnZGJsY2xpY2snLCB7XG4gICAgICAgICAgICBwb2ludDogcG9pbnQsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldlxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbm1vdXNlZG93bihldikge1xuICAgICAgICBmaXJzdFBvcyA9IHBvcyA9IG1vdXNlUG9zKGV2KTtcbiAgICAgICAgaW50ZXJhY3Rpb24uZmlyZSgnZG93bicpO1xuICAgICAgICBpZiAoZXYuc2hpZnRLZXkgfHwgKChldi53aGljaCA9PT0gMSkgJiYgKGV2LmJ1dHRvbiA9PT0gMSkpKSB7XG4gICAgICAgICAgYm94em9vbSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbm1vdXNldXAoZXYpIHtcbiAgICAgICAgcGFubmVkID0gcG9zICYmIGZpcnN0UG9zICYmIChwb3MueCAhPT0gZmlyc3RQb3MueCB8fCBwb3MueSAhPT0gZmlyc3RQb3MueSk7XG5cbiAgICAgICAgcm90YXRpbmcgPSBmYWxzZTtcbiAgICAgICAgcG9zID0gbnVsbDtcblxuICAgICAgICBpZiAoYm94em9vbSkge1xuICAgICAgICAgICAgaW50ZXJhY3Rpb24uZmlyZSgnYm94em9vbWVuZCcsIHtcbiAgICAgICAgICAgICAgICBzdGFydDogZmlyc3RQb3MsXG4gICAgICAgICAgICAgICAgY3VycmVudDogbW91c2VQb3MoZXYpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJveHpvb20gPSBmYWxzZTtcblxuICAgICAgICB9IGVsc2UgaWYgKGluZXJ0aWEgJiYgaW5lcnRpYS5sZW5ndGggPj0gMiAmJiBub3cgPiBEYXRlLm5vdygpIC0gMTAwKSB7XG4gICAgICAgICAgICB2YXIgbGFzdCA9IGluZXJ0aWFbaW5lcnRpYS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgICAgICBmaXJzdCA9IGluZXJ0aWFbMF0sXG4gICAgICAgICAgICAgICAgdmVsb2NpdHkgPSBsYXN0WzFdLnN1YihmaXJzdFsxXSkuZGl2KGxhc3RbMF0gLSBmaXJzdFswXSk7XG4gICAgICAgICAgICBpbnRlcmFjdGlvbi5maXJlKCdwYW5lbmQnLCB7aW5lcnRpYTogdmVsb2NpdHl9KTtcblxuICAgICAgICB9IGVsc2UgaWYgKHBvcykge1xuICAgICAgICAgIGludGVyYWN0aW9uLmZpcmUoJ3BhbmVuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5lcnRpYSA9IG51bGw7XG4gICAgICAgIG5vdyA9IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25tb3VzZW1vdmUoZXYpIHtcbiAgICAgICAgdmFyIHBvaW50ID0gbW91c2VQb3MoZXYpO1xuXG4gICAgICAgIGlmIChib3h6b29tKSB7XG4gICAgICAgICAgICBpbnRlcmFjdGlvbi5maXJlKCdib3h6b29tc3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IGZpcnN0UG9zLFxuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHBvaW50XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW5nKSB7XG4gICAgICAgICAgICByb3RhdGUocG9pbnQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAocG9zKSB7XG4gICAgICAgICAgICBwYW4ocG9pbnQpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZXYudG9FbGVtZW50IHx8IGV2LnRhcmdldDtcbiAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBlbCAmJiB0YXJnZXQucGFyZW50Tm9kZSkgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBlbCkge1xuICAgICAgICAgICAgICAgIG1vdXNlbW92ZShwb2ludCwgZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25jbGljayhldikge1xuICAgICAgICBpZiAoIXBhbm5lZCkgY2xpY2sobW91c2VQb3MoZXYpLCBldik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25kb3VibGVjbGljayhldikge1xuICAgICAgICBkb3VibGVjbGljayhtb3VzZVBvcyhldiksIGV2KTtcbiAgICAgICAgem9vbSgnd2hlZWwnLCBJbmZpbml0eSAqIChldi5zaGlmdEtleSA/IC0xIDogMSksIG1vdXNlUG9zKGV2KSk7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2Nyb2xsd2hlZWwoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZpcmVmb3ggPSAvRmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICAgIHZhciBzYWZhcmkgPSAvU2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhL0Nocm9tKGl1bXxlKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICAgIHZhciB0aW1lID0gd2luZG93LnBlcmZvcm1hbmNlIHx8IERhdGU7XG5cbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB3aGVlbCwgZmFsc2UpO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgbW91c2V3aGVlbCwgZmFsc2UpO1xuXG4gICAgICAgIHZhciBsYXN0RXZlbnQgPSAwO1xuXG4gICAgICAgIHZhciB0eXBlID0gbnVsbDtcbiAgICAgICAgdmFyIHR5cGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IG51bGw7XG5cbiAgICAgICAgZnVuY3Rpb24gc2Nyb2xsKHZhbHVlLCBldikge1xuICAgICAgICAgICAgdmFyIHN0YW1wID0gdGltZS5ub3coKTtcbiAgICAgICAgICAgIHZhciB0aW1lRGVsdGEgPSBzdGFtcCAtIGxhc3RFdmVudDtcbiAgICAgICAgICAgIGxhc3RFdmVudCA9IHN0YW1wO1xuXG4gICAgICAgICAgICB2YXIgcG9pbnQgPSBtb3VzZVBvcyhldik7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gMCAmJiAodmFsdWUgJSA0LjAwMDI0NDE0MDYyNSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG9uZSBpcyBkZWZpbml0ZWx5IGEgbW91c2Ugd2hlZWwgZXZlbnQuXG4gICAgICAgICAgICAgICAgdHlwZSA9ICd3aGVlbCc7XG4gICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHRoaXMgdmFsdWUgdG8gbWF0Y2ggdHJhY2twYWQuXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlIC8gNCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSAwICYmIE1hdGguYWJzKHZhbHVlKSA8IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG9uZSBpcyBkZWZpbml0ZWx5IGEgdHJhY2twYWQgZXZlbnQgYmVjYXVzZSBpdCBpcyBzbyBzbWFsbC5cbiAgICAgICAgICAgICAgICB0eXBlID0gJ3RyYWNrcGFkJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZURlbHRhID4gNDAwKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBuZXcgc2Nyb2xsIGFjdGlvbi5cbiAgICAgICAgICAgICAgICB0eXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBhIHRpbWVvdXQgaW4gY2FzZSB0aGlzIHdhcyBhIHNpbmd1bGFyIGV2ZW50LCBhbmQgZGVseSBpdFxuICAgICAgICAgICAgICAgIC8vIGJ5IHVwIHRvIDQwbXMuXG4gICAgICAgICAgICAgICAgdHlwZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ3doZWVsJztcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodHlwZSwgLWluaXRpYWxWYWx1ZSwgcG9pbnQpO1xuICAgICAgICAgICAgICAgIH0sIDQwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXBlYXRpbmcgZXZlbnQsIGJ1dCB3ZSBkb24ndCBrbm93IHRoZSB0eXBlIG9mIGV2ZW50XG4gICAgICAgICAgICAgICAgLy8ganVzdCB5ZXQuIElmIHRoZSBkZWx0YSBwZXIgdGltZSBpcyBzbWFsbCwgd2UgYXNzdW1lIGl0J3MgYVxuICAgICAgICAgICAgICAgIC8vIGZhc3QgdHJhY2twYWQ7IG90aGVyd2lzZSB3ZSBzd2l0Y2ggaW50byB3aGVlbCBtb2RlLlxuICAgICAgICAgICAgICAgIHR5cGUgPSAoTWF0aC5hYnModGltZURlbHRhICogdmFsdWUpIDwgMjAwKSA/ICd0cmFja3BhZCcgOiAnd2hlZWwnO1xuXG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG91ciBkZWxheWVkIGV2ZW50IGlzbid0IGZpcmVkIGFnYWluLCBiZWNhdXNlIHdlXG4gICAgICAgICAgICAgICAgLy8gYWNjdW11bGF0ZSB0aGUgcHJldmlvdXMgZXZlbnQgKHdoaWNoIHdhcyBsZXNzIHRoYW4gNDBtcyBhZ28pIGludG9cbiAgICAgICAgICAgICAgICAvLyB0aGlzIGV2ZW50LlxuICAgICAgICAgICAgICAgIGlmICh0eXBlVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodHlwZVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICB0eXBlVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNsb3cgZG93biB6b29tIGlmIHNoaWZ0IGtleSBpcyBoZWxkIGZvciBtb3JlIHByZWNpc2Ugem9vbWluZ1xuICAgICAgICAgICAgaWYgKGV2LnNoaWZ0S2V5ICYmIHZhbHVlKSB2YWx1ZSA9IHZhbHVlIC8gNDtcblxuICAgICAgICAgICAgLy8gT25seSBmaXJlIHRoZSBjYWxsYmFjayBpZiB3ZSBhY3R1YWxseSBrbm93IHdoYXQgdHlwZSBvZiBzY3JvbGxpbmdcbiAgICAgICAgICAgIC8vIGRldmljZSB0aGUgdXNlciB1c2VzLlxuICAgICAgICAgICAgaWYgKHR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh0eXBlLCAtdmFsdWUsIHBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHdoZWVsKGUpIHtcbiAgICAgICAgICAgIHZhciBkZWx0YVkgPSBlLmRlbHRhWTtcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggZG91YmxlcyB0aGUgdmFsdWVzIG9uIHJldGluYSBzY3JlZW5zLi4uXG4gICAgICAgICAgICBpZiAoZmlyZWZveCAmJiBlLmRlbHRhTW9kZSA9PT0gd2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX1BJWEVMKSBkZWx0YVkgLz0gYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICAgICAgaWYgKGUuZGVsdGFNb2RlID09PSB3aW5kb3cuV2hlZWxFdmVudC5ET01fREVMVEFfTElORSkgZGVsdGFZICo9IDQwO1xuICAgICAgICAgICAgc2Nyb2xsKGRlbHRhWSwgZSk7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtb3VzZXdoZWVsKGUpIHtcbiAgICAgICAgICAgIHZhciBkZWx0YVkgPSAtZS53aGVlbERlbHRhWTtcbiAgICAgICAgICAgIGlmIChzYWZhcmkpIGRlbHRhWSA9IGRlbHRhWSAvIDM7XG4gICAgICAgICAgICBzY3JvbGwoZGVsdGFZLCBlKTtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuSW50ZXJhY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFdmVudGVkKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENhbnZhcyA9IHJlcXVpcmUoJy4uL3V0aWwvY2FudmFzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbnZhciBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG52YXIgRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9kb20nKTtcblxudmFyIFN0eWxlID0gcmVxdWlyZSgnLi4vc3R5bGUvc3R5bGUnKTtcbnZhciBBbmltYXRpb25Mb29wID0gcmVxdWlyZSgnLi4vc3R5bGUvYW5pbWF0aW9uX2xvb3AnKTtcbnZhciBHTFBhaW50ZXIgPSByZXF1aXJlKCcuLi9yZW5kZXIvcGFpbnRlcicpO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vZ2VvL3RyYW5zZm9ybScpO1xudmFyIEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKTtcbnZhciBIYW5kbGVycyA9IHJlcXVpcmUoJy4vaGFuZGxlcnMnKTtcbnZhciBDYW1lcmEgPSByZXF1aXJlKCcuL2NhbWVyYScpO1xudmFyIExhdExuZyA9IHJlcXVpcmUoJy4uL2dlby9sYXRfbG5nJyk7XG52YXIgTGF0TG5nQm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvL2xhdF9sbmdfYm91bmRzJyk7XG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xudmFyIEF0dHJpYnV0aW9uID0gcmVxdWlyZSgnLi9jb250cm9sL2F0dHJpYnV0aW9uJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcCBpbnN0YW5jZS5cbiAqIEBjbGFzcyBNYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5jb250YWluZXIgSFRNTCBlbGVtZW50IHRvIGluaXRpYWxpemUgdGhlIG1hcCBpbiAob3IgZWxlbWVudCBpZCBhcyBzdHJpbmcpXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWluWm9vbT0wXSBNaW5pbXVtIHpvb20gb2YgdGhlIG1hcFxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heFpvb209MjBdIE1heGltdW0gem9vbSBvZiB0aGUgbWFwXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5zdHlsZSBNYXAgc3R5bGUgYW5kIGRhdGEgc291cmNlIGRlZmluaXRpb24gKGVpdGhlciBhIEpTT04gb2JqZWN0IG9yIGEgSlNPTiBVUkwpLCBkZXNjcmliZWQgaW4gdGhlIFtzdHlsZSByZWZlcmVuY2VdKGh0dHBzOi8vbWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8pXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhhc2g9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCB3aWxsIHRyYWNrIGFuZCB1cGRhdGUgdGhlIHBhZ2UgVVJMIGFjY29yZGluZyB0byBtYXAgcG9zaXRpb25cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW50ZXJhY3RpdmU9dHJ1ZV0gSWYgYGZhbHNlYCwgbm8gbW91c2UsIHRvdWNoLCBvciBrZXlib2FyZCBsaXN0ZW5lcnMgYXJlIGF0dGFjaGVkIHRvIHRoZSBtYXAsIHNvIGl0IHdpbGwgbm90IHJlc3BvbmQgdG8gaW5wdXRcbiAqIEBwYXJhbSB7QXJyYXl9IG9wdGlvbnMuY2xhc3NlcyBTdHlsZSBjbGFzcyBuYW1lcyB3aXRoIHdoaWNoIHRvIGluaXRpYWxpemUgdGhlIG1hcFxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBJZiBgdHJ1ZWAsIG1hcCBjcmVhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIGltcGxlbWVudGF0aW9uIGRldGVybWluZXMgdGhhdCB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGNyZWF0ZWQgV2ViR0wgY29udGV4dCB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgbG93ZXIgdGhhbiBleHBlY3RlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyPWZhbHNlXSBJZiBgdHJ1ZWAsIFRoZSBtYXBzIGNhbnZhcyBjYW4gYmUgZXhwb3J0ZWQgdG8gYSBQTkcgdXNpbmcgYG1hcC5nZXRDYW52YXMoKS50b0RhdGFVUkwoKTtgLiBUaGlzIGlzIGZhbHNlIGJ5IGRlZmF1bHQgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe1xuICogICBjb250YWluZXI6ICdtYXAnLFxuICogICBjZW50ZXI6IFszNy43NzI1MzcsIC0xMjIuNDIwNjc5XSxcbiAqICAgem9vbTogMTMsXG4gKiAgIHN0eWxlOiBzdHlsZV9vYmplY3QsXG4gKiAgIGhhc2g6IHRydWVcbiAqIH0pO1xuICovXG52YXIgTWFwID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gdXRpbC5pbmhlcml0KHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmFuaW1hdGlvbkxvb3AgPSBuZXcgQW5pbWF0aW9uTG9vcCgpO1xuICAgIHRoaXMudHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShvcHRpb25zLm1pblpvb20sIG9wdGlvbnMubWF4Wm9vbSk7XG5cbiAgICBpZiAob3B0aW9ucy5tYXhCb3VuZHMpIHtcbiAgICAgICAgdmFyIGIgPSBMYXRMbmdCb3VuZHMuY29udmVydChvcHRpb25zLm1heEJvdW5kcyk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlID0gW2IuZ2V0U291dGgoKSwgYi5nZXROb3J0aCgpXTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0ubG5nUmFuZ2UgPSBbYi5nZXRXZXN0KCksIGIuZ2V0RWFzdCgpXTtcbiAgICB9XG5cbiAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAnX2ZvcndhcmRTdHlsZUV2ZW50JyxcbiAgICAgICAgJ19mb3J3YXJkU291cmNlRXZlbnQnLFxuICAgICAgICAnX2ZvcndhcmRMYXllckV2ZW50JyxcbiAgICAgICAgJ19mb3J3YXJkVGlsZUV2ZW50JyxcbiAgICAgICAgJ19vblN0eWxlTG9hZCcsXG4gICAgICAgICdfb25TdHlsZUNoYW5nZScsXG4gICAgICAgICdfb25Tb3VyY2VBZGQnLFxuICAgICAgICAnX29uU291cmNlUmVtb3ZlJyxcbiAgICAgICAgJ19vblNvdXJjZVVwZGF0ZScsXG4gICAgICAgICd1cGRhdGUnLFxuICAgICAgICAncmVuZGVyJ1xuICAgIF0sIHRoaXMpO1xuXG4gICAgdGhpcy5fc2V0dXBDb250YWluZXIoKTtcbiAgICB0aGlzLl9zZXR1cFBhaW50ZXIoKTtcblxuICAgIHRoaXMub24oJ21vdmUnLCB0aGlzLnVwZGF0ZSk7XG4gICAgdGhpcy5vbignem9vbScsIHRoaXMudXBkYXRlLmJpbmQodGhpcywgdHJ1ZSkpO1xuICAgIHRoaXMub24oJ21vdmVlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5hbmltYXRpb25Mb29wLnNldCgzMDApOyAvLyB0ZXh0IGZhZGluZ1xuICAgICAgICB0aGlzLl9yZXJlbmRlcigpO1xuICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLmhhbmRsZXJzID0gb3B0aW9ucy5pbnRlcmFjdGl2ZSAmJiBuZXcgSGFuZGxlcnModGhpcyk7XG5cbiAgICB0aGlzLl9oYXNoID0gb3B0aW9ucy5oYXNoICYmIChuZXcgSGFzaCgpKS5hZGRUbyh0aGlzKTtcbiAgICAvLyBkb24ndCBzZXQgcG9zaXRpb24gZnJvbSBvcHRpb25zIGlmIHNldCB0aHJvdWdoIGhhc2hcbiAgICBpZiAoIXRoaXMuX2hhc2ggfHwgIXRoaXMuX2hhc2guX29uSGFzaENoYW5nZSgpKSB7XG4gICAgICAgIHRoaXMuanVtcFRvKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuc291cmNlcyA9IHt9O1xuICAgIHRoaXMuc3RhY2tzID0ge307XG4gICAgdGhpcy5fY2xhc3NlcyA9IHt9O1xuXG4gICAgdGhpcy5yZXNpemUoKTtcblxuICAgIGlmIChvcHRpb25zLmNsYXNzZXMpIHRoaXMuc2V0Q2xhc3NlcyhvcHRpb25zLmNsYXNzZXMpO1xuICAgIGlmIChvcHRpb25zLnN0eWxlKSB0aGlzLnNldFN0eWxlKG9wdGlvbnMuc3R5bGUpO1xuICAgIGlmIChvcHRpb25zLmF0dHJpYnV0aW9uQ29udHJvbCkgdGhpcy5hZGRDb250cm9sKG5ldyBBdHRyaWJ1dGlvbigpKTtcbn07XG5cbnV0aWwuZXh0ZW5kKE1hcC5wcm90b3R5cGUsIEV2ZW50ZWQpO1xudXRpbC5leHRlbmQoTWFwLnByb3RvdHlwZSwgQ2FtZXJhLnByb3RvdHlwZSk7XG51dGlsLmV4dGVuZChNYXAucHJvdG90eXBlLCAvKiogQGxlbmRzIE1hcC5wcm90b3R5cGUgKi97XG5cbiAgICBvcHRpb25zOiB7XG4gICAgICAgIGNlbnRlcjogWzAsIDBdLFxuICAgICAgICB6b29tOiAwLFxuICAgICAgICBiZWFyaW5nOiAwLFxuICAgICAgICBwaXRjaDogMCxcblxuICAgICAgICBtaW5ab29tOiAwLFxuICAgICAgICBtYXhab29tOiAyMCxcblxuICAgICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgaGFzaDogZmFsc2UsXG5cbiAgICAgICAgYXR0cmlidXRpb25Db250cm9sOiB0cnVlLFxuXG4gICAgICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IGZhbHNlXG4gICAgfSxcblxuICAgIGFkZENvbnRyb2w6IGZ1bmN0aW9uKGNvbnRyb2wpIHtcbiAgICAgICAgY29udHJvbC5hZGRUbyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFtzdHlsZU9wdGlvbnNdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3R5bGVPcHRpb25zLnRyYW5zaXRpb249dHJ1ZV1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBzdHlsZSBjbGFzcyB0byBhIG1hcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtsYXNzIG5hbWUgb2Ygc3R5bGUgY2xhc3NcbiAgICAgKiBAcGFyYW0ge3N0eWxlT3B0aW9uc30gb3B0aW9uc1xuICAgICAqIEBmaXJlcyBjaGFuZ2VcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBhZGRDbGFzczogZnVuY3Rpb24oa2xhc3MsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NsYXNzZXNba2xhc3NdKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2NsYXNzZXNba2xhc3NdID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcywgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBzdHlsZSBjbGFzcyBmcm9tIGEgbWFwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2xhc3MgbmFtZSBvZiBzdHlsZSBjbGFzc1xuICAgICAqIEBwYXJhbSB7c3R5bGVPcHRpb25zfSBvcHRpb25zXG4gICAgICogQGZpcmVzIGNoYW5nZVxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbihrbGFzcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuX2NsYXNzZXNba2xhc3NdKSByZXR1cm47XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jbGFzc2VzW2tsYXNzXTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcywgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gYWRkIG1vcmUgdGhhbiBvbmUgY2xhc3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0ga2xhc3NlcyBBbiBhcnJheSBvZiBjbGFzcyBuYW1lc1xuICAgICAqIEBwYXJhbSB7c3R5bGVPcHRpb25zfSBvcHRpb25zXG4gICAgICogQGZpcmVzIGNoYW5nZVxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldENsYXNzZXM6IGZ1bmN0aW9uKGtsYXNzZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fY2xhc3NlcyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuX2NsYXNzZXNba2xhc3Nlc1tpXV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayB3aGV0aGVyIGEgc3R5bGUgY2xhc3MgaXMgYWN0aXZlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2xhc3MgTmFtZSBvZiBzdHlsZSBjbGFzc1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc0NsYXNzOiBmdW5jdGlvbihrbGFzcykge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9jbGFzc2VzW2tsYXNzXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IGFjdGl2ZSBzdHlsZSBjbGFzc2VzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRDbGFzc2VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2NsYXNzZXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3QgdGhlIG1hcCdzIG5ldyB3aWR0aCBhbmQgaGVpZ2h0IGFuZCByZXNpemUgaXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZXNpemU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgd2lkdGggPSAwLCBoZWlnaHQgPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoIHx8IDQwMDtcbiAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuX2NvbnRhaW5lci5vZmZzZXRIZWlnaHQgfHwgMzAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FudmFzLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICB0aGlzLnRyYW5zZm9ybS53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLl9jb25zdHJhaW4oKTtcblxuICAgICAgICB0aGlzLnBhaW50ZXIucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAuZmlyZSgnbW92ZXN0YXJ0JylcbiAgICAgICAgICAgIC5maXJlKCdtb3ZlJylcbiAgICAgICAgICAgIC5maXJlKCdyZXNpemUnKVxuICAgICAgICAgICAgLmZpcmUoJ21vdmVlbmQnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nQm91bmRzfVxuICAgICAqL1xuICAgIGdldEJvdW5kczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF0TG5nQm91bmRzKFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQoMCwgMCkpLFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbih0aGlzLnRyYW5zZm9ybS5zaXplKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBwaXhlbCBjb29yZGluYXRlcyAocmVsYXRpdmUgdG8gbWFwIGNvbnRhaW5lcikgZ2l2ZW4gYSBnZW9ncmFwaGljYWwgbG9jYXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TGF0TG5nfSBsYXRsbmdcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBgeGAgYW5kIGB5YCBjb29yZGluYXRlc1xuICAgICAqL1xuICAgIHByb2plY3Q6IGZ1bmN0aW9uKGxhdGxuZykge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChMYXRMbmcuY29udmVydChsYXRsbmcpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyBnaXZlbiBwaXhlbCBjb29yZGluYXRlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBwb2ludCBbeCwgeV0gcGl4ZWwgY29vcmRpbmF0ZXNcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nfVxuICAgICAqL1xuICAgIHVucHJvamVjdDogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24oUG9pbnQuY29udmVydChwb2ludCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGZlYXR1cmVzIGF0IGEgcG9pbnQgKFt4LCB5XSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gcG9pbnQgW3gsIHldIHBpeGVsIGNvb3JkaW5hdGVzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1zLnJhZGl1cz0wXSBPcHRpb25hbC4gUmFkaXVzIGluIHBpeGVscyB0byBzZWFyY2ggaW5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmxheWVyIE9wdGlvbmFsLiBPbmx5IHJldHVybiBmZWF0dXJlcyBmcm9tIGEgZ2l2ZW4gbGF5ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnR5cGUgT3B0aW9uYWwuIEVpdGhlciBgcmFzdGVyYCBvciBgdmVjdG9yYFxuICAgICAqIEBwYXJhbSB7ZmVhdHVyZXNBdENhbGxiYWNrfSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlc3BvbnNlXG4gICAgICpcbiAgICAgKiBAY2FsbGJhY2sgZmVhdHVyZXNBdENhbGxiYWNrXG4gICAgICogQHBhcmFtIHtPYmplY3R8bnVsbH0gZXJyIEVycm9yIF9JZiBhbnlfXG4gICAgICogQHBhcmFtIHtBcnJheX0gZmVhdHVyZXMgRGlzcGxheXMgYSBKU09OIGFycmF5IG9mIGZlYXR1cmVzIGdpdmVuIHRoZSBwYXNzZWQgcGFyYW1ldGVycyBvZiBgZmVhdHVyZXNBdGBcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZmVhdHVyZXNBdChbMTAsIDIwXSwgeyByYWRpdXM6IDEwIH0sIGZ1bmN0aW9uKGVyciwgZmVhdHVyZXMpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGZlYXR1cmVzKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBmZWF0dXJlc0F0OiBmdW5jdGlvbihwb2ludCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgY29vcmQgPSB0aGlzLnRyYW5zZm9ybS5wb2ludENvb3JkaW5hdGUoUG9pbnQuY29udmVydChwb2ludCkpO1xuICAgICAgICB0aGlzLnN0eWxlLmZlYXR1cmVzQXQoY29vcmQsIHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgdGhlIG1hcCdzIHN0eWxlIG9iamVjdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlIEEgc3R5bGUgb2JqZWN0IGZvcm1hdHRlZCBhcyBKU09OXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0U3R5bGU6IGZ1bmN0aW9uKHN0eWxlKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlXG4gICAgICAgICAgICAgICAgLm9mZignbG9hZCcsIHRoaXMuX29uU3R5bGVMb2FkKVxuICAgICAgICAgICAgICAgIC5vZmYoJ2Vycm9yJywgdGhpcy5fZm9yd2FyZFN0eWxlRXZlbnQpXG4gICAgICAgICAgICAgICAgLm9mZignY2hhbmdlJywgdGhpcy5fb25TdHlsZUNoYW5nZSlcbiAgICAgICAgICAgICAgICAub2ZmKCdzb3VyY2UuYWRkJywgdGhpcy5fb25Tb3VyY2VBZGQpXG4gICAgICAgICAgICAgICAgLm9mZignc291cmNlLnJlbW92ZScsIHRoaXMuX29uU291cmNlUmVtb3ZlKVxuICAgICAgICAgICAgICAgIC5vZmYoJ3NvdXJjZS5sb2FkJywgdGhpcy5fb25Tb3VyY2VVcGRhdGUpXG4gICAgICAgICAgICAgICAgLm9mZignc291cmNlLmVycm9yJywgdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KVxuICAgICAgICAgICAgICAgIC5vZmYoJ3NvdXJjZS5jaGFuZ2UnLCB0aGlzLl9vblNvdXJjZVVwZGF0ZSlcbiAgICAgICAgICAgICAgICAub2ZmKCdsYXllci5hZGQnLCB0aGlzLl9mb3J3YXJkTGF5ZXJFdmVudClcbiAgICAgICAgICAgICAgICAub2ZmKCdsYXllci5yZW1vdmUnLCB0aGlzLl9mb3J3YXJkTGF5ZXJFdmVudClcbiAgICAgICAgICAgICAgICAub2ZmKCd0aWxlLmFkZCcsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAgICAgLm9mZigndGlsZS5yZW1vdmUnLCB0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KVxuICAgICAgICAgICAgICAgIC5vZmYoJ3RpbGUubG9hZCcsIHRoaXMudXBkYXRlKVxuICAgICAgICAgICAgICAgIC5vZmYoJ3RpbGUuZXJyb3InLCB0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KVxuICAgICAgICAgICAgICAgIC5fcmVtb3ZlKCk7XG5cbiAgICAgICAgICAgIHRoaXMub2ZmKCdyb3RhdGUnLCB0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KTtcbiAgICAgICAgICAgIHRoaXMub2ZmKCdwaXRjaCcsIHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChzdHlsZSBpbnN0YW5jZW9mIFN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlID0gbmV3IFN0eWxlKHN0eWxlLCB0aGlzLmFuaW1hdGlvbkxvb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdHlsZVxuICAgICAgICAgICAgLm9uKCdsb2FkJywgdGhpcy5fb25TdHlsZUxvYWQpXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgdGhpcy5fZm9yd2FyZFN0eWxlRXZlbnQpXG4gICAgICAgICAgICAub24oJ2NoYW5nZScsIHRoaXMuX29uU3R5bGVDaGFuZ2UpXG4gICAgICAgICAgICAub24oJ3NvdXJjZS5hZGQnLCB0aGlzLl9vblNvdXJjZUFkZClcbiAgICAgICAgICAgIC5vbignc291cmNlLnJlbW92ZScsIHRoaXMuX29uU291cmNlUmVtb3ZlKVxuICAgICAgICAgICAgLm9uKCdzb3VyY2UubG9hZCcsIHRoaXMuX29uU291cmNlVXBkYXRlKVxuICAgICAgICAgICAgLm9uKCdzb3VyY2UuZXJyb3InLCB0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQpXG4gICAgICAgICAgICAub24oJ3NvdXJjZS5jaGFuZ2UnLCB0aGlzLl9vblNvdXJjZVVwZGF0ZSlcbiAgICAgICAgICAgIC5vbignbGF5ZXIuYWRkJywgdGhpcy5fZm9yd2FyZExheWVyRXZlbnQpXG4gICAgICAgICAgICAub24oJ2xheWVyLnJlbW92ZScsIHRoaXMuX2ZvcndhcmRMYXllckV2ZW50KVxuICAgICAgICAgICAgLm9uKCd0aWxlLmFkZCcsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAub24oJ3RpbGUucmVtb3ZlJywgdGhpcy5fZm9yd2FyZFRpbGVFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5sb2FkJywgdGhpcy51cGRhdGUpXG4gICAgICAgICAgICAub24oJ3RpbGUuZXJyb3InLCB0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KTtcblxuICAgICAgICB0aGlzLm9uKCdyb3RhdGUnLCB0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KTtcbiAgICAgICAgdGhpcy5vbigncGl0Y2gnLCB0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc291cmNlIHRvIHRoZSBtYXAgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgb2YgdGhlIHNvdXJjZS4gTXVzdCBub3QgYmUgdXNlZCBieSBhbnkgZXhpc3Rpbmcgc291cmNlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2Ugc291cmNlIHNwZWNpZmljYXRpb24sIGZvbGxvd2luZyB0aGVcbiAgICAgKiBbTWFwYm94IEdMIFN0eWxlIFJlZmVyZW5jZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcylcbiAgICAgKiBAZmlyZXMgc291cmNlLmFkZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGFkZFNvdXJjZTogZnVuY3Rpb24oaWQsIHNvdXJjZSkge1xuICAgICAgICB0aGlzLnN0eWxlLmFkZFNvdXJjZShpZCwgc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyBzb3VyY2UgZnJvbSB0aGUgbWFwIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIG9mIHRoZSBzb3VyY2UgdG8gcmVtb3ZlXG4gICAgICogQGZpcmVzIHNvdXJjZS5yZW1vdmVcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2U6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlU291cmNlKGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgc3R5bGUgc291cmNlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBgaWRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIHNvdXJjZSBJRFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0U291cmNlOiBmdW5jdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRTb3VyY2UoaWQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYXllciB0byB0aGUgbWFwIHN0eWxlLiBUaGUgbGF5ZXIgd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIGxheWVyIHdpdGhcbiAgICAgKiBJRCBgYmVmb3JlYCwgb3IgYXBwZW5kZWQgaWYgYGJlZm9yZWAgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1N0eWxlTGF5ZXJ8T2JqZWN0fSBsYXllclxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYmVmb3JlICBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgYmVmb3JlXG4gICAgICogQGZpcmVzIGxheWVyLmFkZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGFkZExheWVyOiBmdW5jdGlvbihsYXllciwgYmVmb3JlKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuYWRkTGF5ZXIobGF5ZXIsIGJlZm9yZSk7XG4gICAgICAgIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGxheWVyIHdpdGggdGhlIGdpdmVuIGBpZGAgZnJvbSB0aGUgbWFwLiBBbnkgbGF5ZXJzIHdoaWNoIHJlZmVyIHRvIHRoZVxuICAgICAqIHNwZWNpZmllZCBsYXllciB2aWEgYSBgcmVmYCBwcm9wZXJ0eSBhcmUgYWxzbyByZW1vdmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGxheWVyIGlkXG4gICAgICogQGZpcmVzIGxheWVyLnJlbW92ZVxuICAgICAqIEByZXR1cm5zIHtNYXB9IHRoaXNcbiAgICAgKi9cbiAgICByZW1vdmVMYXllcjogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVMYXllcihpZCk7XG4gICAgICAgIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZpbHRlciBmb3IgYSBnaXZlbiBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBJRCBvZiBhIGxheWVyXG4gICAgICogQHBhcmFtIHtBcnJheX0gZmlsdGVyIGZpbHRlciBzcGVjaWZpY2F0aW9uLCBhcyBkZWZpbmVkIGluIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jZmlsdGVyKVxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldEZpbHRlcjogZnVuY3Rpb24obGF5ZXIsIGZpbHRlcikge1xuICAgICAgICB0aGlzLnN0eWxlLnNldEZpbHRlcihsYXllciwgZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZmlsdGVyIGZvciBhIGdpdmVuIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIElEIG9mIGEgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGZpbHRlciBzcGVjaWZpY2F0aW9uLCBhcyBkZWZpbmVkIGluIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jZmlsdGVyKVxuICAgICAqL1xuICAgIGdldEZpbHRlcjogZnVuY3Rpb24obGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0RmlsdGVyKGxheWVyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHBhaW50IHByb3BlcnR5IGluIGEgZ2l2ZW4gc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXIgSUQgb2YgYSBsYXllclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgYSBwYWludCBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgdmFsdWUgZm9yIHRoZSBwYWludCBwcm9wZXJ5OyBtdXN0IGhhdmUgdGhlIHR5cGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm9wZXJ0eSBhcyBkZWZpbmVkIGluIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8pXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBrbGFzcyBvcHRpb25hbCBjbGFzcyBzcGVjaWZpZXIgZm9yIHRoZSBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFBhaW50UHJvcGVydHk6IGZ1bmN0aW9uKGxheWVyLCBuYW1lLCB2YWx1ZSwga2xhc3MpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRQYWludFByb3BlcnR5KGxheWVyLCBuYW1lLCB2YWx1ZSwga2xhc3MpO1xuICAgICAgICB0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBwYWludCBwcm9wZXJ0eSBpbiBhIGdpdmVuIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIElEIG9mIGEgbGF5ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIGEgcGFpbnQgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0ge3N0cmluZz19IGtsYXNzIG9wdGlvbmFsIGNsYXNzIHNwZWNpZmllciBmb3IgdGhlIHByb3BlcnR5XG4gICAgICogQHJldHVybnMgeyp9IHZhbHVlIGZvciB0aGUgcGFpbnQgcHJvcGVyeVxuICAgICAqL1xuICAgIGdldFBhaW50UHJvcGVydHk6IGZ1bmN0aW9uKGxheWVyLCBuYW1lLCBrbGFzcykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRQYWludFByb3BlcnR5KGxheWVyLCBuYW1lLCBrbGFzcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYSBsYXlvdXQgcHJvcGVydHkgaW4gYSBnaXZlbiBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBJRCBvZiBhIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiBhIGxheW91dCBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgdmFsdWUgZm9yIHRoZSBsYXlvdXQgcHJvcGVyeTsgbXVzdCBoYXZlIHRoZSB0eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvcGVydHkgYXMgZGVmaW5lZCBpbiB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKVxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldExheW91dFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRMYXlvdXRQcm9wZXJ0eShsYXllciwgbmFtZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIGxheW91dCBwcm9wZXJ0eSBpbiBhIGdpdmVuIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIElEIG9mIGEgbGF5ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIGEgbGF5b3V0IHByb3BlcnR5XG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBrbGFzcyBvcHRpb25hbCBjbGFzcyBzcGVjaWZpZXIgZm9yIHRoZSBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIHsqfSB2YWx1ZSBmb3IgdGhlIGxheW91dCBwcm9wZXJ5XG4gICAgICovXG4gICAgZ2V0TGF5b3V0UHJvcGVydHk6IGZ1bmN0aW9uKGxheWVyLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldExheW91dFByb3BlcnR5KGxheWVyLCBuYW1lKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBNYXAncyBjb250YWluZXIgYXMgYW4gSFRNTCBlbGVtZW50XG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBjb250YWluZXJcbiAgICAgKi9cbiAgICBnZXRDb250YWluZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNvbnRhaW5lciBmb3IgdGhlIG1hcCBgY2FudmFzYCBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gYWRkIG5vbi1HTCBvdmVybGF5cyB0byB0aGUgbWFwLCB5b3Ugc2hvdWxkIGFwcGVuZCB0aGVtIHRvIHRoaXMgZWxlbWVudC4gVGhpc1xuICAgICAqIGlzIHRoZSBlbGVtZW50IHRvIHdoaWNoIGV2ZW50IGJpbmRpbmdzIGZvciBtYXAgaW50ZXJhY3Rpdml0eSBzdWNoIGFzIHBhbm5pbmcgYW5kIHpvb21pbmcgYXJlXG4gICAgICogYXR0YWNoZWQuIEl0IHdpbGwgcmVjZWl2ZSBidWJibGVkIGV2ZW50cyBmb3IgY2hpbGQgZWxlbWVudHMgc3VjaCBhcyB0aGUgYGNhbnZhc2AsIGJ1dCBub3QgZm9yXG4gICAgICogbWFwIGNvbnRyb2xzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBjb250YWluZXJcbiAgICAgKi9cbiAgICBnZXRDYW52YXNDb250YWluZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FudmFzQ29udGFpbmVyO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIE1hcCdzIGNhbnZhcyBhcyBhbiBIVE1MIGNhbnZhc1xuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gY2FudmFzXG4gICAgICovXG4gICAgZ2V0Q2FudmFzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhcy5nZXRFbGVtZW50KCk7XG4gICAgfSxcblxuICAgIF9zZXR1cENvbnRhaW5lcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXMub3B0aW9ucy5jb250YWluZXI7XG5cbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lciA9IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgOiBpZDtcbiAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLW1hcCcpO1xuXG4gICAgICAgIHZhciBjYW52YXNDb250YWluZXIgPSB0aGlzLl9jYW52YXNDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY2FudmFzLWNvbnRhaW5lcicsIGNvbnRhaW5lcik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIGNhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1pbnRlcmFjdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhbnZhcyA9IG5ldyBDYW52YXModGhpcywgY2FudmFzQ29udGFpbmVyKTtcblxuICAgICAgICB2YXIgY29udHJvbENvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jb250cm9sLWNvbnRhaW5lcicsIGNvbnRhaW5lcik7XG4gICAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5fY29udHJvbENvcm5lcnMgPSB7fTtcbiAgICAgICAgWyd0b3AtbGVmdCcsICd0b3AtcmlnaHQnLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0J10uZm9yRWFjaChmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgICAgICBjb3JuZXJzW3Bvc10gPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybC0nICsgcG9zLCBjb250cm9sQ29udGFpbmVyKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIF9zZXR1cFBhaW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZ2wgPSB0aGlzLl9jYW52YXMuZ2V0V2ViR0xDb250ZXh0KHtcbiAgICAgICAgICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IHRoaXMub3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0LFxuICAgICAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0aGlzLm9wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZ2wpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIFdlYkdMJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhaW50ZXIgPSBuZXcgR0xQYWludGVyKGdsLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgfSxcblxuICAgIF9jb250ZXh0TG9zdDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1lSWQpIHtcbiAgICAgICAgICAgIGJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2NvbnRleHRSZXN0b3JlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX3NldHVwUGFpbnRlcigpO1xuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJcyB0aGlzIG1hcCBmdWxseSBsb2FkZWQ/IElmIHRoZSBzdHlsZSBpc24ndCBsb2FkZWRcbiAgICAgKiBvciBpdCBoYXMgYSBjaGFuZ2UgdG8gdGhlIHNvdXJjZXMgb3Igc3R5bGUgdGhhdCBpc24ndFxuICAgICAqIHByb3BhZ2F0ZWQgdG8gaXRzIHN0eWxlLCByZXR1cm4gZmFsc2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgbWFwIGlzIGxvYWRlZFxuICAgICAqL1xuICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdHlsZURpcnR5IHx8IHRoaXMuX3NvdXJjZXNEaXJ0eSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgIXRoaXMuc3R5bGUubG9hZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhpcyBtYXAncyBzdHlsZSBhbmQgcmUtcmVuZGVyIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdXBkYXRlU3R5bGUgbmV3IHN0eWxlXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24odXBkYXRlU3R5bGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0eWxlKSByZXR1cm4gdGhpcztcblxuICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gdGhpcy5fc3R5bGVEaXJ0eSB8fCB1cGRhdGVTdHlsZTtcbiAgICAgICAgdGhpcy5fc291cmNlc0RpcnR5ID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl9yZXJlbmRlcigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHdoZW4gYSAocmUtKXJlbmRlciBvZiB0aGUgbWFwIGlzIHJlcXVpcmVkLCBlLmcuIHdoZW4gdGhlXG4gICAgICogdXNlciBwYW5uZWQgb3Igem9vbWVkLGYgb3IgbmV3IGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IHRoaXNcbiAgICAgKi9cbiAgICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLl9zdHlsZURpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLl9yZWNhbGN1bGF0ZSh0aGlzLnRyYW5zZm9ybS56b29tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmIHRoaXMuX3NvdXJjZXNEaXJ0eSAmJiAhdGhpcy5fc291cmNlc0RpcnR5VGltZW91dCkge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlc0RpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgNTApO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5fdXBkYXRlU291cmNlcyh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhaW50ZXIucmVuZGVyKHRoaXMuc3R5bGUsIHtcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnLFxuICAgICAgICAgICAgdmVydGljZXM6IHRoaXMudmVydGljZXMsXG4gICAgICAgICAgICByb3RhdGluZzogdGhpcy5yb3RhdGluZyxcbiAgICAgICAgICAgIHpvb21pbmc6IHRoaXMuem9vbWluZ1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpcmUoJ3JlbmRlcicpO1xuXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCgpICYmICF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2xvYWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuXG4gICAgICAgIGlmICghdGhpcy5hbmltYXRpb25Mb29wLnN0b3BwZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fc3R5bGVEaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc291cmNlc0RpcnR5IHx8IHRoaXMuX3JlcGFpbnQgfHwgIXRoaXMuYW5pbWF0aW9uTG9vcC5zdG9wcGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcmVuZGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhlIG1hcCdzIHVuZGVybHlpbmcgcmVzb3VyY2VzLCBpbmNsdWRpbmcgd2ViIHdvcmtlcnMuXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNoKSB0aGlzLl9oYXNoLnJlbW92ZSgpO1xuICAgICAgICBicm93c2VyLmNhbmNlbEZyYW1lKHRoaXMuX2ZyYW1lSWQpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc291cmNlc0RpcnR5VGltZW91dCk7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUobnVsbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcmVyZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiAhdGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVJZCA9IGJyb3dzZXIuZnJhbWUodGhpcy5yZW5kZXIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9mb3J3YXJkU3R5bGVFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICB0aGlzLmZpcmUoJ3N0eWxlLicgKyBlLnR5cGUsIHV0aWwuZXh0ZW5kKHtzdHlsZTogZS50YXJnZXR9LCBlKSk7XG4gICAgfSxcblxuICAgIF9mb3J3YXJkU291cmNlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy5maXJlKGUudHlwZSwgdXRpbC5leHRlbmQoe3N0eWxlOiBlLnRhcmdldH0sIGUpKTtcbiAgICB9LFxuXG4gICAgX2ZvcndhcmRMYXllckV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRoaXMuZmlyZShlLnR5cGUsIHV0aWwuZXh0ZW5kKHtzdHlsZTogZS50YXJnZXR9LCBlKSk7XG4gICAgfSxcblxuICAgIF9mb3J3YXJkVGlsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRoaXMuZmlyZShlLnR5cGUsIHV0aWwuZXh0ZW5kKHtzdHlsZTogZS50YXJnZXR9LCBlKSk7XG4gICAgfSxcblxuICAgIF9vblN0eWxlTG9hZDogZnVuY3Rpb24oZSkge1xuICAgICAgICB0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMsIHt0cmFuc2l0aW9uOiBmYWxzZX0pO1xuICAgICAgICB0aGlzLl9mb3J3YXJkU3R5bGVFdmVudChlKTtcbiAgICB9LFxuXG4gICAgX29uU3R5bGVDaGFuZ2U6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGUodHJ1ZSk7XG4gICAgICAgIHRoaXMuX2ZvcndhcmRTdHlsZUV2ZW50KGUpO1xuICAgIH0sXG5cbiAgICBfb25Tb3VyY2VBZGQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGUuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlLm9uQWRkKVxuICAgICAgICAgICAgc291cmNlLm9uQWRkKHRoaXMpO1xuICAgICAgICB0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQoZSk7XG4gICAgfSxcblxuICAgIF9vblNvdXJjZVJlbW92ZTogZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgc291cmNlID0gZS5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2Uub25SZW1vdmUpXG4gICAgICAgICAgICBzb3VyY2Uub25SZW1vdmUodGhpcyk7XG4gICAgICAgIHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudChlKTtcbiAgICB9LFxuXG4gICAgX29uU291cmNlVXBkYXRlOiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudChlKTtcbiAgICB9XG59KTtcblxudXRpbC5leHRlbmRBbGwoTWFwLnByb3RvdHlwZSwge1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGRlYnVnZ2luZyBtb2RlXG4gICAgICpcbiAgICAgKiBAbmFtZSBkZWJ1Z1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBfZGVidWc6IGZhbHNlLFxuICAgIGdldCBkZWJ1ZygpIHsgcmV0dXJuIHRoaXMuX2RlYnVnOyB9LFxuICAgIHNldCBkZWJ1Zyh2YWx1ZSkgeyB0aGlzLl9kZWJ1ZyA9IHZhbHVlOyB0aGlzLnVwZGF0ZSgpOyB9LFxuXG4gICAgLyoqXG4gICAgICogU2hvdyBjb2xsaXNpb24gYm94ZXM6IHVzZWZ1bCBmb3IgZGVidWdnaW5nIGxhYmVsIHBsYWNlbWVudFxuICAgICAqIGluIHN0eWxlcy5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNvbGxpc2lvbkRlYnVnXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIF9jb2xsaXNpb25EZWJ1ZzogZmFsc2UsXG4gICAgZ2V0IGNvbGxpc2lvbkRlYnVnKCkgeyByZXR1cm4gdGhpcy5fY29sbGlzaW9uRGVidWc7IH0sXG4gICAgc2V0IGNvbGxpc2lvbkRlYnVnKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbGxpc2lvbkRlYnVnID0gdmFsdWU7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5zdHlsZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHlsZS5zb3VyY2VzW2ldLnJlbG9hZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuc291cmNlc1tpXS5yZWxvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgY29udGludW91cyByZXBhaW50IHRvIGFuYWx5emUgcGVyZm9ybWFuY2VcbiAgICAgKlxuICAgICAqIEBuYW1lIHJlcGFpbnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgX3JlcGFpbnQ6IGZhbHNlLFxuICAgIGdldCByZXBhaW50KCkgeyByZXR1cm4gdGhpcy5fcmVwYWludDsgfSxcbiAgICBzZXQgcmVwYWludCh2YWx1ZSkgeyB0aGlzLl9yZXBhaW50ID0gdmFsdWU7IHRoaXMudXBkYXRlKCk7IH0sXG5cbiAgICAvLyBzaG93IHZlcnRpY2VzXG4gICAgX3ZlcnRpY2VzOiBmYWxzZSxcbiAgICBnZXQgdmVydGljZXMoKSB7IHJldHVybiB0aGlzLl92ZXJ0aWNlczsgfSxcbiAgICBzZXQgdmVydGljZXModmFsdWUpIHsgdGhpcy5fdmVydGljZXMgPSB2YWx1ZTsgdGhpcy51cGRhdGUoKTsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9wdXA7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIERPTSA9IHJlcXVpcmUoJy4uL3V0aWwvZG9tJyk7XG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi4vZ2VvL2xhdF9sbmcnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcG9wdXAgY29tcG9uZW50XG4gKiBAY2xhc3MgUG9wdXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuY2xvc2VCdXR0b25cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5jbG9zZU9uQ2xpY2tcbiAqIEBleGFtcGxlXG4gKiB2YXIgdG9vbHRpcCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gKiAgIC5zZXRMYXRMbmcobWFwLnVucHJvamVjdChlLnBvaW50KSlcbiAqICAgLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIilcbiAqICAgLmFkZFRvKG1hcCk7XG4gKi9cbmZ1bmN0aW9uIFBvcHVwKG9wdGlvbnMpIHtcbiAgICB1dGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgJ191cGRhdGVQb3NpdGlvbicsXG4gICAgICAgICdfb25DbGlja0Nsb3NlJ10sXG4gICAgICAgIHRoaXMpO1xufVxuXG5Qb3B1cC5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoRXZlbnRlZCwgLyoqIEBsZW5kcyBQb3B1cC5wcm90b3R5cGUgKi97XG4gICAgb3B0aW9uczoge1xuICAgICAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY2xvc2VPbkNsaWNrOiB0cnVlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIHRoZSBwb3B1cCB0byBhIG1hcFxuICAgICAqIEBwYXJhbSB7TWFwfSBtYXBcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGFkZFRvOiBmdW5jdGlvbihtYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGVQb3NpdGlvbik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fb25DbGlja0Nsb3NlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHBvcHVwIGZyb20gdGhlIG1hcFxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKCkuYWRkVG8obWFwKTtcbiAgICAgKiBwb3B1cC5yZW1vdmUoKTtcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlUG9zaXRpb24pO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignY2xpY2snLCB0aGlzLl9vbkNsaWNrQ2xvc2UpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgY29vcmRpbmF0ZXMgb2YgcG9wdXAgZWxlbWVudCByZWxhdGl2ZSB0byBtYXBcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nfVxuICAgICAqL1xuICAgIGdldExhdExuZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXRMbmc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY29vcmRpbmF0ZXMgb2YgYSBwb3B1cCBlbGVtZW50IHRvIGEgbWFwXG4gICAgICogQHBhcmFtIHtMYXRMbmd9IGxhdGxuZ1xuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0TGF0TG5nOiBmdW5jdGlvbihsYXRsbmcpIHtcbiAgICAgICAgdGhpcy5fbGF0TG5nID0gTGF0TG5nLmNvbnZlcnQobGF0bG5nKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWxsIGEgcG9wdXAgZWxlbWVudCB3aXRoIHRleHQgb25seSBjb250ZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFRleHQ6IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuICAgICAgICB0aGlzLl91cGRhdGVDb250ZW50KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWxsIGEgcG9wdXAgZWxlbWVudCB3aXRoIEhUTUwgY29udGVudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRIVE1MOiBmdW5jdGlvbihodG1sKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICAgICAgdmFyIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5JyksIGNoaWxkO1xuICAgICAgICB0ZW1wLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjaGlsZCA9IHRlbXAuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGlmICghY2hpbGQpIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5fY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVDb250ZW50KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXApIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1wb3B1cCcsIHRoaXMuX21hcC5nZXRDb250YWluZXIoKSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3RpcCAgICAgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtcG9wdXAtdGlwJywgICAgIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLl93cmFwcGVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwLWNvbnRlbnQnLCB0aGlzLl9jb250YWluZXIpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24gPSBET00uY3JlYXRlKCdidXR0b24nLCAnbWFwYm94Z2wtcG9wdXAtY2xvc2UtYnV0dG9uJywgdGhpcy5fd3JhcHBlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uaW5uZXJIVE1MID0gJyYjMjE1Oyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrQ2xvc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGVudCgpO1xuICAgICAgICB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlQ29udGVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29udGVudCB8fCAhdGhpcy5fY29udGFpbmVyKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5fd3JhcHBlcjtcblxuICAgICAgICB3aGlsZSAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5fY2xvc2VCdXR0b24pO1xuICAgICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRlbnQpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhdExuZyB8fCAhdGhpcy5fY29udGFpbmVyKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHZhciBwb3MgPSB0aGlzLl9tYXAucHJvamVjdCh0aGlzLl9sYXRMbmcpLnJvdW5kKCksXG4gICAgICAgICAgICBhbmNob3IgPSB0aGlzLm9wdGlvbnMuYW5jaG9yO1xuXG4gICAgICAgIGlmICghYW5jaG9yKSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSB0aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodDtcblxuICAgICAgICAgICAgaWYgKHBvcy55IDwgaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gWyd0b3AnXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zLnkgPiB0aGlzLl9tYXAudHJhbnNmb3JtLmhlaWdodCAtIGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IFsnYm90dG9tJ107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocG9zLnggPCB3aWR0aCAvIDIpIHtcbiAgICAgICAgICAgICAgICBhbmNob3IucHVzaCgnbGVmdCcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MueCA+IHRoaXMuX21hcC50cmFuc2Zvcm0ud2lkdGggLSB3aWR0aCAvIDIpIHtcbiAgICAgICAgICAgICAgICBhbmNob3IucHVzaCgncmlnaHQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFuY2hvci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBhbmNob3IgPSAnYm90dG9tJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gYW5jaG9yLmpvaW4oJy0nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFuY2hvciA9IGFuY2hvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhbmNob3JUcmFuc2xhdGUgPSB7XG4gICAgICAgICAgICAndG9wJzogJ3RyYW5zbGF0ZSgtNTAlLDApJyxcbiAgICAgICAgICAgICd0b3AtbGVmdCc6ICd0cmFuc2xhdGUoMCwwKScsXG4gICAgICAgICAgICAndG9wLXJpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwwKScsXG4gICAgICAgICAgICAnYm90dG9tJzogJ3RyYW5zbGF0ZSgtNTAlLC0xMDAlKScsXG4gICAgICAgICAgICAnYm90dG9tLWxlZnQnOiAndHJhbnNsYXRlKDAsLTEwMCUpJyxcbiAgICAgICAgICAgICdib3R0b20tcmlnaHQnOiAndHJhbnNsYXRlKC0xMDAlLC0xMDAlKScsXG4gICAgICAgICAgICAnbGVmdCc6ICd0cmFuc2xhdGUoMCwtNTAlKScsXG4gICAgICAgICAgICAncmlnaHQnOiAndHJhbnNsYXRlKC0xMDAlLC01MCUpJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBjbGFzc0xpc3QgPSB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0O1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gYW5jaG9yVHJhbnNsYXRlKSB7XG4gICAgICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1wb3B1cC1hbmNob3ItJyArIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtcG9wdXAtYW5jaG9yLScgKyBhbmNob3IpO1xuXG4gICAgICAgIERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fY29udGFpbmVyLCBhbmNob3JUcmFuc2xhdGVbYW5jaG9yXSArICcgdHJhbnNsYXRlKCcgKyBwb3MueCArICdweCwnICsgcG9zLnkgKyAncHgpJyk7XG4gICAgfSxcblxuICAgIF9vbkNsaWNrQ2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFjdG9yO1xuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbQWN0b3IgZGVzaWduIHBhdHRlcm5dKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWN0b3JfbW9kZWwpXG4gKiB0aGF0IG1haW50YWlucyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYXN5bmNocm9ub3VzIHRhc2tzIGFuZCB0aGUgb2JqZWN0c1xuICogdGhhdCBzcGluIHRoZW0gb2ZmIC0gaW4gdGhpcyBjYXNlLCB0YXNrcyBsaWtlIHBhcnNpbmcgcGFydHMgb2Ygc3R5bGVzLFxuICogb3duZWQgYnkgdGhlIHN0eWxlc1xuICpcbiAqIEBwYXJhbSB7V2ViV29ya2VyfSB0YXJnZXRcbiAqIEBwYXJhbSB7V2ViV29ya2VyfSBwYXJlbnRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEFjdG9yKHRhcmdldCwgcGFyZW50KSB7XG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5jYWxsYmFja3MgPSB7fTtcbiAgICB0aGlzLmNhbGxiYWNrSUQgPSAwO1xuICAgIHRoaXMucmVjZWl2ZSA9IHRoaXMucmVjZWl2ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUsIGZhbHNlKTtcbn1cblxuQWN0b3IucHJvdG90eXBlLnJlY2VpdmUgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgdmFyIGRhdGEgPSBtZXNzYWdlLmRhdGEsXG4gICAgICAgIGNhbGxiYWNrO1xuXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJzxyZXNwb25zZT4nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gdGhpcy5jYWxsYmFja3NbZGF0YS5pZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tkYXRhLmlkXTtcbiAgICAgICAgY2FsbGJhY2soZGF0YS5lcnJvciB8fCBudWxsLCBkYXRhLmRhdGEpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBpZCA9IGRhdGEuaWQ7XG4gICAgICAgIHRoaXMucGFyZW50W2RhdGEudHlwZV0oZGF0YS5kYXRhLCBmdW5jdGlvbihlcnIsIGRhdGEsIGJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICc8cmVzcG9uc2U+JyxcbiAgICAgICAgICAgICAgICBpZDogU3RyaW5nKGlkKSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyID8gU3RyaW5nKGVycikgOiBudWxsLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgICAgIH0sIGJ1ZmZlcnMpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGFyZW50W2RhdGEudHlwZV0oZGF0YS5kYXRhKTtcbiAgICB9XG59O1xuXG5BY3Rvci5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIGNhbGxiYWNrLCBidWZmZXJzKSB7XG4gICAgdmFyIGlkID0gbnVsbDtcbiAgICBpZiAoY2FsbGJhY2spIHRoaXMuY2FsbGJhY2tzW2lkID0gdGhpcy5jYWxsYmFja0lEKytdID0gY2FsbGJhY2s7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSh7IHR5cGU6IHR5cGUsIGlkOiBTdHJpbmcoaWQpLCBkYXRhOiBkYXRhIH0sIGJ1ZmZlcnMpO1xufTtcblxuLyoqXG4gKiBXcmFwcGVkIHBvc3RNZXNzYWdlIEFQSSB0aGF0IGFic3RyYWN0cyBhcm91bmQgSUUncyBsYWNrIG9mXG4gKiBgdHJhbnNmZXJMaXN0YCBzdXBwb3J0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlXG4gKiBAcGFyYW0ge09iamVjdH0gdHJhbnNmZXJMaXN0XG4gKi9cbkFjdG9yLnByb3RvdHlwZS5wb3N0TWVzc2FnZSA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHRyYW5zZmVyTGlzdCkge1xuICAgIHRyeSB7XG4gICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVyTGlzdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLnRhcmdldC5wb3N0TWVzc2FnZShtZXNzYWdlKTsgLy8gTm8gc3VwcG9ydCBmb3IgdHJhbnNmZXJMaXN0IG9uIElFXG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5nZXRKU09OID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgY2FsbGJhY2soZSk7XG4gICAgfTtcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwICYmIHhoci5yZXNwb25zZSkge1xuICAgICAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKHhoci5zdGF0dXNUZXh0KSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHhoci5zZW5kKCk7XG4gICAgcmV0dXJuIHhocjtcbn07XG5cbmV4cG9ydHMuZ2V0QXJyYXlCdWZmZXIgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgICBjYWxsYmFjayhlKTtcbiAgICB9O1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDAgJiYgeGhyLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB4aHIucmVzcG9uc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKHhoci5zdGF0dXNUZXh0KSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHhoci5zZW5kKCk7XG4gICAgcmV0dXJuIHhocjtcbn07XG5cbmV4cG9ydHMuZ2V0SW1hZ2UgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgIGltZy5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xuICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgaW1nKTtcbiAgICB9O1xuICAgIGltZy5zcmMgPSB1cmw7XG4gICAgaW1nLmdldERhdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgICByZXR1cm4gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KS5kYXRhO1xuICAgIH07XG4gICAgcmV0dXJuIGltZztcbn07XG5cbmV4cG9ydHMuZ2V0VmlkZW8gPSBmdW5jdGlvbih1cmxzLCBjYWxsYmFjaykge1xuICAgIHZhciB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgdmlkZW8uY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICB2aWRlby5vbmxvYWRzdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB2aWRlbyk7XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzb3VyY2UnKTtcbiAgICAgICAgcy5zcmMgPSB1cmxzW2ldO1xuICAgICAgICB2aWRlby5hcHBlbmRDaGlsZChzKTtcbiAgICB9XG4gICAgdmlkZW8uZ2V0RGF0YSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdmlkZW87IH07XG4gICAgcmV0dXJuIHZpZGVvO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENhbnZhcyA9IHJlcXVpcmUoJy4vY2FudmFzJyk7XG5cbnZhciBmcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZTtcblxuZXhwb3J0cy5mcmFtZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgcmV0dXJuIGZyYW1lKGZuKTtcbn07XG5cbnZhciBjYW5jZWwgPSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubXNDYW5jZWxBbmltYXRpb25GcmFtZTtcblxuZXhwb3J0cy5jYW5jZWxGcmFtZSA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgY2FuY2VsKGlkKTtcbn07XG5cbmV4cG9ydHMudGltZWQgPSBmdW5jdGlvbiAoZm4sIGR1ciwgY3R4KSB7XG4gICAgaWYgKCFkdXIpIHtcbiAgICAgICAgZm4uY2FsbChjdHgsIDEpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgYWJvcnQgPSBmYWxzZSxcbiAgICAgICAgc3RhcnQgPSB3aW5kb3cucGVyZm9ybWFuY2UgPyB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgOiBEYXRlLm5vdygpO1xuXG4gICAgZnVuY3Rpb24gdGljayhub3cpIHtcbiAgICAgICAgaWYgKGFib3J0KSByZXR1cm47XG4gICAgICAgIGlmICghd2luZG93LnBlcmZvcm1hbmNlKSBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGlmIChub3cgPj0gc3RhcnQgKyBkdXIpIHtcbiAgICAgICAgICAgIGZuLmNhbGwoY3R4LCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZuLmNhbGwoY3R4LCAobm93IC0gc3RhcnQpIC8gZHVyKTtcbiAgICAgICAgICAgIGV4cG9ydHMuZnJhbWUodGljayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleHBvcnRzLmZyYW1lKHRpY2spO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyBhYm9ydCA9IHRydWU7IH07XG59O1xuXG4vKipcbiAqIFRlc3Qgd2hldGhlciB0aGUgYmFzaWMgSmF2YVNjcmlwdCBhbmQgRE9NIGZlYXR1cmVzIHJlcXVpcmVkIGZvciBNYXBib3ggR0wgYXJlIHByZXNlbnQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBJZiBgdHJ1ZWAsIG1hcCBjcmVhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIGltcGxlbWVudGF0aW9uIGRldGVybWluZXMgdGhhdCB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGNyZWF0ZWQgV2ViR0wgY29udGV4dCB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgbG93ZXIgdGhhbiBleHBlY3RlZC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBNYXBib3ggR0wgc2hvdWxkIGJlIGV4cGVjdGVkIHRvIHdvcmssIGFuZCBmYWxzZSBpZiBub3QuXG4gKi9cbmV4cG9ydHMuc3VwcG9ydGVkID0gZnVuY3Rpb24ob3B0aW9ucykge1xuXG4gICAgdmFyIHN1cHBvcnRzID0gW1xuXG4gICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7IH0sXG5cbiAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnOyB9LFxuXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAhIShBcnJheS5wcm90b3R5cGUgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuZmlsdGVyICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2ggJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiAmJlxuICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZiAmJlxuICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5tYXAgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuc29tZSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KTtcbiAgICAgICAgfSxcblxuICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAhIShGdW5jdGlvbi5wcm90b3R5cGUgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpICYmXG4gICAgICAgICAgICAgICAgISEoT2JqZWN0LmtleXMgJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmNyZWF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmlzU2VhbGVkICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5pc0Zyb3plbiAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuaXNFeHRlbnNpYmxlICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5zZWFsICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5mcmVlemUgJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKTtcbiAgICAgICAgfSxcblxuICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAnSlNPTicgaW4gd2luZG93ICYmICdwYXJzZScgaW4gSlNPTiAmJiAnc3RyaW5naWZ5JyBpbiBKU09OO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDYW52YXMoKS5zdXBwb3J0c1dlYkdMQ29udGV4dCgob3B0aW9ucyAmJiBvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpIHx8IGZhbHNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuICdXb3JrZXInIGluIHdpbmRvdzsgfVxuICAgIF07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1cHBvcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghc3VwcG9ydHNbaV0oKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydHMuaGFyZHdhcmVDb25jdXJyZW5jeSA9IG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5IHx8IDg7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnZGV2aWNlUGl4ZWxSYXRpbycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW87IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDYW52YXM7XG5cbmZ1bmN0aW9uIENhbnZhcyhwYXJlbnQsIGNvbnRhaW5lcikge1xuICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cbiAgICBpZiAocGFyZW50ICYmIGNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY2FudmFzLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNhbnZhcycpO1xuICAgICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgcGFyZW50Ll9jb250ZXh0TG9zdC5iaW5kKHBhcmVudCksIGZhbHNlKTtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCBwYXJlbnQuX2NvbnRleHRSZXN0b3JlZC5iaW5kKHBhcmVudCksIGZhbHNlKTtcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIDApO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgIH1cbn1cblxuQ2FudmFzLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdmFyIHBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuXG4gICAgLy8gUmVxdWVzdCB0aGUgcmVxdWlyZWQgY2FudmFzIHNpemUgdGFraW5nIHRoZSBwaXhlbHJhdGlvIGludG8gYWNjb3VudC5cbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHBpeGVsUmF0aW8gKiB3aWR0aDtcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBwaXhlbFJhdGlvICogaGVpZ2h0O1xuXG4gICAgLy8gTWFpbnRhaW4gdGhlIHNhbWUgY2FudmFzIHNpemUsIHBvdGVudGlhbGx5IGRvd25zY2FsaW5nIGl0IGZvciBIaURQSSBkaXNwbGF5c1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG59O1xuXG52YXIgcmVxdWlyZWRDb250ZXh0QXR0cmlidXRlcyA9IHtcbiAgICBhbnRpYWxpYXM6IGZhbHNlLFxuICAgIGFscGhhOiB0cnVlLFxuICAgIHN0ZW5jaWw6IHRydWUsXG4gICAgZGVwdGg6IGZhbHNlXG59O1xuXG5DYW52YXMucHJvdG90eXBlLmdldFdlYkdMQ29udGV4dCA9IGZ1bmN0aW9uKGF0dHJpYnV0ZXMpIHtcbiAgICBhdHRyaWJ1dGVzID0gdXRpbC5leHRlbmQoe30sIGF0dHJpYnV0ZXMsIHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcyk7XG59O1xuXG5DYW52YXMucHJvdG90eXBlLnN1cHBvcnRzV2ViR0xDb250ZXh0ID0gZnVuY3Rpb24oZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCkge1xuICAgIHZhciBhdHRyaWJ1dGVzID0gdXRpbC5leHRlbmQoe1xuICAgICAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XG4gICAgfSwgcmVxdWlyZWRDb250ZXh0QXR0cmlidXRlcyk7XG5cbiAgICBpZiAoJ3Byb2JhYmx5U3VwcG9ydHNDb250ZXh0JyBpbiB0aGlzLmNhbnZhcykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMucHJvYmFibHlTdXBwb3J0c0NvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnByb2JhYmx5U3VwcG9ydHNDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBhdHRyaWJ1dGVzKTtcbiAgICB9IGVsc2UgaWYgKCdzdXBwb3J0c0NvbnRleHQnIGluIHRoaXMuY2FudmFzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbnZhcy5zdXBwb3J0c0NvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN1cHBvcnRzQ29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCAmJiAhIXRoaXMuZ2V0V2ViR0xDb250ZXh0KGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpO1xufTtcblxuQ2FudmFzLnByb3RvdHlwZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FudmFzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEFjdG9yID0gcmVxdWlyZSgnLi4vYWN0b3InKTtcblxudmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKTtcbnZhciB3b3JrZXJGaWxlID0gKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgfHwgc2NyaXB0c1tzY3JpcHRzLmxlbmd0aCAtIDFdKS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xudmFyIGFic29sdXRlID0gd29ya2VyRmlsZS5pbmRleE9mKCdodHRwJykgIT09IC0xO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERpc3BhdGNoZXI7XG5cbmZ1bmN0aW9uIERpc3BhdGNoZXIobGVuZ3RoLCBwYXJlbnQpIHtcbiAgICB0aGlzLmFjdG9ycyA9IFtdO1xuICAgIHRoaXMuY3VycmVudEFjdG9yID0gMDtcblxuICAgIHZhciB1cmwsIGJsb2IsIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzIGRvbWFpbiBpc3N1ZXMgd2UgY2FuJ3QgbG9hZCBpdCBkaXJlY3RseSB3aXRoIHRoZSB1cmwsXG4gICAgICAgIC8vIHNvIGNyZWF0ZSBhIGJsb2IgYW5kIG9iamVjdCB1cmwgYW5kIGxvYWQgdGhhdFxuICAgICAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIGJsb2IgPSBuZXcgQmxvYihbJ2ltcG9ydFNjcmlwdHMoXCInICsgd29ya2VyRmlsZSArICdcIik7J10sIHt0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCd9KTtcbiAgICAgICAgICAgIHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJsID0gd29ya2VyRmlsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3b3JrZXIgPSBuZXcgd2luZG93Lldvcmtlcih1cmwpO1xuICAgICAgICB2YXIgYWN0b3IgPSBuZXcgQWN0b3Iod29ya2VyLCBwYXJlbnQpO1xuICAgICAgICBhY3Rvci5uYW1lID0gXCJXb3JrZXIgXCIgKyBpO1xuICAgICAgICB0aGlzLmFjdG9ycy5wdXNoKGFjdG9yKTtcbiAgICB9XG59XG5cbkRpc3BhdGNoZXIucHJvdG90eXBlID0ge1xuICAgIGJyb2FkY2FzdDogZnVuY3Rpb24odHlwZSwgZGF0YSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmFjdG9yc1tpXS5zZW5kKHR5cGUsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlbmQ6IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIGNhbGxiYWNrLCB0YXJnZXRJRCwgYnVmZmVycykge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldElEICE9PSAnbnVtYmVyJyB8fCBpc05hTih0YXJnZXRJRCkpIHtcbiAgICAgICAgICAgIC8vIFVzZSByb3VuZCByb2JpbiB0byBzZW5kIHJlcXVlc3RzIHRvIHdlYiB3b3JrZXJzLlxuICAgICAgICAgICAgdGFyZ2V0SUQgPSB0aGlzLmN1cnJlbnRBY3RvciA9ICh0aGlzLmN1cnJlbnRBY3RvciArIDEpICUgdGhpcy5hY3RvcnMubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RvcnNbdGFyZ2V0SURdLnNlbmQodHlwZSwgZGF0YSwgY2FsbGJhY2ssIGJ1ZmZlcnMpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0SUQ7XG4gICAgfSxcblxuICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYWN0b3JzW2ldLnRhcmdldC50ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdG9ycyA9IFtdO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24gKHRhZ05hbWUsIGNsYXNzTmFtZSwgY29udGFpbmVyKSB7XG4gICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICBpZiAoY2xhc3NOYW1lKSBlbC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgaWYgKGNvbnRhaW5lcikgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsKTtcbiAgICByZXR1cm4gZWw7XG59O1xuXG52YXIgZG9jU3R5bGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG5cbmZ1bmN0aW9uIHRlc3RQcm9wKHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocHJvcHNbaV0gaW4gZG9jU3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHNlbGVjdFByb3AgPSB0ZXN0UHJvcChbJ3VzZXJTZWxlY3QnLCAnTW96VXNlclNlbGVjdCcsICdXZWJraXRVc2VyU2VsZWN0JywgJ21zVXNlclNlbGVjdCddKSxcbiAgICB1c2VyU2VsZWN0O1xuZXhwb3J0cy5kaXNhYmxlRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2VsZWN0UHJvcCkge1xuICAgICAgICB1c2VyU2VsZWN0ID0gZG9jU3R5bGVbc2VsZWN0UHJvcF07XG4gICAgICAgIGRvY1N0eWxlW3NlbGVjdFByb3BdID0gJ25vbmUnO1xuICAgIH1cbn07XG5leHBvcnRzLmVuYWJsZURyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlbGVjdFByb3ApIHtcbiAgICAgICAgZG9jU3R5bGVbc2VsZWN0UHJvcF0gPSB1c2VyU2VsZWN0O1xuICAgIH1cbn07XG5cbnZhciB0cmFuc2Zvcm1Qcm9wID0gdGVzdFByb3AoWyd0cmFuc2Zvcm0nLCAnV2Via2l0VHJhbnNmb3JtJ10pO1xuZXhwb3J0cy5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICBlbC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IHZhbHVlO1xufTtcblxuLy8gU3VwcHJlc3MgdGhlIG5leHQgY2xpY2ssIGJ1dCBvbmx5IGlmIGl0J3MgaW1tZWRpYXRlLlxuZnVuY3Rpb24gc3VwcHJlc3NDbGljayhlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VwcHJlc3NDbGljaywgdHJ1ZSk7XG59XG5leHBvcnRzLnN1cHByZXNzQ2xpY2sgPSBmdW5jdGlvbigpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdXBwcmVzc0NsaWNrLCB0cnVlKTtcbiAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VwcHJlc3NDbGljaywgdHJ1ZSk7XG4gICAgfSwgMCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBIVFRQX1VSTDogJ2h0dHA6Ly9hLnRpbGVzLm1hcGJveC5jb20nLFxuICAgIEhUVFBTX1VSTDogJ2h0dHBzOi8vYS50aWxlcy5tYXBib3guY29tJyxcbiAgICBGT1JDRV9IVFRQUzogdHJ1ZSxcbiAgICBSRVFVSVJFX0FDQ0VTU19UT0tFTjogdHJ1ZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLyoqXG4gKiBNZXRob2RzIG1peGVkIGluIHRvIG90aGVyIGNsYXNzZXMgZm9yIGV2ZW50IGNhcGFiaWxpdGllcy5cbiAqIEBtaXhpbiBFdmVudGVkXG4gKi9cbnZhciBFdmVudGVkID0ge1xuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlIHRvIGEgc3BlY2lmaWVkIGV2ZW50IHdpdGggYSBsaXN0ZW5lciBmdW5jdGlvbiB0aGUgbGF0dGVyIGdldHMgdGhlIGRhdGEgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCB0byBgZmlyZWAgYW5kIGFkZGl0aW9uYWxseSBgdGFyZ2V0YCBhbmQgYHR5cGVgIHByb3BlcnRpZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEV2ZW50IHR5cGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBGdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWRcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24odHlwZSwgZm4pIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSB0aGlzLl9ldmVudHNbdHlwZV0gfHwgW107XG4gICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGZuKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZXZlbnQgbGlzdGVuZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0gRXZlbnQgdHlwZS4gSWYgbm9uZSBpcyBzcGVjaWZpZWQsIHJlbW92ZSBhbGwgbGlzdGVuZXJzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2xpc3RlbmVyXSBGdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuIElmIG5vbmUgaXMgc3BlY2lmaWVkIGFsbCBsaXN0ZW5lcnMgYXJlIHJlbW92ZWRcbiAgICAgKi9cbiAgICBvZmY6IGZ1bmN0aW9uKHR5cGUsIGZuKSB7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGxpc3RlbmVycyBpZiBubyBhcmd1bWVudHMgc3BlY2lmaWVkXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fZXZlbnRzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubGlzdGVucyh0eXBlKSkgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgICB2YXIgaWR4ID0gdGhpcy5fZXZlbnRzW3R5cGVdLmluZGV4T2YoZm4pO1xuICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbCBhIGZ1bmN0aW9uIG9uY2Ugd2hlbiBhbiBldmVudCBoYXMgZmlyZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEV2ZW50IHR5cGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgRnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uY2Ugd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWRcbiAgICAgKi9cbiAgICBvbmNlOiBmdW5jdGlvbih0eXBlLCBmbikge1xuICAgICAgICB2YXIgd3JhcHBlciA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMub2ZmKHR5cGUsIHdyYXBwZXIpO1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzLCBkYXRhKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uKHR5cGUsIHdyYXBwZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmlyZSBldmVudCBvZiBhIGdpdmVuIHN0cmluZyB0eXBlIHdpdGggdGhlIGdpdmVuIGRhdGEgb2JqZWN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXZlbnQgbmFtZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV0gT3B0aW9uYWwgZGF0YSBwYXNzZWQgZG93biB0byB0aGUgZXZlbnQgb2JqZWN0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGxpc3RlbnMgdG8gYW4gZXZlbnQgb2YgYSBwYXJ0aWN1bGFyIHR5cGVcbiAgICAgKi9cbiAgICBmaXJlOiBmdW5jdGlvbih0eXBlLCBkYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5zKHR5cGUpKSByZXR1cm4gdGhpcztcblxuICAgICAgICBkYXRhID0gdXRpbC5leHRlbmQoe30sIGRhdGEpO1xuICAgICAgICB1dGlsLmV4dGVuZChkYXRhLCB7dHlwZTogdHlwZSwgdGFyZ2V0OiB0aGlzfSk7XG5cbiAgICAgICAgLy8gbWFrZSBzdXJlIGFkZGluZy9yZW1vdmluZyBsaXN0ZW5lcnMgaW5zaWRlIG90aGVyIGxpc3RlbmVycyB3b24ndCBjYXVzZSBpbmZpbml0ZSBsb29wXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmNhbGwodGhpcywgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYW4gZXZlbnQgaXMgcmVnaXN0ZXJlZCB0byBhIHR5cGVcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgbGlzdGVucyB0byBhbiBldmVudCBvZiBhIHBhcnRpY3VsYXIgdHlwZVxuICAgICAqL1xuICAgIGxpc3RlbnM6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbdHlwZV0pO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRlZDtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaHM7XG5cbmZ1bmN0aW9uIEdseXBocyhwYmYsIGVuZCkge1xuICAgIHRoaXMuc3RhY2tzID0gcGJmLnJlYWRGaWVsZHMocmVhZEZvbnRzdGFja3MsIFtdLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRm9udHN0YWNrcyh0YWcsIHN0YWNrcywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMSkge1xuICAgICAgICB2YXIgZm9udHN0YWNrID0gcGJmLnJlYWRNZXNzYWdlKHJlYWRGb250c3RhY2ssIHtnbHlwaHM6IHt9fSk7XG4gICAgICAgIHN0YWNrcy5wdXNoKGZvbnRzdGFjayk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkRm9udHN0YWNrKHRhZywgZm9udHN0YWNrLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxKSBmb250c3RhY2submFtZSA9IHBiZi5yZWFkU3RyaW5nKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBmb250c3RhY2sucmFuZ2UgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgZ2x5cGggPSBwYmYucmVhZE1lc3NhZ2UocmVhZEdseXBoLCB7fSk7XG4gICAgICAgIGZvbnRzdGFjay5nbHlwaHNbZ2x5cGguaWRdID0gZ2x5cGg7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkR2x5cGgodGFnLCBnbHlwaCwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMSkgZ2x5cGguaWQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMikgZ2x5cGguYml0bWFwID0gcGJmLnJlYWRCeXRlcygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgZ2x5cGgud2lkdGggPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgZ2x5cGguaGVpZ2h0ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGdseXBoLmxlZnQgPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDYpIGdseXBoLnRvcCA9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNykgZ2x5cGguYWR2YW5jZSA9IHBiZi5yZWFkVmFyaW50KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaW50ZXJwb2xhdGU7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlKGEsIGIsIHQpIHtcbiAgICByZXR1cm4gKGEgKiAoMSAtIHQpKSArIChiICogdCk7XG59XG5cbmludGVycG9sYXRlLm51bWJlciA9IGludGVycG9sYXRlO1xuXG5pbnRlcnBvbGF0ZS52ZWMyID0gZnVuY3Rpb24oZnJvbSwgdG8sIHQpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBpbnRlcnBvbGF0ZShmcm9tWzBdLCB0b1swXSwgdCksXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bMV0sIHRvWzFdLCB0KVxuICAgIF07XG59O1xuXG4vKlxuICogSW50ZXJwb2xhdGUgYmV0d2VlbiB0d28gY29sb3JzIGdpdmVuIGFzIDQtZWxlbWVudCBhcnJheXMuXG4gKlxuICogQHBhcmFtIHtDb2xvcn0gZnJvbVxuICogQHBhcmFtIHtDb2xvcn0gdG9cbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gZmFjdG9yIGJldHdlZW4gMCBhbmQgMVxuICogQHJldHVybnMge0NvbG9yfSBpbnRlcnBvbGF0ZWQgY29sb3JcbiAqL1xuaW50ZXJwb2xhdGUuY29sb3IgPSBmdW5jdGlvbihmcm9tLCB0bywgdCkge1xuICAgIHJldHVybiBbXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bMF0sIHRvWzBdLCB0KSxcbiAgICAgICAgaW50ZXJwb2xhdGUoZnJvbVsxXSwgdG9bMV0sIHQpLFxuICAgICAgICBpbnRlcnBvbGF0ZShmcm9tWzJdLCB0b1syXSwgdCksXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bM10sIHRvWzNdLCB0KVxuICAgIF07XG59O1xuXG5pbnRlcnBvbGF0ZS5hcnJheSA9IGZ1bmN0aW9uKGZyb20sIHRvLCB0KSB7XG4gICAgcmV0dXJuIGZyb20ubWFwKGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGQsIHRvW2ldLCB0KTtcbiAgICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZycpO1xudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuL2Jyb3dzZXInKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplVVJMKHVybCwgcGF0aFByZWZpeCwgYWNjZXNzVG9rZW4pIHtcbiAgICBhY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IGNvbmZpZy5BQ0NFU1NfVE9LRU47XG5cbiAgICBpZiAoIWFjY2Vzc1Rva2VuICYmIGNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIEFQSSBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQgdG8gdXNlIE1hcGJveCBHTC4gJyArXG4gICAgICAgICAgICAnU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vZGV2ZWxvcGVycy9hcGkvI2FjY2Vzcy10b2tlbnMnKTtcbiAgICB9XG5cbiAgICB2YXIgaHR0cHMgPSBjb25maWcuRk9SQ0VfSFRUUFMgfHxcbiAgICAgICAgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonKTtcblxuICAgIHVybCA9IHVybC5yZXBsYWNlKC9ebWFwYm94OlxcL1xcLy8sIChodHRwcyA/IGNvbmZpZy5IVFRQU19VUkwgOiBjb25maWcuSFRUUF9VUkwpICsgcGF0aFByZWZpeCk7XG4gICAgdXJsICs9IHVybC5pbmRleE9mKCc/JykgIT09IC0xID8gJyZhY2Nlc3NfdG9rZW49JyA6ICc/YWNjZXNzX3Rva2VuPSc7XG5cbiAgICBpZiAoY29uZmlnLlJFUVVJUkVfQUNDRVNTX1RPS0VOKSB7XG4gICAgICAgIGlmIChhY2Nlc3NUb2tlblswXSA9PT0gJ3MnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBhIHB1YmxpYyBhY2Nlc3MgdG9rZW4gKHBrLiopIHdpdGggTWFwYm94IEdMIEpTLCBub3QgYSBzZWNyZXQgYWNjZXNzIHRva2VuIChzay4qKS4gJyArXG4gICAgICAgICAgICAgICAgJ1NlZSBodHRwczovL3d3dy5tYXBib3guY29tL2RldmVsb3BlcnMvYXBpLyNhY2Nlc3MtdG9rZW5zJyk7XG4gICAgICAgIH1cblxuICAgICAgICB1cmwgKz0gYWNjZXNzVG9rZW47XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybDtcbn1cblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU3R5bGVVUkwgPSBmdW5jdGlvbih1cmwsIGFjY2Vzc1Rva2VuKSB7XG4gICAgdmFyIHVzZXIgPSB1cmwubWF0Y2goL15tYXBib3g6XFwvXFwvKFteLl0rKS8pO1xuICAgIGlmICghdXNlcilcbiAgICAgICAgcmV0dXJuIHVybDtcblxuICAgIHJldHVybiBub3JtYWxpemVVUkwodXJsLCAnL3N0eWxlcy92MS8nICsgdXNlclsxXSArICcvJywgYWNjZXNzVG9rZW4pO1xufTtcblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU291cmNlVVJMID0gZnVuY3Rpb24odXJsLCBhY2Nlc3NUb2tlbikge1xuICAgIGlmICghdXJsLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pKVxuICAgICAgICByZXR1cm4gdXJsO1xuXG4gICAgdXJsID0gbm9ybWFsaXplVVJMKHVybCArICcuanNvbicsICcvdjQvJywgYWNjZXNzVG9rZW4pO1xuXG4gICAgLy8gVGlsZUpTT04gcmVxdWVzdHMgbmVlZCBhIHNlY3VyZSBmbGFnIGFwcGVuZGVkIHRvIHRoZWlyIFVSTHMgc29cbiAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIga25vd3MgdG8gc2VuZCBTU0wtaWZpZWQgcmVzb3VyY2UgcmVmZXJlbmNlcy5cbiAgICBpZiAodXJsLmluZGV4T2YoJ2h0dHBzJykgPT09IDApXG4gICAgICAgIHVybCArPSAnJnNlY3VyZSc7XG5cbiAgICByZXR1cm4gdXJsO1xufTtcblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplR2x5cGhzVVJMID0gZnVuY3Rpb24odXJsLCBhY2Nlc3NUb2tlbikge1xuICAgIGlmICghdXJsLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pKVxuICAgICAgICByZXR1cm4gdXJsO1xuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZVVSTCh1cmwsICcvdjQvJywgYWNjZXNzVG9rZW4pO1xufTtcblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplVGlsZVVSTCA9IGZ1bmN0aW9uKHVybCwgc291cmNlVXJsKSB7XG4gICAgaWYgKCFzb3VyY2VVcmwgfHwgIXNvdXJjZVVybC5tYXRjaCgvXm1hcGJveDpcXC9cXC8vKSlcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICByZXR1cm4gdXJsLnJlcGxhY2UoL1xcLigoPzpwbmd8anBnKVxcZCopKD89JHxcXD8pLywgYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID49IDIgPyAnQDJ4LiQxJyA6ICcuJDEnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qXG4gKiBBIFttb3N0LXJlY2VudGx5LXVzZWQgY2FjaGVdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FjaGVfYWxnb3JpdGhtcylcbiAqIHdpdGggaGFzaCBsb29rdXAgbWFkZSBwb3NzaWJsZSBieSBrZWVwaW5nIGEgbGlzdCBvZiBrZXlzIGluIHBhcmFsbGVsIHRvXG4gKiBhbiBhcnJheSBvZiBkaWN0aW9uYXJ5IG9mIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggbnVtYmVyIG9mIHBlcm1pdHRlZCB2YWx1ZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVtb3ZlIGNhbGxiYWNrIGNhbGxlZCB3aXRoIGl0ZW1zIHdoZW4gdGhleSBleHBpcmVcbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gTVJVQ2FjaGU7XG5mdW5jdGlvbiBNUlVDYWNoZShtYXgsIG9uUmVtb3ZlKSB7XG4gICAgdGhpcy5tYXggPSBtYXg7XG4gICAgdGhpcy5vblJlbW92ZSA9IG9uUmVtb3ZlO1xuICAgIHRoaXMucmVzZXQoKTtcbn1cblxuLyoqXG4gKiBDbGVhciB0aGUgY2FjaGVcbiAqXG4gKiBAcmV0dXJucyB7TVJVQ2FjaGV9IHRoaXMgY2FjaGVcbiAqL1xuTVJVQ2FjaGUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMubGlzdCkge1xuICAgICAgICB0aGlzLm9uUmVtb3ZlKHRoaXMubGlzdFtrZXldKTtcbiAgICB9XG5cbiAgICB0aGlzLmxpc3QgPSB7fTtcbiAgICB0aGlzLm9yZGVyID0gW107XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qXG4gKiBBZGQgYSBrZXksIHZhbHVlIGNvbWJpbmF0aW9uIHRvIHRoZSBjYWNoZSwgdHJpbW1pbmcgaXRzIHNpemUgaWYgdGhpcyBwdXNoZXNcbiAqIGl0IG92ZXIgbWF4IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IGxvb2t1cCBrZXkgZm9yIHRoZSBpdGVtXG4gKiBAcGFyYW0geyp9IGRhdGEgYW55IHZhbHVlXG4gKlxuICogQHJldHVybnMge01SVUNhY2hlfSB0aGlzIGNhY2hlXG4gKi9cbk1SVUNhY2hlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihrZXksIGRhdGEpIHtcbiAgICB0aGlzLmxpc3Rba2V5XSA9IGRhdGE7XG4gICAgdGhpcy5vcmRlci5wdXNoKGtleSk7XG5cbiAgICBpZiAodGhpcy5vcmRlci5sZW5ndGggPiB0aGlzLm1heCkge1xuICAgICAgICB2YXIgcmVtb3ZlZERhdGEgPSB0aGlzLmdldCh0aGlzLm9yZGVyWzBdKTtcbiAgICAgICAgaWYgKHJlbW92ZWREYXRhKSB0aGlzLm9uUmVtb3ZlKHJlbW92ZWREYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qXG4gKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgdmFsdWUgYXR0YWNoZWQgdG8gYGtleWAgaXMgcHJlc2VudFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdGhlIGtleSB0byBiZSBsb29rZWQtdXBcbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBjYWNoZSBoYXMgdGhpcyB2YWx1ZVxuICovXG5NUlVDYWNoZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIGtleSBpbiB0aGlzLmxpc3Q7XG59O1xuXG4vKlxuICogTGlzdCBhbGwga2V5cyBpbiB0aGUgY2FjaGVcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gYW4gYXJyYXkgb2Yga2V5cyBpbiB0aGlzIGNhY2hlLlxuICovXG5NUlVDYWNoZS5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm9yZGVyO1xufTtcblxuLypcbiAqIEdldCB0aGUgdmFsdWUgYXR0YWNoZWQgdG8gYSBzcGVjaWZpYyBrZXkuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLFxuICogcmV0dXJucyBgbnVsbGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgdG8gbG9vayB1cFxuICogQHJldHVybnMgeyp9IHRoZSBkYXRhLCBvciBudWxsIGlmIGl0IGlzbid0IGZvdW5kXG4gKi9cbk1SVUNhY2hlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIXRoaXMuaGFzKGtleSkpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgIHZhciBkYXRhID0gdGhpcy5saXN0W2tleV07XG5cbiAgICBkZWxldGUgdGhpcy5saXN0W2tleV07XG4gICAgdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKGtleSksIDEpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc29sdmVUb2tlbnM7XG5cbi8qKlxuICogUmVwbGFjZSB0b2tlbnMgaW4gYSBzdHJpbmcgdGVtcGxhdGUgd2l0aCB2YWx1ZXMgaW4gYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgYSBrZXkvdmFsdWUgcmVsYXRpb25zaGlwIGJldHdlZW4gdG9rZW5zIGFuZCByZXBsYWNlbWVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IHRoZSB0ZW1wbGF0ZSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSB0ZW1wbGF0ZSB3aXRoIHRva2VucyByZXBsYWNlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRva2Vucyhwcm9wZXJ0aWVzLCB0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgveyhbXnt9KClcXFtcXF08PiQ9OjsuLF5dKyl9L2csIGZ1bmN0aW9uKG1hdGNoLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGtleSBpbiBwcm9wZXJ0aWVzID8gcHJvcGVydGllc1trZXldIDogJyc7XG4gICAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBVbml0QmV6aWVyID0gcmVxdWlyZSgndW5pdGJlemllcicpO1xuXG4vKipcbiAqIEdpdmVuIGEgdmFsdWUgYHRgIHRoYXQgdmFyaWVzIGJldHdlZW4gMCBhbmQgMSwgcmV0dXJuXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIHRoYXQgZWFzZXMgYmV0d2VlbiAwIGFuZCAxIGluIGEgcGxlYXNpbmdcbiAqIGN1YmljIGluLW91dCBmYXNoaW9uLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IGlucHV0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBpbnB1dFxuICovXG5leHBvcnRzLmVhc2VDdWJpY0luT3V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICBpZiAodCA8PSAwKSByZXR1cm4gMDtcbiAgICBpZiAodCA+PSAxKSByZXR1cm4gMTtcbiAgICB2YXIgdDIgPSB0ICogdCxcbiAgICAgICAgdDMgPSB0MiAqIHQ7XG4gICAgcmV0dXJuIDQgKiAodCA8IDAuNSA/IHQzIDogMyAqICh0IC0gdDIpICsgdDMgLSAwLjc1KTtcbn07XG5cbi8qKlxuICogR2l2ZW4gZ2l2ZW4gKHgsIHkpLCAoeDEsIHkxKSBjb250cm9sIHBvaW50cyBmb3IgYSBiZXppZXIgY3VydmUsXG4gKiByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGludGVycG9sYXRlcyBhbG9uZyB0aGF0IGN1cnZlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMXggY29udHJvbCBwb2ludCAxIHggY29vcmRpbmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHAxeSBjb250cm9sIHBvaW50IDEgeSBjb29yZGluYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcDJ4IGNvbnRyb2wgcG9pbnQgMiB4IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMnkgY29udHJvbCBwb2ludCAyIHkgY29vcmRpbmF0ZVxuICogQHJldHVybnMge0Z1bmN0aW9ufSBpbnRlcnBvbGF0b3I6IHJlY2VpdmVzIG51bWJlciB2YWx1ZSwgcmV0dXJuc1xuICogbnVtYmVyIHZhbHVlLlxuICovXG5leHBvcnRzLmJlemllciA9IGZ1bmN0aW9uKHAxeCwgcDF5LCBwMngsIHAyeSkge1xuICAgIHZhciBiZXppZXIgPSBuZXcgVW5pdEJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBiZXppZXIuc29sdmUodCk7XG4gICAgfTtcbn07XG5cbi8qKlxuICogQSBkZWZhdWx0IGJlemllci1jdXJ2ZSBwb3dlcmVkIGVhc2luZyBmdW5jdGlvbiB3aXRoXG4gKiBjb250cm9sIHBvaW50cyAoMC4yNSwgMC4xKSBhbmQgKDAuMjUsIDEpXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IG91dHB1dFxuICovXG5leHBvcnRzLmVhc2UgPSBleHBvcnRzLmJlemllcigwLjI1LCAwLjEsIDAuMjUsIDEpO1xuXG4vKipcbiAqIEdpdmVuIGEgZm91ci1lbGVtZW50IGFycmF5IG9mIG51bWJlcnMgdGhhdCByZXByZXNlbnRzIGEgY29sb3IgaW5cbiAqIFJHQkEsIHJldHVybiBhIHZlcnNpb24gZm9yIHdoaWNoIHRoZSBSR0IgY29tcG9uZW50cyBhcmUgbXVsdGlwbGllZFxuICogYnkgdGhlIEEgKGFscGhhKSBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge051bWJlcjxBcnJheT59IGMgY29sb3IgYXJyYXlcbiAqIEByZXR1cm5zIHtOdW1iZXI8QXJyYXk+fSBwcmVtdWx0aXBsaWVkIGNvbG9yIGFycmF5XG4gKi9cbmV4cG9ydHMucHJlbXVsdGlwbHkgPSBmdW5jdGlvbiAoYykge1xuICAgIGNbMF0gKj0gY1szXTtcbiAgICBjWzFdICo9IGNbM107XG4gICAgY1syXSAqPSBjWzNdO1xuICAgIHJldHVybiBjO1xufTtcblxuLyoqXG4gKiBjb25zdHJhaW4gbiB0byB0aGUgZ2l2ZW4gcmFuZ2UgdmlhIG1pbiArIG1heFxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuIHZhbHVlXG4gKiBAcGFyYW0ge051bWJlcn0gbWluIHRoZSBtaW5pbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4IHRoZSBtYXhpbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgY2xhbXBlZCB2YWx1ZVxuICovXG5leHBvcnRzLmNsYW1wID0gZnVuY3Rpb24gKG4sIG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCBuKSk7XG59O1xuXG4vKlxuICogY29uc3RyYWluIG4gdG8gdGhlIGdpdmVuIHJhbmdlIHZpYSBtb2R1bGFyIGFyaXRobWV0aWNcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcGFyYW0ge051bWJlcn0gbWluXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBjb25zdHJhaW5lZCBudW1iZXJcbiAqL1xuZXhwb3J0cy53cmFwID0gZnVuY3Rpb24gKG4sIG1pbiwgbWF4KSB7XG4gICAgdmFyIGQgPSBtYXggLSBtaW47XG4gICAgcmV0dXJuIG4gPT09IG1heCA/IG4gOiAoKG4gLSBtaW4pICUgZCArIGQpICUgZCArIG1pbjtcbn07XG5cbi8qXG4gKiByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIGFuZCBub24tdW5kZWZpbmVkIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7Kn0gYXJndW1lbnRcbiAqL1xuZXhwb3J0cy5jb2FsZXNjZSA9IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGlmIChhcmcgIT09IG51bGwgJiYgYXJnICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gYXJnO1xuICAgIH1cbn07XG5cbi8qXG4gKiBDYWxsIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBvbiBhbiBhcnJheSBvZiBhcmd1bWVudHMsXG4gKiBjYWxsaW5nIGBjYWxsYmFja2Agb25jZSBhbGwgY2FsbHMgY29tcGxldGUuXG4gKlxuICogQHBhcmFtIHtBcnJheTwqPn0gYXJyYXkgaW5wdXQgdG8gZWFjaCBjYWxsIG9mIHRoZSBhc3luYyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIGFuIGFzeW5jIGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlIChkYXRhLCBjYWxsYmFjaylcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgY2FsbGJhY2sgcnVuIGFmdGVyIGFsbCBhc3luYyB3b3JrIGlzIGRvbmUuXG4gKiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHNcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydHMuYXN5bmNFYWNoID0gZnVuY3Rpb24gKGFycmF5LCBmbiwgY2FsbGJhY2spIHtcbiAgICB2YXIgcmVtYWluaW5nID0gYXJyYXkubGVuZ3RoO1xuICAgIGlmIChyZW1haW5pbmcgPT09IDApIHJldHVybiBjYWxsYmFjaygpO1xuICAgIGZ1bmN0aW9uIGNoZWNrKCkgeyBpZiAoLS1yZW1haW5pbmcgPT09IDApIGNhbGxiYWNrKCk7IH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSBmbihhcnJheVtpXSwgY2hlY2spO1xufTtcblxuLypcbiAqIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUga2V5cyBpbiBvbmUgb2JqZWN0IGFuZCB0aGUga2V5c1xuICogaW4gYW5vdGhlciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0ga2V5cyBkaWZmZXJlbmNlXG4gKi9cbmV4cG9ydHMua2V5c0RpZmZlcmVuY2UgPSBmdW5jdGlvbiAob2JqLCBvdGhlcikge1xuICAgIHZhciBkaWZmZXJlbmNlID0gW107XG4gICAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCEoaSBpbiBvdGhlcikpIHtcbiAgICAgICAgICAgIGRpZmZlcmVuY2UucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlmZmVyZW5jZTtcbn07XG5cbi8qKlxuICogR2l2ZW4gYSBkZXN0aW5hdGlvbiBvYmplY3QgYW5kIG9wdGlvbmFsbHkgbWFueSBzb3VyY2Ugb2JqZWN0cyxcbiAqIGNvcHkgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlIG9iamVjdHMgaW50byB0aGUgZGVzdGluYXRpb24uXG4gKiBUaGUgbGFzdCBzb3VyY2Ugb2JqZWN0IGdpdmVuIG92ZXJyaWRlcyBwcm9wZXJ0aWVzIGZyb20gcHJldmlvdXNcbiAqIHNvdXJjZSBvYmplY3RzLlxuICogQHBhcmFtIHtPYmplY3R9IGRlc3QgZGVzdGluYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBzb3VyY2VzIGZyb20gd2hpY2ggcHJvcGVydGllcyBhcmUgcHVsbGVkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBkZXN0XG4gKi9cbmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3JjID0gYXJndW1lbnRzW2ldO1xuICAgICAgICBmb3IgKHZhciBrIGluIHNyYykge1xuICAgICAgICAgICAgZGVzdFtrXSA9IHNyY1trXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn07XG5cbi8qKlxuICogRXh0ZW5kIGEgZGVzdGluYXRpb24gb2JqZWN0IHdpdGggYWxsIHByb3BlcnRpZXMgb2YgdGhlIHNyYyBvYmplY3QsXG4gKiB1c2luZyBkZWZpbmVQcm9wZXJ0eSBpbnN0ZWFkIG9mIHNpbXBsZSBhc3NpZ25tZW50LlxuICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAqIEByZXR1cm5zIHtPYmplY3R9IGRlc3RcbiAqL1xuZXhwb3J0cy5leHRlbmRBbGwgPSBmdW5jdGlvbiAoZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzcmMpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlc3QsIGksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3JjLCBpKSk7XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufTtcblxuLyoqXG4gKiBFeHRlbmQgYSBwYXJlbnQncyBwcm90b3R5cGUgd2l0aCBhbGwgcHJvcGVydGllcyBpbiBhIHByb3BlcnRpZXNcbiAqIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmV4cG9ydHMuaW5oZXJpdCA9IGZ1bmN0aW9uIChwYXJlbnQsIHByb3BzKSB7XG4gICAgdmFyIHBhcmVudFByb3RvID0gdHlwZW9mIHBhcmVudCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcmVudC5wcm90b3R5cGUgOiBwYXJlbnQsXG4gICAgICAgIHByb3RvID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRQcm90byk7XG4gICAgZXhwb3J0cy5leHRlbmRBbGwocHJvdG8sIHByb3BzKTtcbiAgICByZXR1cm4gcHJvdG87XG59O1xuXG4vKipcbiAqIEdpdmVuIGFuIG9iamVjdCBhbmQgYSBudW1iZXIgb2YgcHJvcGVydGllcyBhcyBzdHJpbmdzLCByZXR1cm4gdmVyc2lvblxuICogb2YgdGhhdCBvYmplY3Qgd2l0aCBvbmx5IHRob3NlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNyYyB0aGUgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHByb3BlcnRpZXMgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgY2hvc2VuXG4gKiB0byBhcHBlYXIgb24gdGhlIHJlc3VsdGluZyBvYmplY3QuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBvYmplY3Qgd2l0aCBsaW1pdGVkIHByb3BlcnRpZXMuXG4gKiBAZXhhbXBsZVxuICogdmFyIGZvbyA9IHsgbmFtZTogJ0NoYXJsaWUnLCBhZ2U6IDEwIH07XG4gKiB2YXIganVzdE5hbWUgPSBwaWNrKGZvbywgWyduYW1lJ10pO1xuICogLy8ganVzdE5hbWUgPSB7IG5hbWU6ICdDaGFybGllJyB9XG4gKi9cbmV4cG9ydHMucGljayA9IGZ1bmN0aW9uIChzcmMsIHByb3BlcnRpZXMpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBrID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgaWYgKGsgaW4gc3JjKSB7XG4gICAgICAgICAgICByZXN1bHRba10gPSBzcmNba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBpZCA9IDE7XG5cbi8qKlxuICogUmV0dXJuIGEgdW5pcXVlIG51bWVyaWMgaWQsIHN0YXJ0aW5nIGF0IDEgYW5kIGluY3JlbWVudGluZyB3aXRoXG4gKiBlYWNoIGNhbGwuXG4gKlxuICogQHJldHVybnMge051bWJlcn0gdW5pcXVlIG51bWVyaWMgaWQuXG4gKi9cbmV4cG9ydHMudW5pcXVlSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlkKys7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHZlcnNpb24gb2YgYGZuYCB0aGF0IG9ubHkgZmlyZXMgb25jZSBldmVyeSBgdGltZWAgbWlsbHNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gdGhlIGZ1bmN0aW9uIHRvIGJlIHRocm90dGxlZFxuICogQHBhcmFtIHtOdW1iZXJ9IHRpbWUgbWlsbHNlY29uZHMgcmVxdWlyZWQgYmV0d2VlbiBmdW5jdGlvbiBjYWxsc1xuICogQHBhcmFtIHsqfSBjb250ZXh0IHRoZSB2YWx1ZSBvZiBgdGhpc2Agd2l0aCB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGRlYm91bmNlZCBmdW5jdGlvblxuICovXG5leHBvcnRzLnRocm90dGxlID0gZnVuY3Rpb24gKGZuLCB0aW1lLCBjb250ZXh0KSB7XG4gICAgdmFyIGxvY2ssIGFyZ3MsIHdyYXBwZXJGbiwgbGF0ZXI7XG5cbiAgICBsYXRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gcmVzZXQgbG9jayBhbmQgY2FsbCBpZiBxdWV1ZWRcbiAgICAgICAgbG9jayA9IGZhbHNlO1xuICAgICAgICBpZiAoYXJncykge1xuICAgICAgICAgICAgd3JhcHBlckZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgICAgYXJncyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHdyYXBwZXJGbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGxvY2spIHtcbiAgICAgICAgICAgIC8vIGNhbGxlZCB0b28gc29vbiwgcXVldWUgdG8gY2FsbCBsYXRlclxuICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY2FsbCBhbmQgbG9jayB1bnRpbCBsYXRlclxuICAgICAgICAgICAgZm4uYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQobGF0ZXIsIHRpbWUpO1xuICAgICAgICAgICAgbG9jayA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHdyYXBwZXJGbjtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgdmVyc2lvbiBvZiBgZm5gIHRoYXQgaXMgb25seSBjYWxsZWQgYHRpbWVgIG1pbGxpc2Vjb25kc1xuICogYWZ0ZXIgaXRzIGxhc3QgaW52b2NhdGlvblxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHRoZSBmdW5jdGlvbiB0byBiZSBkZWJvdW5jZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0aW1lIG1pbGxzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gZGVib3VuY2VkIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydHMuZGVib3VuY2UgPSBmdW5jdGlvbihmbiwgdGltZSkge1xuICAgIHZhciB0aW1lciwgYXJncztcblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcblxuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgfSwgdGltZSk7XG4gICAgfTtcbn07XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgbWVtYmVyIGZ1bmN0aW9uIG5hbWVzIGFzIHN0cmluZ3MsIHJlcGxhY2UgYWxsIG9mIHRoZW1cbiAqIHdpdGggYm91bmQgdmVyc2lvbnMgdGhhdCB3aWxsIGFsd2F5cyByZWZlciB0byBgY29udGV4dGAgYXMgYHRoaXNgLiBUaGlzXG4gKiBpcyB1c2VmdWwgZm9yIGNsYXNzZXMgd2hlcmUgb3RoZXJ3aXNlIGV2ZW50IGJpbmRpbmdzIHdvdWxkIHJlYXNzaWduXG4gKiBgdGhpc2AgdG8gdGhlIGV2ZW50ZWQgb2JqZWN0IG9yIHNvbWUgb3RoZXIgdmFsdWU6IHRoaXMgbGV0cyB5b3UgZW5zdXJlXG4gKiB0aGUgYHRoaXNgIHZhbHVlIGFsd2F5cy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZucyBsaXN0IG9mIG1lbWJlciBmdW5jdGlvbiBuYW1lc1xuICogQHBhcmFtIHsqfSBjb250ZXh0IHRoZSBjb250ZXh0IHZhbHVlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfSBjaGFuZ2VzIGZ1bmN0aW9ucyBpbi1wbGFjZVxuICogQGV4YW1wbGVcbiAqIGZ1bmN0aW9uIE15Q2xhc3MoKSB7XG4gKiAgIGJpbmRBbGwoWydvbnRpbWVyJ10sIHRoaXMpO1xuICogICB0aGlzLm5hbWUgPSAnVG9tJztcbiAqIH1cbiAqIE15Q2xhc3MucHJvdG90eXBlLm9udGltZXIgPSBmdW5jdGlvbigpIHtcbiAqICAgYWxlcnQodGhpcy5uYW1lKTtcbiAqIH07XG4gKiB2YXIgbXlDbGFzcyA9IG5ldyBNeUNsYXNzKCk7XG4gKiBzZXRUaW1lb3V0KG15Q2xhc3Mub250aW1lciwgMTAwKTtcbiAqL1xuZXhwb3J0cy5iaW5kQWxsID0gZnVuY3Rpb24oZm5zLCBjb250ZXh0KSB7XG4gICAgZm5zLmZvckVhY2goZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgY29udGV4dFtmbl0gPSBjb250ZXh0W2ZuXS5iaW5kKGNvbnRleHQpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlICdvcHRpb25zJyBwcm9wZXJ0eSBvbiBgb2JqYCB3aXRoIHByb3BlcnRpZXNcbiAqIGZyb20gdGhlIGBvcHRpb25zYCBhcmd1bWVudC4gUHJvcGVydGllcyBpbiB0aGUgYG9wdGlvbnNgXG4gKiBvYmplY3Qgd2lsbCBvdmVycmlkZSBleGlzdGluZyBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogZGVzdGluYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBvYmplY3Qgb2Ygb3ZlcnJpZGUgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gZGVyaXZlZCBvcHRpb25zIG9iamVjdC5cbiAqL1xuZXhwb3J0cy5zZXRPcHRpb25zID0gZnVuY3Rpb24ob2JqLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoJ29wdGlvbnMnKSkge1xuICAgICAgICBvYmoub3B0aW9ucyA9IG9iai5vcHRpb25zID8gT2JqZWN0LmNyZWF0ZShvYmoub3B0aW9ucykgOiB7fTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSBpbiBvcHRpb25zKSB7XG4gICAgICAgIG9iai5vcHRpb25zW2ldID0gb3B0aW9uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG9iai5vcHRpb25zO1xufTtcbiIsIi8vIChjKSBEZWFuIE1jTmFtZWUgPGRlYW5AZ21haWwuY29tPiwgMjAxMi5cbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGVhbm0vY3NzLWNvbG9yLXBhcnNlci1qc1xuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4vLyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4vLyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvXG52YXIga0NTU0NvbG9yVGFibGUgPSB7XG4gIFwidHJhbnNwYXJlbnRcIjogWzAsMCwwLDBdLCBcImFsaWNlYmx1ZVwiOiBbMjQwLDI0OCwyNTUsMV0sXG4gIFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsMjM1LDIxNSwxXSwgXCJhcXVhXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiYXF1YW1hcmluZVwiOiBbMTI3LDI1NSwyMTIsMV0sIFwiYXp1cmVcIjogWzI0MCwyNTUsMjU1LDFdLFxuICBcImJlaWdlXCI6IFsyNDUsMjQ1LDIyMCwxXSwgXCJiaXNxdWVcIjogWzI1NSwyMjgsMTk2LDFdLFxuICBcImJsYWNrXCI6IFswLDAsMCwxXSwgXCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LDIzNSwyMDUsMV0sXG4gIFwiYmx1ZVwiOiBbMCwwLDI1NSwxXSwgXCJibHVldmlvbGV0XCI6IFsxMzgsNDMsMjI2LDFdLFxuICBcImJyb3duXCI6IFsxNjUsNDIsNDIsMV0sIFwiYnVybHl3b29kXCI6IFsyMjIsMTg0LDEzNSwxXSxcbiAgXCJjYWRldGJsdWVcIjogWzk1LDE1OCwxNjAsMV0sIFwiY2hhcnRyZXVzZVwiOiBbMTI3LDI1NSwwLDFdLFxuICBcImNob2NvbGF0ZVwiOiBbMjEwLDEwNSwzMCwxXSwgXCJjb3JhbFwiOiBbMjU1LDEyNyw4MCwxXSxcbiAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLDE0OSwyMzcsMV0sIFwiY29ybnNpbGtcIjogWzI1NSwyNDgsMjIwLDFdLFxuICBcImNyaW1zb25cIjogWzIyMCwyMCw2MCwxXSwgXCJjeWFuXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiZGFya2JsdWVcIjogWzAsMCwxMzksMV0sIFwiZGFya2N5YW5cIjogWzAsMTM5LDEzOSwxXSxcbiAgXCJkYXJrZ29sZGVucm9kXCI6IFsxODQsMTM0LDExLDFdLCBcImRhcmtncmF5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJrZ3JlZW5cIjogWzAsMTAwLDAsMV0sIFwiZGFya2dyZXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtraGFraVwiOiBbMTg5LDE4MywxMDcsMV0sIFwiZGFya21hZ2VudGFcIjogWzEzOSwwLDEzOSwxXSxcbiAgXCJkYXJrb2xpdmVncmVlblwiOiBbODUsMTA3LDQ3LDFdLCBcImRhcmtvcmFuZ2VcIjogWzI1NSwxNDAsMCwxXSxcbiAgXCJkYXJrb3JjaGlkXCI6IFsxNTMsNTAsMjA0LDFdLCBcImRhcmtyZWRcIjogWzEzOSwwLDAsMV0sXG4gIFwiZGFya3NhbG1vblwiOiBbMjMzLDE1MCwxMjIsMV0sIFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsMTg4LDE0MywxXSxcbiAgXCJkYXJrc2xhdGVibHVlXCI6IFs3Miw2MSwxMzksMV0sIFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsNzksNzksMV0sXG4gIFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsNzksNzksMV0sIFwiZGFya3R1cnF1b2lzZVwiOiBbMCwyMDYsMjA5LDFdLFxuICBcImRhcmt2aW9sZXRcIjogWzE0OCwwLDIxMSwxXSwgXCJkZWVwcGlua1wiOiBbMjU1LDIwLDE0NywxXSxcbiAgXCJkZWVwc2t5Ymx1ZVwiOiBbMCwxOTEsMjU1LDFdLCBcImRpbWdyYXlcIjogWzEwNSwxMDUsMTA1LDFdLFxuICBcImRpbWdyZXlcIjogWzEwNSwxMDUsMTA1LDFdLCBcImRvZGdlcmJsdWVcIjogWzMwLDE0NCwyNTUsMV0sXG4gIFwiZmlyZWJyaWNrXCI6IFsxNzgsMzQsMzQsMV0sIFwiZmxvcmFsd2hpdGVcIjogWzI1NSwyNTAsMjQwLDFdLFxuICBcImZvcmVzdGdyZWVuXCI6IFszNCwxMzksMzQsMV0sIFwiZnVjaHNpYVwiOiBbMjU1LDAsMjU1LDFdLFxuICBcImdhaW5zYm9yb1wiOiBbMjIwLDIyMCwyMjAsMV0sIFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LDI0OCwyNTUsMV0sXG4gIFwiZ29sZFwiOiBbMjU1LDIxNSwwLDFdLCBcImdvbGRlbnJvZFwiOiBbMjE4LDE2NSwzMiwxXSxcbiAgXCJncmF5XCI6IFsxMjgsMTI4LDEyOCwxXSwgXCJncmVlblwiOiBbMCwxMjgsMCwxXSxcbiAgXCJncmVlbnllbGxvd1wiOiBbMTczLDI1NSw0NywxXSwgXCJncmV5XCI6IFsxMjgsMTI4LDEyOCwxXSxcbiAgXCJob25leWRld1wiOiBbMjQwLDI1NSwyNDAsMV0sIFwiaG90cGlua1wiOiBbMjU1LDEwNSwxODAsMV0sXG4gIFwiaW5kaWFucmVkXCI6IFsyMDUsOTIsOTIsMV0sIFwiaW5kaWdvXCI6IFs3NSwwLDEzMCwxXSxcbiAgXCJpdm9yeVwiOiBbMjU1LDI1NSwyNDAsMV0sIFwia2hha2lcIjogWzI0MCwyMzAsMTQwLDFdLFxuICBcImxhdmVuZGVyXCI6IFsyMzAsMjMwLDI1MCwxXSwgXCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsMjQwLDI0NSwxXSxcbiAgXCJsYXduZ3JlZW5cIjogWzEyNCwyNTIsMCwxXSwgXCJsZW1vbmNoaWZmb25cIjogWzI1NSwyNTAsMjA1LDFdLFxuICBcImxpZ2h0Ymx1ZVwiOiBbMTczLDIxNiwyMzAsMV0sIFwibGlnaHRjb3JhbFwiOiBbMjQwLDEyOCwxMjgsMV0sXG4gIFwibGlnaHRjeWFuXCI6IFsyMjQsMjU1LDI1NSwxXSwgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLDI1MCwyMTAsMV0sXG4gIFwibGlnaHRncmF5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodGdyZWVuXCI6IFsxNDQsMjM4LDE0NCwxXSxcbiAgXCJsaWdodGdyZXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0cGlua1wiOiBbMjU1LDE4MiwxOTMsMV0sXG4gIFwibGlnaHRzYWxtb25cIjogWzI1NSwxNjAsMTIyLDFdLCBcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLDE3OCwxNzAsMV0sXG4gIFwibGlnaHRza3libHVlXCI6IFsxMzUsMjA2LDI1MCwxXSwgXCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LDEzNiwxNTMsMV0sXG4gIFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwxMzYsMTUzLDFdLCBcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsMTk2LDIyMiwxXSxcbiAgXCJsaWdodHllbGxvd1wiOiBbMjU1LDI1NSwyMjQsMV0sIFwibGltZVwiOiBbMCwyNTUsMCwxXSxcbiAgXCJsaW1lZ3JlZW5cIjogWzUwLDIwNSw1MCwxXSwgXCJsaW5lblwiOiBbMjUwLDI0MCwyMzAsMV0sXG4gIFwibWFnZW50YVwiOiBbMjU1LDAsMjU1LDFdLCBcIm1hcm9vblwiOiBbMTI4LDAsMCwxXSxcbiAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsMjA1LDE3MCwxXSwgXCJtZWRpdW1ibHVlXCI6IFswLDAsMjA1LDFdLFxuICBcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LDg1LDIxMSwxXSwgXCJtZWRpdW1wdXJwbGVcIjogWzE0NywxMTIsMjE5LDFdLFxuICBcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwxNzksMTEzLDFdLCBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLDEwNCwyMzgsMV0sXG4gIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsMjUwLDE1NCwxXSwgXCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLDIwOSwyMDQsMV0sXG4gIFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksMjEsMTMzLDFdLCBcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsMjUsMTEyLDFdLFxuICBcIm1pbnRjcmVhbVwiOiBbMjQ1LDI1NSwyNTAsMV0sIFwibWlzdHlyb3NlXCI6IFsyNTUsMjI4LDIyNSwxXSxcbiAgXCJtb2NjYXNpblwiOiBbMjU1LDIyOCwxODEsMV0sIFwibmF2YWpvd2hpdGVcIjogWzI1NSwyMjIsMTczLDFdLFxuICBcIm5hdnlcIjogWzAsMCwxMjgsMV0sIFwib2xkbGFjZVwiOiBbMjUzLDI0NSwyMzAsMV0sXG4gIFwib2xpdmVcIjogWzEyOCwxMjgsMCwxXSwgXCJvbGl2ZWRyYWJcIjogWzEwNywxNDIsMzUsMV0sXG4gIFwib3JhbmdlXCI6IFsyNTUsMTY1LDAsMV0sIFwib3JhbmdlcmVkXCI6IFsyNTUsNjksMCwxXSxcbiAgXCJvcmNoaWRcIjogWzIxOCwxMTIsMjE0LDFdLCBcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwyMzIsMTcwLDFdLFxuICBcInBhbGVncmVlblwiOiBbMTUyLDI1MSwxNTIsMV0sIFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LDIzOCwyMzgsMV0sXG4gIFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LDExMiwxNDcsMV0sIFwicGFwYXlhd2hpcFwiOiBbMjU1LDIzOSwyMTMsMV0sXG4gIFwicGVhY2hwdWZmXCI6IFsyNTUsMjE4LDE4NSwxXSwgXCJwZXJ1XCI6IFsyMDUsMTMzLDYzLDFdLFxuICBcInBpbmtcIjogWzI1NSwxOTIsMjAzLDFdLCBcInBsdW1cIjogWzIyMSwxNjAsMjIxLDFdLFxuICBcInBvd2RlcmJsdWVcIjogWzE3NiwyMjQsMjMwLDFdLCBcInB1cnBsZVwiOiBbMTI4LDAsMTI4LDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlRmVhdHVyZVR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5mdW5jdGlvbiBpbmZpeChvcGVyYXRvcikge1xuICAgIHJldHVybiBmdW5jdGlvbihfLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChrZXkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybiAndCcgKyBvcGVyYXRvciArIFZlY3RvclRpbGVGZWF0dXJlVHlwZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ3BbJyArIEpTT04uc3RyaW5naWZ5KGtleSkgKyAnXScgKyBvcGVyYXRvciArIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHN0cmljdEluZml4KG9wZXJhdG9yKSB7XG4gICAgdmFyIG5vbnN0cmljdEluZml4ID0gaW5maXgob3BlcmF0b3IpO1xuICAgIHJldHVybiBmdW5jdGlvbihfLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChrZXkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybiBub25zdHJpY3RJbmZpeChfLCBrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAndHlwZW9mKHBbJyArIEpTT04uc3RyaW5naWZ5KGtleSkgKyAnXSkgPT09IHR5cGVvZignICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJykgJiYgJyArXG4gICAgICAgICAgICAgICAgbm9uc3RyaWN0SW5maXgoXywga2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG52YXIgb3BlcmF0b3JzID0ge1xuICAgICc9PSc6IGluZml4KCc9PT0nKSxcbiAgICAnIT0nOiBpbmZpeCgnIT09JyksXG4gICAgJz4nOiBzdHJpY3RJbmZpeCgnPicpLFxuICAgICc8Jzogc3RyaWN0SW5maXgoJzwnKSxcbiAgICAnPD0nOiBzdHJpY3RJbmZpeCgnPD0nKSxcbiAgICAnPj0nOiBzdHJpY3RJbmZpeCgnPj0nKSxcbiAgICAnaW4nOiBmdW5jdGlvbihfLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gJygnICsgb3BlcmF0b3JzWyc9PSddKF8sIGtleSwgdmFsdWUpICsgJyknO1xuICAgICAgICB9KS5qb2luKCd8fCcpIHx8ICdmYWxzZSc7XG4gICAgfSxcbiAgICAnIWluJzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAnISgnICsgb3BlcmF0b3JzLmluLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyAnKSc7XG4gICAgfSxcbiAgICAnYW55JzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLm1hcChmdW5jdGlvbihmaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAnKCcgKyBjb21waWxlKGZpbHRlcikgKyAnKSc7XG4gICAgICAgIH0pLmpvaW4oJ3x8JykgfHwgJ2ZhbHNlJztcbiAgICB9LFxuICAgICdhbGwnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkubWFwKGZ1bmN0aW9uKGZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuICcoJyArIGNvbXBpbGUoZmlsdGVyKSArICcpJztcbiAgICAgICAgfSkuam9pbignJiYnKSB8fCAndHJ1ZSc7XG4gICAgfSxcbiAgICAnbm9uZSc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gJyEoJyArIG9wZXJhdG9ycy5hbnkuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICcpJztcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBjb21waWxlKGZpbHRlcikge1xuICAgIHJldHVybiBvcGVyYXRvcnNbZmlsdGVyWzBdXS5hcHBseShmaWx0ZXIsIGZpbHRlcik7XG59XG5cbmZ1bmN0aW9uIHRydXRoKCkge1xuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyIG1hcGJveCBnbCBmaWx0ZXJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gZmlsdGVyLWV2YWx1YXRpbmcgZnVuY3Rpb25cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgaWYgKCFmaWx0ZXIpIHJldHVybiB0cnV0aDtcbiAgICB2YXIgZmlsdGVyU3RyID0gJ3ZhciBwID0gZi5wcm9wZXJ0aWVzIHx8IGYudGFncyB8fCB7fSwgdCA9IGYudHlwZTsgcmV0dXJuICcgKyBjb21waWxlKGZpbHRlcikgKyAnOyc7XG4gICAgLy8ganNoaW50IGV2aWw6IHRydWVcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdmJywgZmlsdGVyU3RyKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcDtcblxuLyogY2xpcCBmZWF0dXJlcyBiZXR3ZWVuIHR3byBheGlzLXBhcmFsbGVsIGxpbmVzOlxuICogICAgIHwgICAgICAgIHxcbiAqICBfX198X19fICAgICB8ICAgICAvXG4gKiAvICAgfCAgIFxcX19fX3xfX19fL1xuICogICAgIHwgICAgICAgIHxcbiAqL1xuXG5mdW5jdGlvbiBjbGlwKGZlYXR1cmVzLCBzY2FsZSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QpIHtcblxuICAgIGsxIC89IHNjYWxlO1xuICAgIGsyIC89IHNjYWxlO1xuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgIG1pbiwgbWF4O1xuXG4gICAgICAgIGlmIChmZWF0dXJlLm1pbikge1xuICAgICAgICAgICAgbWluID0gZmVhdHVyZS5taW5bYXhpc107XG4gICAgICAgICAgICBtYXggPSBmZWF0dXJlLm1heFtheGlzXTtcblxuICAgICAgICAgICAgaWYgKG1pbiA+PSBrMSAmJiBtYXggPD0gazIpIHsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICAgICAgICAgICAgICBjbGlwcGVkLnB1c2goZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1pbiA+IGsyIHx8IG1heCA8IGsxKSBjb250aW51ZTsgLy8gdHJpdmlhbCByZWplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzbGljZXMgPSB0eXBlID09PSAxID9cbiAgICAgICAgICAgICAgICBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIDpcbiAgICAgICAgICAgICAgICBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCB0eXBlID09PSAzKTtcblxuICAgICAgICBpZiAoc2xpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaWYgYSBmZWF0dXJlIGdvdCBjbGlwcGVkLCBpdCB3aWxsIGxpa2VseSBnZXQgY2xpcHBlZCBvbiB0aGUgbmV4dCB6b29tIGxldmVsIGFzIHdlbGwsXG4gICAgICAgICAgICAvLyBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgYmJveGVzXG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBzbGljZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICB0YWdzOiBmZWF0dXJlc1tpXS50YWdzIHx8IG51bGxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWQubGVuZ3RoID8gY2xpcHBlZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNsaXBQb2ludHMoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcykge1xuICAgIHZhciBzbGljZSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYSA9IGdlb21ldHJ5W2ldLFxuICAgICAgICAgICAgYWsgPSBhW2F4aXNdO1xuXG4gICAgICAgIGlmIChhayA+PSBrMSAmJiBhayA8PSBrMikgc2xpY2UucHVzaChhKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuXG5mdW5jdGlvbiBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCBjbG9zZWQpIHtcblxuICAgIHZhciBzbGljZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgYWsgPSAwLFxuICAgICAgICAgICAgYmsgPSAwLFxuICAgICAgICAgICAgYiA9IG51bGwsXG4gICAgICAgICAgICBwb2ludHMgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFyZWEgPSBwb2ludHMuYXJlYSxcbiAgICAgICAgICAgIGRpc3QgPSBwb2ludHMuZGlzdCxcbiAgICAgICAgICAgIGxlbiA9IHBvaW50cy5sZW5ndGgsXG4gICAgICAgICAgICBhLCBqO1xuXG4gICAgICAgIHZhciBzbGljZSA9IFtdO1xuXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW4gLSAxOyBqKyspIHtcbiAgICAgICAgICAgIGEgPSBiIHx8IHBvaW50c1tqXTtcbiAgICAgICAgICAgIGIgPSBwb2ludHNbaiArIDFdO1xuICAgICAgICAgICAgYWsgPSBiayB8fCBhW2F4aXNdO1xuICAgICAgICAgICAgYmsgPSBiW2F4aXNdO1xuXG4gICAgICAgICAgICBpZiAoYWsgPCBrMSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKChiayA+IGsyKSkgeyAvLyAtLS18LS0tLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSwgaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiayA+PSBrMSkgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazEpKTsgLy8gLS0tfC0tPiAgfFxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFrID4gazIpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPCBrMSkpIHsgLy8gPC0tfC0tLS0tfC0tLVxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMiksIGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPD0gazIpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7IC8vIHwgIDwtLXwtLS1cblxuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmsgPCBrMSkgeyAvLyA8LS18LS0tICB8XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiayA+IGsyKSB7IC8vIHwgIC0tLXwtLT5cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHwgLS0+IHxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCB0aGUgbGFzdCBwb2ludFxuICAgICAgICBhID0gcG9pbnRzW2xlbiAtIDFdO1xuICAgICAgICBhayA9IGFbYXhpc107XG4gICAgICAgIGlmIChhayA+PSBrMSAmJiBhayA8PSBrMikgc2xpY2UucHVzaChhKTtcblxuICAgICAgICAvLyBjbG9zZSB0aGUgcG9seWdvbiBpZiBpdHMgZW5kcG9pbnRzIGFyZSBub3QgdGhlIHNhbWUgYWZ0ZXIgY2xpcHBpbmdcbiAgICAgICAgaWYgKGNsb3NlZCAmJiBzbGljZVswXSAhPT0gc2xpY2Vbc2xpY2UubGVuZ3RoIC0gMV0pIHNsaWNlLnB1c2goc2xpY2VbMF0pO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgZmluYWwgc2xpY2VcbiAgICAgICAgbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNsaWNlcztcbn1cblxuZnVuY3Rpb24gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCkge1xuICAgIGlmIChzbGljZS5sZW5ndGgpIHtcbiAgICAgICAgLy8gd2UgZG9uJ3QgcmVjYWxjdWxhdGUgdGhlIGFyZWEvbGVuZ3RoIG9mIHRoZSB1bmNsaXBwZWQgZ2VvbWV0cnkgYmVjYXVzZSB0aGUgY2FzZSB3aGVyZSBpdCBnb2VzXG4gICAgICAgIC8vIGJlbG93IHRoZSB2aXNpYmlsaXR5IHRocmVzaG9sZCBhcyBhIHJlc3VsdCBvZiBjbGlwcGluZyBpcyByYXJlLCBzbyB3ZSBhdm9pZCBkb2luZyB1bm5lY2Vzc2FyeSB3b3JrXG4gICAgICAgIHNsaWNlLmFyZWEgPSBhcmVhO1xuICAgICAgICBzbGljZS5kaXN0ID0gZGlzdDtcblxuICAgICAgICBzbGljZXMucHVzaChzbGljZSk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0O1xuXG52YXIgc2ltcGxpZnkgPSByZXF1aXJlKCcuL3NpbXBsaWZ5Jyk7XG5cbi8vIGNvbnZlcnRzIEdlb0pTT04gZmVhdHVyZSBpbnRvIGFuIGludGVybWVkaWF0ZSBwcm9qZWN0ZWQgSlNPTiB2ZWN0b3IgZm9ybWF0IHdpdGggc2ltcGxpZmljYXRpb24gZGF0YVxuXG5mdW5jdGlvbiBjb252ZXJ0KGRhdGEsIHRvbGVyYW5jZSkge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLmZlYXR1cmVzW2ldLCB0b2xlcmFuY2UpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YSwgdG9sZXJhbmNlKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNpbmdsZSBnZW9tZXRyeSBvciBhIGdlb21ldHJ5IGNvbGxlY3Rpb25cbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtnZW9tZXRyeTogZGF0YX0sIHRvbGVyYW5jZSk7XG4gICAgfVxuICAgIHJldHVybiBmZWF0dXJlcztcbn1cblxuZnVuY3Rpb24gY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGZlYXR1cmUsIHRvbGVyYW5jZSkge1xuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGdlb20udHlwZSxcbiAgICAgICAgY29vcmRzID0gZ2VvbS5jb29yZGluYXRlcyxcbiAgICAgICAgdGFncyA9IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgaSwgaiwgcmluZ3M7XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAxLCBbcHJvamVjdFBvaW50KGNvb3JkcyldKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAxLCBwcm9qZWN0KGNvb3JkcykpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDIsIFtwcm9qZWN0KGNvb3JkcywgdG9sZXJhbmNlKV0pKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJpbmdzLnB1c2gocHJvamVjdChjb29yZHNbaV0sIHRvbGVyYW5jZSkpO1xuICAgICAgICB9XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIHR5cGUgPT09ICdQb2x5Z29uJyA/IDMgOiAyLCByaW5ncykpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICByaW5ncyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcmluZ3MucHVzaChwcm9qZWN0KGNvb3Jkc1tpXVtqXSwgdG9sZXJhbmNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMywgcmluZ3MpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20uZ2VvbWV0cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogZ2VvbS5nZW9tZXRyaWVzW2ldLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHRhZ3NcbiAgICAgICAgICAgIH0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVW5zdXBwb3J0ZWQgR2VvSlNPTiB0eXBlOiAnICsgZ2VvbS50eXBlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZSh0YWdzLCB0eXBlLCBnZW9tZXRyeSkge1xuICAgIHZhciBmZWF0dXJlID0ge1xuICAgICAgICBnZW9tZXRyeTogZ2VvbWV0cnksXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHRhZ3M6IHRhZ3MgfHwgbnVsbCxcbiAgICAgICAgbWluOiBbMSwgMV0sIC8vIGluaXRpYWwgYmJveCB2YWx1ZXM7XG4gICAgICAgIG1heDogWzAsIDBdICAvLyBub3RlIHRoYXQgYWxsIGNvb3JkcyBhcmUgaW4gWzAuLjFdIHJhbmdlXG4gICAgfTtcbiAgICBjYWxjQkJveChmZWF0dXJlKTtcbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdChsb25sYXRzLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgcHJvamVjdGVkID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25sYXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByb2plY3RlZC5wdXNoKHByb2plY3RQb2ludChsb25sYXRzW2ldKSk7XG4gICAgfVxuICAgIGlmICh0b2xlcmFuY2UpIHtcbiAgICAgICAgc2ltcGxpZnkocHJvamVjdGVkLCB0b2xlcmFuY2UpO1xuICAgICAgICBjYWxjU2l6ZShwcm9qZWN0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvamVjdGVkO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0UG9pbnQocCkge1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbihwWzFdICogTWF0aC5QSSAvIDE4MCksXG4gICAgICAgIHggPSAocFswXSAvIDM2MCArIDAuNSksXG4gICAgICAgIHkgPSAoMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJKTtcbiAgICByZXR1cm4gW3gsIHksIDBdO1xufVxuXG4vLyBjYWxjdWxhdGUgYXJlYSBhbmQgbGVuZ3RoIG9mIHRoZSBwb2x5XG5mdW5jdGlvbiBjYWxjU2l6ZShwb2ludHMpIHtcbiAgICB2YXIgYXJlYSA9IDAsXG4gICAgICAgIGRpc3QgPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGEsIGI7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGEgPSBiIHx8IHBvaW50c1tpXTtcbiAgICAgICAgYiA9IHBvaW50c1tpICsgMV07XG5cbiAgICAgICAgYXJlYSArPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdO1xuXG4gICAgICAgIC8vIHVzZSBNYW5oYXR0YW4gZGlzdGFuY2UgaW5zdGVhZCBvZiBFdWNsaWRpYW4gb25lIHRvIGF2b2lkIGV4cGVuc2l2ZSBzcXVhcmUgcm9vdCBjb21wdXRhdGlvblxuICAgICAgICBkaXN0ICs9IE1hdGguYWJzKGJbMF0gLSBhWzBdKSArIE1hdGguYWJzKGJbMV0gLSBhWzFdKTtcbiAgICB9XG4gICAgcG9pbnRzLmFyZWEgPSBNYXRoLmFicyhhcmVhIC8gMik7XG4gICAgcG9pbnRzLmRpc3QgPSBkaXN0O1xufVxuXG4vLyBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgYm91bmRpbmcgYm94IGZvciBmYXN0ZXIgY2xpcHBpbmcgbGF0ZXJcbmZ1bmN0aW9uIGNhbGNCQm94KGZlYXR1cmUpIHtcbiAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICBtaW4gPSBmZWF0dXJlLm1pbixcbiAgICAgICAgbWF4ID0gZmVhdHVyZS5tYXg7XG5cbiAgICBpZiAoZmVhdHVyZS50eXBlID09PSAxKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5KTtcbiAgICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIGNhbGNSaW5nQkJveChtaW4sIG1heCwgZ2VvbWV0cnlbaV0pO1xuXG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIGNhbGNSaW5nQkJveChtaW4sIG1heCwgcG9pbnRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcCA9IHBvaW50c1tpXTtcbiAgICAgICAgbWluWzBdID0gTWF0aC5taW4ocFswXSwgbWluWzBdKTtcbiAgICAgICAgbWF4WzBdID0gTWF0aC5tYXgocFswXSwgbWF4WzBdKTtcbiAgICAgICAgbWluWzFdID0gTWF0aC5taW4ocFsxXSwgbWluWzFdKTtcbiAgICAgICAgbWF4WzFdID0gTWF0aC5tYXgocFsxXSwgbWF4WzFdKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VvanNvbnZ0O1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJy4vY29udmVydCcpLCAvLyBHZW9KU09OIGNvbnZlcnNpb24gYW5kIHByZXByb2Nlc3NpbmdcbiAgICBjbGlwID0gcmVxdWlyZSgnLi9jbGlwJyksICAgICAgIC8vIHN0cmlwZSBjbGlwcGluZyBhbGdvcml0aG1cbiAgICBjcmVhdGVUaWxlID0gcmVxdWlyZSgnLi90aWxlJyk7IC8vIGZpbmFsIHNpbXBsaWZpZWQgdGlsZSBnZW5lcmF0aW9uXG5cblxuZnVuY3Rpb24gZ2VvanNvbnZ0KGRhdGEsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdlb0pTT05WVChkYXRhLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSwgb3B0aW9ucyk7XG5cbiAgICB2YXIgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgaWYgKGRlYnVnKSBjb25zb2xlLnRpbWUoJ3ByZXByb2Nlc3MgZGF0YScpO1xuXG4gICAgdmFyIHoyID0gMSA8PCBvcHRpb25zLmJhc2Vab29tLCAvLyAyXnpcbiAgICAgICAgZmVhdHVyZXMgPSBjb252ZXJ0KGRhdGEsIG9wdGlvbnMudG9sZXJhbmNlIC8gKHoyICogb3B0aW9ucy5leHRlbnQpKTtcblxuICAgIHRoaXMudGlsZXMgPSB7fTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3ByZXByb2Nlc3MgZGF0YScpO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ2dlbmVyYXRlIHRpbGVzIHVwIHRvIHonICsgb3B0aW9ucy5tYXhab29tKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHt9O1xuICAgICAgICB0aGlzLnRvdGFsID0gMDtcbiAgICB9XG5cbiAgICAvLyBzdGFydCBzbGljaW5nIGZyb20gdGhlIHRvcCB0aWxlIGRvd25cbiAgICB0aGlzLnNwbGl0VGlsZShmZWF0dXJlcywgMCwgMCwgMCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2ZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCcsIHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsIHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdnZW5lcmF0ZSB0aWxlcyB1cCB0byB6JyArIG9wdGlvbnMubWF4Wm9vbSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0aWxlcyBnZW5lcmF0ZWQ6JywgdGhpcy50b3RhbCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0cykpO1xuICAgIH1cbn1cblxuR2VvSlNPTlZULnByb3RvdHlwZS5vcHRpb25zID0ge1xuICAgIGJhc2Vab29tOiAxNCwgICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICBtYXhab29tOiA0LCAgICAgLy8gem9vbSB0byBzbGljZSBkb3duIHRvIG9uIGZpcnN0IHBhc3NcbiAgICBtYXhQb2ludHM6IDEwMCwgLy8gc3RvcCBzbGljaW5nIGEgdGlsZSBiZWxvdyB0aGlzIG51bWJlciBvZiBwb2ludHNcbiAgICB0b2xlcmFuY2U6IDMsICAgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICBleHRlbnQ6IDQwOTYsICAgLy8gdGlsZSBleHRlbnRcbiAgICBidWZmZXI6IDY0LCAgICAgLy8gdGlsZSBidWZmZXIgb24gZWFjaCBzaWRlXG4gICAgZGVidWc6IDAgICAgICAgIC8vIGxvZ2dpbmcgbGV2ZWwgKDAsIDEgb3IgMilcbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB6LCB4LCB5LCBjeiwgY3gsIGN5KSB7XG5cbiAgICB2YXIgc3RhY2sgPSBbZmVhdHVyZXMsIHosIHgsIHldLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWcsXG4gICAgICAgIGV4dGVudCA9IG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICBidWZmZXIgPSBvcHRpb25zLmJ1ZmZlcjtcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHByb2Nlc3NpbmcgcXVldWVcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGZlYXR1cmVzID0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgeiA9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgIHggPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICB5ID0gc3RhY2suc2hpZnQoKTtcblxuICAgICAgICB2YXIgejIgPSAxIDw8IHosXG4gICAgICAgICAgICBpZCA9IHRvSUQoeiwgeCwgeSksXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF0sXG4gICAgICAgICAgICB0aWxlVG9sZXJhbmNlID0geiA9PT0gb3B0aW9ucy5iYXNlWm9vbSA/IDAgOiBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIGV4dGVudCk7XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB4LCB5LCB0aWxlVG9sZXJhbmNlLCBleHRlbnQsIHogPT09IG9wdGlvbnMuYmFzZVpvb20pO1xuXG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aWxlIHolZC0lZC0lZCAoZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkLCBzaW1wbGlmaWVkOiAlZCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgeiwgeCwgeSwgdGlsZS5udW1GZWF0dXJlcywgdGlsZS5udW1Qb2ludHMsIHRpbGUubnVtU2ltcGxpZmllZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgnY3JlYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9ICd6JyArIHogKyAnOic7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0c1trZXldID0gKHRoaXMuc3RhdHNba2V5XSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjeiAmJiAoeiA9PT0gb3B0aW9ucy5tYXhab29tIHx8IHRpbGUubnVtUG9pbnRzIDw9IG9wdGlvbnMubWF4UG9pbnRzIHx8XG4gICAgICAgICAgICAgICAgaXNDbGlwcGVkU3F1YXJlKHRpbGUuZmVhdHVyZXMsIGV4dGVudCwgYnVmZmVyKSkgfHwgeiA9PT0gb3B0aW9ucy5iYXNlWm9vbSB8fCB6ID09PSBjeikge1xuICAgICAgICAgICAgdGlsZS5zb3VyY2UgPSBmZWF0dXJlcztcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBzdG9wIHRpbGluZ1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN6KSB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuICAgICAgICBlbHNlIHRpbGUuc291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgLy8gdmFsdWVzIHdlJ2xsIHVzZSBmb3IgY2xpcHBpbmdcbiAgICAgICAgdmFyIGsxID0gMC41ICogYnVmZmVyIC8gZXh0ZW50LFxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcbiAgICAgICAgICAgIGszID0gMC41ICsgazEsXG4gICAgICAgICAgICBrNCA9IDEgKyBrMSxcblxuICAgICAgICAgICAgdGwsIGJsLCB0ciwgYnIsIGxlZnQsIHJpZ2h0LFxuICAgICAgICAgICAgbSwgZ29MZWZ0LCBnb1RvcDtcblxuICAgICAgICBpZiAoY3opIHsgLy8gaWYgd2UgaGF2ZSBhIHNwZWNpZmljIHRpbGUgdG8gZHJpbGwgZG93biB0bywgY2FsY3VsYXRlIHdoZXJlIHRvIGdvXG4gICAgICAgICAgICBtID0gMSA8PCAoY3ogLSB6KTtcbiAgICAgICAgICAgIGdvTGVmdCA9IGN4IC8gbSAtIHggPCAwLjU7XG4gICAgICAgICAgICBnb1RvcCA9IGN5IC8gbSAtIHkgPCAwLjU7XG4gICAgICAgIH1cblxuICAgICAgICB0bCA9IGJsID0gdHIgPSBiciA9IGxlZnQgPSByaWdodCA9IG51bGw7XG5cbiAgICAgICAgaWYgKCFjeiB8fCAgZ29MZWZ0KSBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4IC0gazEsIHggKyBrMywgMCwgaW50ZXJzZWN0WCk7XG4gICAgICAgIGlmICghY3ogfHwgIWdvTGVmdCkgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCArIGsyLCB4ICsgazQsIDAsIGludGVyc2VjdFgpO1xuXG4gICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICBpZiAoIWN6IHx8ICBnb1RvcCkgdGwgPSBjbGlwKGxlZnQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgaW50ZXJzZWN0WSk7XG4gICAgICAgICAgICBpZiAoIWN6IHx8ICFnb1RvcCkgYmwgPSBjbGlwKGxlZnQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIGlmICghY3ogfHwgIGdvVG9wKSB0ciA9IGNsaXAocmlnaHQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgaW50ZXJzZWN0WSk7XG4gICAgICAgICAgICBpZiAoIWN6IHx8ICFnb1RvcCkgYnIgPSBjbGlwKHJpZ2h0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdjbGlwcGluZycpO1xuXG4gICAgICAgIGlmICh0bCkgc3RhY2sucHVzaCh0bCwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIpO1xuICAgICAgICBpZiAoYmwpIHN0YWNrLnB1c2goYmwsIHogKyAxLCB4ICogMiwgICAgIHkgKiAyICsgMSk7XG4gICAgICAgIGlmICh0cikgc3RhY2sucHVzaCh0ciwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIpO1xuICAgICAgICBpZiAoYnIpIHN0YWNrLnB1c2goYnIsIHogKyAxLCB4ICogMiArIDEsIHkgKiAyICsgMSk7XG4gICAgfVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5nZXRUaWxlID0gZnVuY3Rpb24gKHosIHgsIHkpIHtcbiAgICB2YXIgaWQgPSB0b0lEKHosIHgsIHkpO1xuICAgIGlmICh0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIHRoaXMudGlsZXNbaWRdO1xuXG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUubG9nKCdkcmlsbGluZyBkb3duIHRvIHolZC0lZC0lZCcsIHosIHgsIHkpO1xuXG4gICAgdmFyIHowID0geixcbiAgICAgICAgeDAgPSB4LFxuICAgICAgICB5MCA9IHksXG4gICAgICAgIHBhcmVudDtcblxuICAgIHdoaWxlICghcGFyZW50ICYmIHowID4gMCkge1xuICAgICAgICB6MC0tO1xuICAgICAgICB4MCA9IE1hdGguZmxvb3IoeDAgLyAyKTtcbiAgICAgICAgeTAgPSBNYXRoLmZsb29yKHkwIC8gMik7XG4gICAgICAgIHBhcmVudCA9IHRoaXMudGlsZXNbdG9JRCh6MCwgeDAsIHkwKV07XG4gICAgfVxuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2ZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZCcsIHowLCB4MCwgeTApO1xuXG4gICAgLy8gaWYgd2UgZm91bmQgYSBwYXJlbnQgdGlsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBnZW9tZXRyeSwgd2UgY2FuIGRyaWxsIGRvd24gZnJvbSBpdFxuICAgIGlmIChwYXJlbnQuc291cmNlKSB7XG4gICAgICAgIGlmIChpc0NsaXBwZWRTcXVhcmUocGFyZW50LmZlYXR1cmVzLCBvcHRpb25zLmV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSByZXR1cm4gcGFyZW50O1xuXG4gICAgICAgIGlmIChkZWJ1ZykgY29uc29sZS50aW1lKCdkcmlsbGluZyBkb3duJyk7XG4gICAgICAgIHRoaXMuc3BsaXRUaWxlKHBhcmVudC5zb3VyY2UsIHowLCB4MCwgeTAsIHosIHgsIHkpO1xuICAgICAgICBpZiAoZGVidWcpIGNvbnNvbGUudGltZUVuZCgnZHJpbGxpbmcgZG93bicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRpbGVzW2lkXTtcbn07XG5cbi8vIGNoZWNrcyB3aGV0aGVyIGEgdGlsZSBpcyBhIHdob2xlLWFyZWEgZmlsbCBhZnRlciBjbGlwcGluZzsgaWYgaXQgaXMsIHRoZXJlJ3Mgbm8gc2Vuc2Ugc2xpY2luZyBpdCBmdXJ0aGVyXG5mdW5jdGlvbiBpc0NsaXBwZWRTcXVhcmUoZmVhdHVyZXMsIGV4dGVudCwgYnVmZmVyKSB7XG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1swXTtcbiAgICBpZiAoZmVhdHVyZS50eXBlICE9PSAzIHx8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlLmdlb21ldHJ5WzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwID0gZmVhdHVyZS5nZW9tZXRyeVswXVtpXTtcbiAgICAgICAgaWYgKChwWzBdICE9PSAtYnVmZmVyICYmIHBbMF0gIT09IGV4dGVudCArIGJ1ZmZlcikgfHxcbiAgICAgICAgICAgIChwWzFdICE9PSAtYnVmZmVyICYmIHBbMV0gIT09IGV4dGVudCArIGJ1ZmZlcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHRvSUQoeiwgeCwgeSkge1xuICAgIHJldHVybiAoKCgxIDw8IHopICogeSArIHgpICogMzIpICsgejtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0WChhLCBiLCB4KSB7XG4gICAgcmV0dXJuIFt4LCAoeCAtIGFbMF0pICogKGJbMV0gLSBhWzFdKSAvIChiWzBdIC0gYVswXSkgKyBhWzFdLCAxXTtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdFkoYSwgYiwgeSkge1xuICAgIHJldHVybiBbKHkgLSBhWzFdKSAqIChiWzBdIC0gYVswXSkgLyAoYlsxXSAtIGFbMV0pICsgYVswXSwgeSwgMV07XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzaW1wbGlmeTtcblxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZnVuY3Rpb24gc2ltcGxpZnkocG9pbnRzLCB0b2xlcmFuY2UpIHtcblxuICAgIHZhciBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgZmlyc3QgPSAwLFxuICAgICAgICBsYXN0ID0gbGVuIC0gMSxcbiAgICAgICAgc3RhY2sgPSBbXSxcbiAgICAgICAgaSwgbWF4U3FEaXN0LCBzcURpc3QsIGluZGV4O1xuXG4gICAgLy8gYWx3YXlzIHJldGFpbiB0aGUgZW5kcG9pbnRzICgxIGlzIHRoZSBtYXggdmFsdWUpXG4gICAgcG9pbnRzW2ZpcnN0XVsyXSA9IDE7XG4gICAgcG9pbnRzW2xhc3RdWzJdID0gMTtcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHN0YWNrXG4gICAgd2hpbGUgKGxhc3QpIHtcblxuICAgICAgICBtYXhTcURpc3QgPSAwO1xuXG4gICAgICAgIGZvciAoaSA9IGZpcnN0ICsgMTsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgICAgICAgc3FEaXN0ID0gZ2V0U3FTZWdEaXN0KHBvaW50c1tpXSwgcG9pbnRzW2ZpcnN0XSwgcG9pbnRzW2xhc3RdKTtcblxuICAgICAgICAgICAgaWYgKHNxRGlzdCA+IG1heFNxRGlzdCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtYXhTcURpc3QgPSBzcURpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4U3FEaXN0ID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgIHBvaW50c1tpbmRleF1bMl0gPSBtYXhTcURpc3Q7IC8vIHNhdmUgdGhlIHBvaW50IGltcG9ydGFuY2UgaW4gc3F1YXJlZCBwaXhlbHMgYXMgYSB6IGNvb3JkaW5hdGVcbiAgICAgICAgICAgIHN0YWNrLnB1c2goZmlyc3QsIGluZGV4LCBpbmRleCwgbGFzdCk7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGZpcnN0ID0gc3RhY2sucG9wKCk7XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHAsIGEsIGIpIHtcblxuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sXG4gICAgICAgIGJ4ID0gYlswXSwgYnkgPSBiWzFdLFxuICAgICAgICBweCA9IHBbMF0sIHB5ID0gcFsxXSxcbiAgICAgICAgZHggPSBieCAtIHgsXG4gICAgICAgIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVGlsZTtcblxuZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHR4LCB0eSwgdG9sZXJhbmNlLCBleHRlbnQsIG5vU2ltcGxpZnkpIHtcbiAgICB2YXIgdGlsZSA9IHtcbiAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgICBudW1Qb2ludHM6IDAsXG4gICAgICAgIG51bVNpbXBsaWZpZWQ6IDAsXG4gICAgICAgIG51bUZlYXR1cmVzOiAwLFxuICAgICAgICBzb3VyY2U6IG51bGxcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGlsZS5udW1GZWF0dXJlcysrO1xuICAgICAgICBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmVzW2ldLCB6MiwgdHgsIHR5LCB0b2xlcmFuY2UsIGV4dGVudCwgbm9TaW1wbGlmeSk7XG4gICAgfVxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmUsIHoyLCB0eCwgdHksIHRvbGVyYW5jZSwgZXh0ZW50LCBub1NpbXBsaWZ5KSB7XG5cbiAgICB2YXIgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGUsXG4gICAgICAgIHRyYW5zZm9ybWVkID0gW10sXG4gICAgICAgIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlLFxuICAgICAgICBpLCBqLCByaW5nLCBwO1xuXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkLnB1c2godHJhbnNmb3JtUG9pbnQoZ2VvbVtpXSwgejIsIHR4LCB0eSwgZXh0ZW50KSk7XG4gICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgLy8gc2ltcGxpZnkgYW5kIHRyYW5zZm9ybSBwcm9qZWN0ZWQgY29vcmRpbmF0ZXMgZm9yIHRpbGUgZ2VvbWV0cnlcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJpbmcgPSBnZW9tW2ldO1xuXG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IHRpbnkgcG9seWxpbmVzICYgcG9seWdvbnNcbiAgICAgICAgICAgIGlmICghbm9TaW1wbGlmeSAmJiAoKHR5cGUgPT09IDIgJiYgcmluZy5kaXN0IDwgdG9sZXJhbmNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PT0gMyAmJiByaW5nLmFyZWEgPCBzcVRvbGVyYW5jZSkpKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMgKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lZFJpbmcgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBwID0gcmluZ1tqXTtcbiAgICAgICAgICAgICAgICAvLyBrZWVwIHBvaW50cyB3aXRoIGltcG9ydGFuY2UgPiB0b2xlcmFuY2VcbiAgICAgICAgICAgICAgICBpZiAobm9TaW1wbGlmeSB8fCBwWzJdID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRSaW5nLnB1c2godHJhbnNmb3JtUG9pbnQocCwgejIsIHR4LCB0eSwgZXh0ZW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cmFuc2Zvcm1lZC5wdXNoKHRyYW5zZm9ybWVkUmluZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHJhbnNmb3JtZWQubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaCh7XG4gICAgICAgICAgICBnZW9tZXRyeTogdHJhbnNmb3JtZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgdGFnczogZmVhdHVyZS50YWdzIHx8IG51bGxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludChwLCB6MiwgdHgsIHR5LCBleHRlbnQpIHtcbiAgICB2YXIgeCA9IE1hdGgucm91bmQoZXh0ZW50ICogKHBbMF0gKiB6MiAtIHR4KSksXG4gICAgICAgIHkgPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzFdICogejIgLSB0eSkpO1xuICAgIHJldHVybiBbeCwgeV07XG59XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgZ2wtbWF0cml4IC0gSGlnaCBwZXJmb3JtYW5jZSBtYXRyaXggYW5kIHZlY3RvciBvcGVyYXRpb25zXG4gKiBAYXV0aG9yIEJyYW5kb24gSm9uZXNcbiAqIEBhdXRob3IgQ29saW4gTWFjS2VuemllIElWXG4gKiBAdmVyc2lvbiAyLjIuMVxuICovXG5cbi8qIENvcHlyaWdodCAoYykgMjAxMywgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG5BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG5cbihmdW5jdGlvbihfZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBzaGltID0ge307XG4gIGlmICh0eXBlb2YoZXhwb3J0cykgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcbiAgICAgIHNoaW0uZXhwb3J0cyA9IHt9O1xuICAgICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc2hpbS5leHBvcnRzO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGdsLW1hdHJpeCBsaXZlcyBpbiBhIGJyb3dzZXIsIGRlZmluZSBpdHMgbmFtZXNwYWNlcyBpbiBnbG9iYWxcbiAgICAgIHNoaW0uZXhwb3J0cyA9IHR5cGVvZih3aW5kb3cpICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IF9nbG9iYWw7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIGdsLW1hdHJpeCBsaXZlcyBpbiBjb21tb25qcywgZGVmaW5lIGl0cyBuYW1lc3BhY2VzIGluIGV4cG9ydHNcbiAgICBzaGltLmV4cG9ydHMgPSBleHBvcnRzO1xuICB9XG5cbiAgKGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiAgICAvKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbmFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIFxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIFxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG5cbmlmKCFHTE1BVF9FUFNJTE9OKSB7XG4gICAgdmFyIEdMTUFUX0VQU0lMT04gPSAwLjAwMDAwMTtcbn1cblxuaWYoIUdMTUFUX0FSUkFZX1RZUEUpIHtcbiAgICB2YXIgR0xNQVRfQVJSQVlfVFlQRSA9ICh0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJykgPyBGbG9hdDMyQXJyYXkgOiBBcnJheTtcbn1cblxuaWYoIUdMTUFUX1JBTkRPTSkge1xuICAgIHZhciBHTE1BVF9SQU5ET00gPSBNYXRoLnJhbmRvbTtcbn1cblxuLyoqXG4gKiBAY2xhc3MgQ29tbW9uIHV0aWxpdGllc1xuICogQG5hbWUgZ2xNYXRyaXhcbiAqL1xudmFyIGdsTWF0cml4ID0ge307XG5cbi8qKlxuICogU2V0cyB0aGUgdHlwZSBvZiBhcnJheSB1c2VkIHdoZW4gY3JlYXRpbmcgbmV3IHZlY3RvcnMgYW5kIG1hdHJpY2llc1xuICpcbiAqIEBwYXJhbSB7VHlwZX0gdHlwZSBBcnJheSB0eXBlLCBzdWNoIGFzIEZsb2F0MzJBcnJheSBvciBBcnJheVxuICovXG5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgR0xNQVRfQVJSQVlfVFlQRSA9IHR5cGU7XG59XG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLmdsTWF0cml4ID0gZ2xNYXRyaXg7XG59XG5cbnZhciBkZWdyZWUgPSBNYXRoLlBJIC8gMTgwO1xuXG4vKipcbiogQ29udmVydCBEZWdyZWUgVG8gUmFkaWFuXG4qXG4qIEBwYXJhbSB7TnVtYmVyfSBBbmdsZSBpbiBEZWdyZWVzXG4qL1xuZ2xNYXRyaXgudG9SYWRpYW4gPSBmdW5jdGlvbihhKXtcbiAgICAgcmV0dXJuIGEgKiBkZWdyZWU7XG59XG47XG4vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbmFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIFxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIFxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG4vKipcbiAqIEBjbGFzcyAyIERpbWVuc2lvbmFsIFZlY3RvclxuICogQG5hbWUgdmVjMlxuICovXG5cbnZhciB2ZWMyID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjMlxuICpcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xudmVjMi5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoMik7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xudmVjMi5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoMik7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xudmVjMi5mcm9tVmFsdWVzID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHkpIHtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuc3ViID0gdmVjMi5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5tdWwgPSB2ZWMyLm11bHRpcGx5O1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5kaXZpZGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuZGl2ID0gdmVjMi5kaXZpZGU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzIuZGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuZGlzdCA9IHZlYzIuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMyLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV07XG4gICAgcmV0dXJuIHgqeCArIHkqeTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLnNxckRpc3QgPSB2ZWMyLnNxdWFyZWREaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG52ZWMyLmxlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5sZW4gPSB2ZWMyLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMyLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV07XG4gICAgcmV0dXJuIHgqeCArIHkqeTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5zcXJMZW4gPSB2ZWMyLnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5uZWdhdGUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubm9ybWFsaXplID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWMyLmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV07XG59O1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqIE5vdGUgdGhhdCB0aGUgY3Jvc3MgcHJvZHVjdCBtdXN0IGJ5IGRlZmluaXRpb24gcHJvZHVjZSBhIDNEIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMi5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciB6ID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTtcbiAgICBvdXRbMF0gPSBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IHo7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV07XG4gICAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gICAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5yYW5kb20gPSBmdW5jdGlvbiAob3V0LCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICAgIHZhciByID0gR0xNQVRfUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICAgIG91dFswXSA9IE1hdGguY29zKHIpICogc2NhbGU7XG4gICAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiBzY2FsZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHttYXQyfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnRyYW5zZm9ybU1hdDIgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHk7XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0MmR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIudHJhbnNmb3JtTWF0MmQgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdO1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDNcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHttYXQzfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnRyYW5zZm9ybU1hdDMgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVszXSAqIHkgKyBtWzZdO1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs0XSAqIHkgKyBtWzddO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDRcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzAnXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLCBcbiAgICAgICAgeSA9IGFbMV07XG4gICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bMTJdO1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzEzXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjMnMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMi4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzJzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLmZvckVhY2ggPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZlYyA9IHZlYzIuY3JlYXRlKCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgICAgIHZhciBpLCBsO1xuICAgICAgICBpZighc3RyaWRlKSB7XG4gICAgICAgICAgICBzdHJpZGUgPSAyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIW9mZnNldCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYoY291bnQpIHtcbiAgICAgICAgICAgIGwgPSBNYXRoLm1pbigoY291bnQgKiBzdHJpZGUpICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsID0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICAgICAgICB2ZWNbMF0gPSBhW2ldOyB2ZWNbMV0gPSBhW2krMV07XG4gICAgICAgICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgICAgICAgIGFbaV0gPSB2ZWNbMF07IGFbaSsxXSA9IHZlY1sxXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gdmVjIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbnZlYzIuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ3ZlYzIoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcpJztcbn07XG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLnZlYzIgPSB2ZWMyO1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBcbiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG5BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBcbkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXG5BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbkxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxuQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG5TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gKi9cblxuLyoqXG4gKiBAY2xhc3MgMyBEaW1lbnNpb25hbCBWZWN0b3JcbiAqIEBuYW1lIHZlYzNcbiAqL1xuXG52YXIgdmVjMyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzNcbiAqXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXG4gKi9cbnZlYzMuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDMpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xudmVjMy5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoMyk7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xudmVjMy5mcm9tVmFsdWVzID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgzKTtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMyB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnNldCA9IGZ1bmN0aW9uKG91dCwgeCwgeSwgeikge1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5zdWJ0cmFjdCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMzLnN1YiA9IHZlYzMuc3VidHJhY3Q7XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLm11bHRpcGx5ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMubXVsID0gdmVjMy5tdWx0aXBseTtcblxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuZGl2aWRlID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMzLmRpdiA9IHZlYzMuZGl2aWRlO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5taW4gPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubWF4ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIGEgdmVjMyBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYjtcbiAgICBvdXRbMV0gPSBhWzFdICogYjtcbiAgICBvdXRbMl0gPSBhWzJdICogYjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWMzJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5zY2FsZUFuZEFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgKGJbMF0gKiBzY2FsZSk7XG4gICAgb3V0WzFdID0gYVsxXSArIChiWzFdICogc2NhbGUpO1xuICAgIG91dFsyXSA9IGFbMl0gKyAoYlsyXSAqIHNjYWxlKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xudmVjMy5kaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeik7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5kaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMzLmRpc3QgPSB2ZWMzLmRpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xudmVjMy5zcXVhcmVkRGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdLFxuICAgICAgICB6ID0gYlsyXSAtIGFbMl07XG4gICAgcmV0dXJuIHgqeCArIHkqeSArIHoqejtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMzLnNxckRpc3QgPSB2ZWMzLnNxdWFyZWREaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG52ZWMzLmxlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXSxcbiAgICAgICAgeiA9IGFbMl07XG4gICAgcmV0dXJuIE1hdGguc3FydCh4KnggKyB5KnkgKyB6KnopO1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMubGVuID0gdmVjMy5sZW5ndGg7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xudmVjMy5zcXVhcmVkTGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMzLnNxckxlbiA9IHZlYzMuc3F1YXJlZExlbmd0aDtcblxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLm5lZ2F0ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IC1hWzBdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIG91dFsyXSA9IC1hWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5ub3JtYWxpemUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5ICsgeip6O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgICAgICAgb3V0WzJdID0gYVsyXSAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWMzLmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdO1xuXG4gICAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV0sXG4gICAgICAgIGF6ID0gYVsyXTtcbiAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJhbmRvbSA9IGZ1bmN0aW9uIChvdXQsIHNjYWxlKSB7XG4gICAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG5cbiAgICB2YXIgciA9IEdMTUFUX1JBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgICB2YXIgeiA9IChHTE1BVF9SQU5ET00oKSAqIDIuMCkgLSAxLjA7XG4gICAgdmFyIHpTY2FsZSA9IE1hdGguc3FydCgxLjAteip6KSAqIHNjYWxlO1xuXG4gICAgb3V0WzBdID0gTWF0aC5jb3MocikgKiB6U2NhbGU7XG4gICAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiB6U2NhbGU7XG4gICAgb3V0WzJdID0geiAqIHNjYWxlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDQuXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy50cmFuc2Zvcm1NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07XG4gICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl07XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM107XG4gICAgb3V0WzJdID0gbVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDMuXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHttYXQ0fSBtIHRoZSAzeDMgbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMudHJhbnNmb3JtTWF0MyA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdO1xuICAgIG91dFswXSA9IHggKiBtWzBdICsgeSAqIG1bM10gKyB6ICogbVs2XTtcbiAgICBvdXRbMV0gPSB4ICogbVsxXSArIHkgKiBtWzRdICsgeiAqIG1bN107XG4gICAgb3V0WzJdID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge3F1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnRyYW5zZm9ybVF1YXQgPSBmdW5jdGlvbihvdXQsIGEsIHEpIHtcbiAgICAvLyBiZW5jaG1hcmtzOiBodHRwOi8vanNwZXJmLmNvbS9xdWF0ZXJuaW9uLXRyYW5zZm9ybS12ZWMzLWltcGxlbWVudGF0aW9uc1xuXG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl0sXG4gICAgICAgIHF4ID0gcVswXSwgcXkgPSBxWzFdLCBxeiA9IHFbMl0sIHF3ID0gcVszXSxcblxuICAgICAgICAvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY1xuICAgICAgICBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeSxcbiAgICAgICAgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHosXG4gICAgICAgIGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4LFxuICAgICAgICBpdyA9IC1xeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XG5cbiAgICAvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG4gICAgb3V0WzBdID0gaXggKiBxdyArIGl3ICogLXF4ICsgaXkgKiAtcXogLSBpeiAqIC1xeTtcbiAgICBvdXRbMV0gPSBpeSAqIHF3ICsgaXcgKiAtcXkgKyBpeiAqIC1xeCAtIGl4ICogLXF6O1xuICAgIG91dFsyXSA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qXG4qIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHgtYXhpc1xuKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcbiogQHBhcmFtIHt2ZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiogQHBhcmFtIHtOdW1iZXJ9IGMgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uXG4qIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiovXG52ZWMzLnJvdGF0ZVggPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICAgdmFyIHAgPSBbXSwgcj1bXTtcblx0ICAvL1RyYW5zbGF0ZSBwb2ludCB0byB0aGUgb3JpZ2luXG5cdCAgcFswXSA9IGFbMF0gLSBiWzBdO1xuXHQgIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgXHRwWzJdID0gYVsyXSAtIGJbMl07XG5cblx0ICAvL3BlcmZvcm0gcm90YXRpb25cblx0ICByWzBdID0gcFswXTtcblx0ICByWzFdID0gcFsxXSpNYXRoLmNvcyhjKSAtIHBbMl0qTWF0aC5zaW4oYyk7XG5cdCAgclsyXSA9IHBbMV0qTWF0aC5zaW4oYykgKyBwWzJdKk1hdGguY29zKGMpO1xuXG5cdCAgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXHQgIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuXHQgIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuXHQgIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuXG4gIFx0cmV0dXJuIG91dDtcbn07XG5cbi8qXG4qIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHktYXhpc1xuKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcbiogQHBhcmFtIHt2ZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiogQHBhcmFtIHtOdW1iZXJ9IGMgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uXG4qIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiovXG52ZWMzLnJvdGF0ZVkgPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICBcdHZhciBwID0gW10sIHI9W107XG4gIFx0Ly9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBcdHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgXHRwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuICBcbiAgXHQvL3BlcmZvcm0gcm90YXRpb25cbiAgXHRyWzBdID0gcFsyXSpNYXRoLnNpbihjKSArIHBbMF0qTWF0aC5jb3MoYyk7XG4gIFx0clsxXSA9IHBbMV07XG4gIFx0clsyXSA9IHBbMl0qTWF0aC5jb3MoYykgLSBwWzBdKk1hdGguc2luKGMpO1xuICBcbiAgXHQvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIFx0b3V0WzBdID0gclswXSArIGJbMF07XG4gIFx0b3V0WzFdID0gclsxXSArIGJbMV07XG4gIFx0b3V0WzJdID0gclsyXSArIGJbMl07XG4gIFxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKlxuKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB6LWF4aXNcbiogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4qIEBwYXJhbSB7dmVjM30gYSBUaGUgdmVjMyBwb2ludCB0byByb3RhdGVcbiogQHBhcmFtIHt2ZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4qIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuKiBAcmV0dXJucyB7dmVjM30gb3V0XG4qL1xudmVjMy5yb3RhdGVaID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBjKXtcbiAgXHR2YXIgcCA9IFtdLCByPVtdO1xuICBcdC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgXHRwWzBdID0gYVswXSAtIGJbMF07XG4gIFx0cFsxXSA9IGFbMV0gLSBiWzFdO1xuICBcdHBbMl0gPSBhWzJdIC0gYlsyXTtcbiAgXG4gIFx0Ly9wZXJmb3JtIHJvdGF0aW9uXG4gIFx0clswXSA9IHBbMF0qTWF0aC5jb3MoYykgLSBwWzFdKk1hdGguc2luKGMpO1xuICBcdHJbMV0gPSBwWzBdKk1hdGguc2luKGMpICsgcFsxXSpNYXRoLmNvcyhjKTtcbiAgXHRyWzJdID0gcFsyXTtcbiAgXG4gIFx0Ly90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuICBcdG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBcdG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBcdG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICBcbiAgXHRyZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjM3MuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMy4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzNzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcbiAqIEBmdW5jdGlvblxuICovXG52ZWMzLmZvckVhY2ggPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZlYyA9IHZlYzMuY3JlYXRlKCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgICAgIHZhciBpLCBsO1xuICAgICAgICBpZighc3RyaWRlKSB7XG4gICAgICAgICAgICBzdHJpZGUgPSAzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIW9mZnNldCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYoY291bnQpIHtcbiAgICAgICAgICAgIGwgPSBNYXRoLm1pbigoY291bnQgKiBzdHJpZGUpICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsID0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICAgICAgICB2ZWNbMF0gPSBhW2ldOyB2ZWNbMV0gPSBhW2krMV07IHZlY1syXSA9IGFbaSsyXTtcbiAgICAgICAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgICAgICAgYVtpXSA9IHZlY1swXTsgYVtpKzFdID0gdmVjWzFdOyBhW2krMl0gPSB2ZWNbMl07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWMzLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWMzKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcpJztcbn07XG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLnZlYzMgPSB2ZWMzO1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBcbiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG5BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBcbkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXG5BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbkxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxuQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG5TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gKi9cblxuLyoqXG4gKiBAY2xhc3MgNCBEaW1lbnNpb25hbCBWZWN0b3JcbiAqIEBuYW1lIHZlYzRcbiAqL1xuXG52YXIgdmVjNCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzRcbiAqXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXG4gKi9cbnZlYzQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjNCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6LCB3KSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIG91dFszXSA9IHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHksIHosIHcpIHtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSB3O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zdWJ0cmFjdCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LnN1YiA9IHZlYzQuc3VidHJhY3Q7XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm11bHRpcGx5ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAqIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQubXVsID0gdmVjNC5tdWx0aXBseTtcblxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuZGl2aWRlID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LmRpdiA9IHZlYzQuZGl2aWRlO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5taW4gPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgICBvdXRbM10gPSBNYXRoLm1pbihhWzNdLCBiWzNdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubWF4ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gICAgb3V0WzNdID0gTWF0aC5tYXgoYVszXSwgYlszXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIGEgdmVjNCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYjtcbiAgICBvdXRbMV0gPSBhWzFdICogYjtcbiAgICBvdXRbMl0gPSBhWzJdICogYjtcbiAgICBvdXRbM10gPSBhWzNdICogYjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWM0J3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zY2FsZUFuZEFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgKGJbMF0gKiBzY2FsZSk7XG4gICAgb3V0WzFdID0gYVsxXSArIChiWzFdICogc2NhbGUpO1xuICAgIG91dFsyXSA9IGFbMl0gKyAoYlsyXSAqIHNjYWxlKTtcbiAgICBvdXRbM10gPSBhWzNdICsgKGJbM10gKiBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzQuZGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdLFxuICAgICAgICB6ID0gYlsyXSAtIGFbMl0sXG4gICAgICAgIHcgPSBiWzNdIC0gYVszXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeiArIHcqdyk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5kaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LmRpc3QgPSB2ZWM0LmRpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xudmVjNC5zcXVhcmVkRGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdLFxuICAgICAgICB6ID0gYlsyXSAtIGFbMl0sXG4gICAgICAgIHcgPSBiWzNdIC0gYVszXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6ICsgdyp3O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQuc3FyRGlzdCA9IHZlYzQuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzQubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXSxcbiAgICAgICAgdyA9IGFbM107XG4gICAgcmV0dXJuIE1hdGguc3FydCh4KnggKyB5KnkgKyB6KnogKyB3KncpO1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQubGVuID0gdmVjNC5sZW5ndGg7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xudmVjNC5zcXVhcmVkTGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXSxcbiAgICAgICAgdyA9IGFbM107XG4gICAgcmV0dXJuIHgqeCArIHkqeSArIHoqeiArIHcqdztcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5zcXJMZW4gPSB2ZWM0LnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5uZWdhdGUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICBvdXRbMl0gPSAtYVsyXTtcbiAgICBvdXRbM10gPSAtYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubm9ybWFsaXplID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXSxcbiAgICAgICAgeiA9IGFbMl0sXG4gICAgICAgIHcgPSBhWzNdO1xuICAgIHZhciBsZW4gPSB4KnggKyB5KnkgKyB6KnogKyB3Knc7XG4gICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgICAgICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICAgICAgICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICAgICAgICBvdXRbMl0gPSBhWzJdICogbGVuO1xuICAgICAgICBvdXRbM10gPSBhWzNdICogbGVuO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXG4gKi9cbnZlYzQuZG90ID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LmxlcnAgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCB0KSB7XG4gICAgdmFyIGF4ID0gYVswXSxcbiAgICAgICAgYXkgPSBhWzFdLFxuICAgICAgICBheiA9IGFbMl0sXG4gICAgICAgIGF3ID0gYVszXTtcbiAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgICBvdXRbM10gPSBhdyArIHQgKiAoYlszXSAtIGF3KTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnJhbmRvbSA9IGZ1bmN0aW9uIChvdXQsIHNjYWxlKSB7XG4gICAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG5cbiAgICAvL1RPRE86IFRoaXMgaXMgYSBwcmV0dHkgYXdmdWwgd2F5IG9mIGRvaW5nIHRoaXMuIEZpbmQgc29tZXRoaW5nIGJldHRlci5cbiAgICBvdXRbMF0gPSBHTE1BVF9SQU5ET00oKTtcbiAgICBvdXRbMV0gPSBHTE1BVF9SQU5ET00oKTtcbiAgICBvdXRbMl0gPSBHTE1BVF9SQU5ET00oKTtcbiAgICBvdXRbM10gPSBHTE1BVF9SQU5ET00oKTtcbiAgICB2ZWM0Lm5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgdmVjNC5zY2FsZShvdXQsIG91dCwgc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzQgd2l0aCBhIG1hdDQuXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHttYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnRyYW5zZm9ybU1hdDQgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSwgdyA9IGFbM107XG4gICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0gKiB3O1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdICogdztcbiAgICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0gKiB3O1xuICAgIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XSAqIHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLFxuICAgICAgICBxeCA9IHFbMF0sIHF5ID0gcVsxXSwgcXogPSBxWzJdLCBxdyA9IHFbM10sXG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHF1YXQgKiB2ZWNcbiAgICAgICAgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHksXG4gICAgICAgIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6LFxuICAgICAgICBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeCxcbiAgICAgICAgaXcgPSAtcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xuXG4gICAgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuICAgIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gICAgb3V0WzFdID0gaXkgKiBxdyArIGl3ICogLXF5ICsgaXogKiAtcXggLSBpeCAqIC1xejtcbiAgICBvdXRbMl0gPSBpeiAqIHF3ICsgaXcgKiAtcXogKyBpeCAqIC1xeSAtIGl5ICogLXF4O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWM0cy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWM0LiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjMnMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjNC5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZihjb3VudCkge1xuICAgICAgICAgICAgbCA9IE1hdGgubWluKChjb3VudCAqIHN0cmlkZSkgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgICAgICAgIHZlY1swXSA9IGFbaV07IHZlY1sxXSA9IGFbaSsxXTsgdmVjWzJdID0gYVtpKzJdOyB2ZWNbM10gPSBhW2krM107XG4gICAgICAgICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgICAgICAgIGFbaV0gPSB2ZWNbMF07IGFbaSsxXSA9IHZlY1sxXTsgYVtpKzJdID0gdmVjWzJdOyBhW2krM10gPSB2ZWNbM107XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWM0LnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWM0KCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJyknO1xufTtcblxuaWYodHlwZW9mKGV4cG9ydHMpICE9PSAndW5kZWZpbmVkJykge1xuICAgIGV4cG9ydHMudmVjNCA9IHZlYzQ7XG59XG47XG4vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbmFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIFxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIFxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG4vKipcbiAqIEBjbGFzcyAyeDIgTWF0cml4XG4gKiBAbmFtZSBtYXQyXG4gKi9cblxudmFyIG1hdDIgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJcbiAqXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxuICovXG5tYXQyLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cbm1hdDIuY2xvbmUgPSBmdW5jdGlvbihhKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQyIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIudHJhbnNwb3NlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICAgIGlmIChvdXQgPT09IGEpIHtcbiAgICAgICAgdmFyIGExID0gYVsxXTtcbiAgICAgICAgb3V0WzFdID0gYVsyXTtcbiAgICAgICAgb3V0WzJdID0gYTE7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgICAgb3V0WzFdID0gYVsyXTtcbiAgICAgICAgb3V0WzJdID0gYVsxXTtcbiAgICAgICAgb3V0WzNdID0gYVszXTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSxcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgICAgIGRldCA9IGEwICogYTMgLSBhMiAqIGExO1xuXG4gICAgaWYgKCFkZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcbiAgICBcbiAgICBvdXRbMF0gPSAgYTMgKiBkZXQ7XG4gICAgb3V0WzFdID0gLWExICogZGV0O1xuICAgIG91dFsyXSA9IC1hMiAqIGRldDtcbiAgICBvdXRbM10gPSAgYTAgKiBkZXQ7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIENhY2hpbmcgdGhpcyB2YWx1ZSBpcyBuZXNzZWNhcnkgaWYgb3V0ID09IGFcbiAgICB2YXIgYTAgPSBhWzBdO1xuICAgIG91dFswXSA9ICBhWzNdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIG91dFsyXSA9IC1hWzJdO1xuICAgIG91dFszXSA9ICBhMDtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQyLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzJdICogYVsxXTtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MidzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM107XG4gICAgdmFyIGIwID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTtcbiAgICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xubWF0Mi5tdWwgPSBtYXQyLm11bHRpcGx5O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSxcbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGEwICogIGMgKyBhMiAqIHM7XG4gICAgb3V0WzFdID0gYTEgKiAgYyArIGEzICogcztcbiAgICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICAgIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqKi9cbm1hdDIuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMCAqIHYwO1xuICAgIG91dFsxXSA9IGExICogdjA7XG4gICAgb3V0WzJdID0gYTIgKiB2MTtcbiAgICBvdXRbM10gPSBhMyAqIHYxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBtYXQgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xubWF0Mi5zdHIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiAnbWF0MignICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cbm1hdDIuZnJvYiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuKE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSkpXG59O1xuXG4vKipcbiAqIFJldHVybnMgTCwgRCBhbmQgVSBtYXRyaWNlcyAoTG93ZXIgdHJpYW5ndWxhciwgRGlhZ29uYWwgYW5kIFVwcGVyIHRyaWFuZ3VsYXIpIGJ5IGZhY3Rvcml6aW5nIHRoZSBpbnB1dCBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gTCB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggXG4gKiBAcGFyYW0ge21hdDJ9IEQgdGhlIGRpYWdvbmFsIG1hdHJpeCBcbiAqIEBwYXJhbSB7bWF0Mn0gVSB0aGUgdXBwZXIgdHJpYW5ndWxhciBtYXRyaXggXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGlucHV0IG1hdHJpeCB0byBmYWN0b3JpemVcbiAqL1xuXG5tYXQyLkxEVSA9IGZ1bmN0aW9uIChMLCBELCBVLCBhKSB7IFxuICAgIExbMl0gPSBhWzJdL2FbMF07IFxuICAgIFVbMF0gPSBhWzBdOyBcbiAgICBVWzFdID0gYVsxXTsgXG4gICAgVVszXSA9IGFbM10gLSBMWzJdICogVVsxXTsgXG4gICAgcmV0dXJuIFtMLCBELCBVXTsgICAgICAgXG59OyBcblxuaWYodHlwZW9mKGV4cG9ydHMpICE9PSAndW5kZWZpbmVkJykge1xuICAgIGV4cG9ydHMubWF0MiA9IG1hdDI7XG59XG47XG4vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbmFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIFxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIFxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG4vKipcbiAqIEBjbGFzcyAyeDMgTWF0cml4XG4gKiBAbmFtZSBtYXQyZFxuICogXG4gKiBAZGVzY3JpcHRpb24gXG4gKiBBIG1hdDJkIGNvbnRhaW5zIHNpeCBlbGVtZW50cyBkZWZpbmVkIGFzOlxuICogPHByZT5cbiAqIFthLCBjLCB0eCxcbiAqICBiLCBkLCB0eV1cbiAqIDwvcHJlPlxuICogVGhpcyBpcyBhIHNob3J0IGZvcm0gZm9yIHRoZSAzeDMgbWF0cml4OlxuICogPHByZT5cbiAqIFthLCBjLCB0eCxcbiAqICBiLCBkLCB0eSxcbiAqICAwLCAwLCAxXVxuICogPC9wcmU+XG4gKiBUaGUgbGFzdCByb3cgaXMgaWdub3JlZCBzbyB0aGUgYXJyYXkgaXMgc2hvcnRlciBhbmQgb3BlcmF0aW9ucyBhcmUgZmFzdGVyLlxuICovXG5cbnZhciBtYXQyZCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0MmRcbiAqXG4gKiBAcmV0dXJucyB7bWF0MmR9IGEgbmV3IDJ4MyBtYXRyaXhcbiAqL1xubWF0MmQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDYpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MmQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDJkfSBhIG5ldyAyeDMgbWF0cml4XG4gKi9cbm1hdDJkLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSg2KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MmQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCBhIG1hdDJkIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYWEgPSBhWzBdLCBhYiA9IGFbMV0sIGFjID0gYVsyXSwgYWQgPSBhWzNdLFxuICAgICAgICBhdHggPSBhWzRdLCBhdHkgPSBhWzVdO1xuXG4gICAgdmFyIGRldCA9IGFhICogYWQgLSBhYiAqIGFjO1xuICAgIGlmKCFkZXQpe1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gYWQgKiBkZXQ7XG4gICAgb3V0WzFdID0gLWFiICogZGV0O1xuICAgIG91dFsyXSA9IC1hYyAqIGRldDtcbiAgICBvdXRbM10gPSBhYSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYWMgKiBhdHkgLSBhZCAqIGF0eCkgKiBkZXQ7XG4gICAgb3V0WzVdID0gKGFiICogYXR4IC0gYWEgKiBhdHkpICogZGV0O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cbm1hdDJkLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzFdICogYVsyXTtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MmQnc1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sIGE0ID0gYVs0XSwgYTUgPSBhWzVdLFxuICAgICAgICBiMCA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM10sIGI0ID0gYls0XSwgYjUgPSBiWzVdO1xuICAgIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICAgIG91dFsxXSA9IGExICogYjAgKyBhMyAqIGIxO1xuICAgIG91dFsyXSA9IGEwICogYjIgKyBhMiAqIGIzO1xuICAgIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICAgIG91dFs0XSA9IGEwICogYjQgKyBhMiAqIGI1ICsgYTQ7XG4gICAgb3V0WzVdID0gYTEgKiBiNCArIGEzICogYjUgKyBhNTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDJkLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDJkLm11bCA9IG1hdDJkLm11bHRpcGx5O1xuXG5cbi8qKlxuICogUm90YXRlcyBhIG1hdDJkIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLnJvdGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sIGE0ID0gYVs0XSwgYTUgPSBhWzVdLFxuICAgICAgICBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gICAgb3V0WzBdID0gYTAgKiAgYyArIGEyICogcztcbiAgICBvdXRbMV0gPSBhMSAqICBjICsgYTMgKiBzO1xuICAgIG91dFsyXSA9IGEwICogLXMgKyBhMiAqIGM7XG4gICAgb3V0WzNdID0gYTEgKiAtcyArIGEzICogYztcbiAgICBvdXRbNF0gPSBhNDtcbiAgICBvdXRbNV0gPSBhNTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDJkIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqKi9cbm1hdDJkLnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSwgYTQgPSBhWzRdLCBhNSA9IGFbNV0sXG4gICAgICAgIHYwID0gdlswXSwgdjEgPSB2WzFdO1xuICAgIG91dFswXSA9IGEwICogdjA7XG4gICAgb3V0WzFdID0gYTEgKiB2MDtcbiAgICBvdXRbMl0gPSBhMiAqIHYxO1xuICAgIG91dFszXSA9IGEzICogdjE7XG4gICAgb3V0WzRdID0gYTQ7XG4gICAgb3V0WzVdID0gYTU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNsYXRlcyB0aGUgbWF0MmQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byB0cmFuc2xhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqKi9cbm1hdDJkLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sIGE0ID0gYVs0XSwgYTUgPSBhWzVdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMDtcbiAgICBvdXRbMV0gPSBhMTtcbiAgICBvdXRbMl0gPSBhMjtcbiAgICBvdXRbM10gPSBhMztcbiAgICBvdXRbNF0gPSBhMCAqIHYwICsgYTIgKiB2MSArIGE0O1xuICAgIG91dFs1XSA9IGExICogdjAgKyBhMyAqIHYxICsgYTU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQyZC5zdHIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiAnbWF0MmQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIFxuICAgICAgICAgICAgICAgICAgICBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0MmQuZnJvYiA9IGZ1bmN0aW9uIChhKSB7IFxuICAgIHJldHVybihNYXRoLnNxcnQoTWF0aC5wb3coYVswXSwgMikgKyBNYXRoLnBvdyhhWzFdLCAyKSArIE1hdGgucG93KGFbMl0sIDIpICsgTWF0aC5wb3coYVszXSwgMikgKyBNYXRoLnBvdyhhWzRdLCAyKSArIE1hdGgucG93KGFbNV0sIDIpICsgMSkpXG59OyBcblxuaWYodHlwZW9mKGV4cG9ydHMpICE9PSAndW5kZWZpbmVkJykge1xuICAgIGV4cG9ydHMubWF0MmQgPSBtYXQyZDtcbn1cbjtcbi8qIENvcHlyaWdodCAoYykgMjAxMywgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gXG4gICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbldBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cbi8qKlxuICogQGNsYXNzIDN4MyBNYXRyaXhcbiAqIEBuYW1lIG1hdDNcbiAqL1xuXG52YXIgbWF0MyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0M1xuICpcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XG4gKi9cbm1hdDMuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDkpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMTtcbiAgICBvdXRbNV0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcGllcyB0aGUgdXBwZXItbGVmdCAzeDMgdmFsdWVzIGludG8gdGhlIGdpdmVuIG1hdDMuXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyAzeDMgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgICB0aGUgc291cmNlIDR4NCBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5mcm9tTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbNF07XG4gICAgb3V0WzRdID0gYVs1XTtcbiAgICBvdXRbNV0gPSBhWzZdO1xuICAgIG91dFs2XSA9IGFbOF07XG4gICAgb3V0WzddID0gYVs5XTtcbiAgICBvdXRbOF0gPSBhWzEwXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDN9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxuICovXG5tYXQzLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSg5KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MyB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQzIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAxO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgICBpZiAob3V0ID09PSBhKSB7XG4gICAgICAgIHZhciBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMTIgPSBhWzVdO1xuICAgICAgICBvdXRbMV0gPSBhWzNdO1xuICAgICAgICBvdXRbMl0gPSBhWzZdO1xuICAgICAgICBvdXRbM10gPSBhMDE7XG4gICAgICAgIG91dFs1XSA9IGFbN107XG4gICAgICAgIG91dFs2XSA9IGEwMjtcbiAgICAgICAgb3V0WzddID0gYTEyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFswXSA9IGFbMF07XG4gICAgICAgIG91dFsxXSA9IGFbM107XG4gICAgICAgIG91dFsyXSA9IGFbNl07XG4gICAgICAgIG91dFszXSA9IGFbMV07XG4gICAgICAgIG91dFs0XSA9IGFbNF07XG4gICAgICAgIG91dFs1XSA9IGFbN107XG4gICAgICAgIG91dFs2XSA9IGFbMl07XG4gICAgICAgIG91dFs3XSA9IGFbNV07XG4gICAgICAgIG91dFs4XSA9IGFbOF07XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdLFxuXG4gICAgICAgIGIwMSA9IGEyMiAqIGExMSAtIGExMiAqIGEyMSxcbiAgICAgICAgYjExID0gLWEyMiAqIGExMCArIGExMiAqIGEyMCxcbiAgICAgICAgYjIxID0gYTIxICogYTEwIC0gYTExICogYTIwLFxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgICAgICAgZGV0ID0gYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxO1xuXG4gICAgaWYgKCFkZXQpIHsgXG4gICAgICAgIHJldHVybiBudWxsOyBcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gYjAxICogZGV0O1xuICAgIG91dFsxXSA9ICgtYTIyICogYTAxICsgYTAyICogYTIxKSAqIGRldDtcbiAgICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldDtcbiAgICBvdXRbM10gPSBiMTEgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGEyMiAqIGEwMCAtIGEwMiAqIGEyMCkgKiBkZXQ7XG4gICAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0O1xuICAgIG91dFs2XSA9IGIyMSAqIGRldDtcbiAgICBvdXRbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBkZXQ7XG4gICAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXQ7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XTtcblxuICAgIG91dFswXSA9IChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpO1xuICAgIG91dFsxXSA9IChhMDIgKiBhMjEgLSBhMDEgKiBhMjIpO1xuICAgIG91dFsyXSA9IChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpO1xuICAgIG91dFszXSA9IChhMTIgKiBhMjAgLSBhMTAgKiBhMjIpO1xuICAgIG91dFs0XSA9IChhMDAgKiBhMjIgLSBhMDIgKiBhMjApO1xuICAgIG91dFs1XSA9IChhMDIgKiBhMTAgLSBhMDAgKiBhMTIpO1xuICAgIG91dFs2XSA9IChhMTAgKiBhMjEgLSBhMTEgKiBhMjApO1xuICAgIG91dFs3XSA9IChhMDEgKiBhMjAgLSBhMDAgKiBhMjEpO1xuICAgIG91dFs4XSA9IChhMDAgKiBhMTEgLSBhMDEgKiBhMTApO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQzLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XTtcblxuICAgIHJldHVybiBhMDAgKiAoYTIyICogYTExIC0gYTEyICogYTIxKSArIGEwMSAqICgtYTIyICogYTEwICsgYTEyICogYTIwKSArIGEwMiAqIChhMjEgKiBhMTAgLSBhMTEgKiBhMjApO1xufTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQzJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMubXVsdGlwbHkgPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF0sXG5cbiAgICAgICAgYjAwID0gYlswXSwgYjAxID0gYlsxXSwgYjAyID0gYlsyXSxcbiAgICAgICAgYjEwID0gYlszXSwgYjExID0gYls0XSwgYjEyID0gYls1XSxcbiAgICAgICAgYjIwID0gYls2XSwgYjIxID0gYls3XSwgYjIyID0gYls4XTtcblxuICAgIG91dFswXSA9IGIwMCAqIGEwMCArIGIwMSAqIGExMCArIGIwMiAqIGEyMDtcbiAgICBvdXRbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjE7XG4gICAgb3V0WzJdID0gYjAwICogYTAyICsgYjAxICogYTEyICsgYjAyICogYTIyO1xuXG4gICAgb3V0WzNdID0gYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwO1xuICAgIG91dFs0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMTtcbiAgICBvdXRbNV0gPSBiMTAgKiBhMDIgKyBiMTEgKiBhMTIgKyBiMTIgKiBhMjI7XG5cbiAgICBvdXRbNl0gPSBiMjAgKiBhMDAgKyBiMjEgKiBhMTAgKyBiMjIgKiBhMjA7XG4gICAgb3V0WzddID0gYjIwICogYTAxICsgYjIxICogYTExICsgYjIyICogYTIxO1xuICAgIG91dFs4XSA9IGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xubWF0My5tdWwgPSBtYXQzLm11bHRpcGx5O1xuXG4vKipcbiAqIFRyYW5zbGF0ZSBhIG1hdDMgYnkgdGhlIGdpdmVuIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMudHJhbnNsYXRlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF0sXG4gICAgICAgIHggPSB2WzBdLCB5ID0gdlsxXTtcblxuICAgIG91dFswXSA9IGEwMDtcbiAgICBvdXRbMV0gPSBhMDE7XG4gICAgb3V0WzJdID0gYTAyO1xuXG4gICAgb3V0WzNdID0gYTEwO1xuICAgIG91dFs0XSA9IGExMTtcbiAgICBvdXRbNV0gPSBhMTI7XG5cbiAgICBvdXRbNl0gPSB4ICogYTAwICsgeSAqIGExMCArIGEyMDtcbiAgICBvdXRbN10gPSB4ICogYTAxICsgeSAqIGExMSArIGEyMTtcbiAgICBvdXRbOF0gPSB4ICogYTAyICsgeSAqIGExMiArIGEyMjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MyBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLnJvdGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdLFxuXG4gICAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcblxuICAgIG91dFswXSA9IGMgKiBhMDAgKyBzICogYTEwO1xuICAgIG91dFsxXSA9IGMgKiBhMDEgKyBzICogYTExO1xuICAgIG91dFsyXSA9IGMgKiBhMDIgKyBzICogYTEyO1xuXG4gICAgb3V0WzNdID0gYyAqIGExMCAtIHMgKiBhMDA7XG4gICAgb3V0WzRdID0gYyAqIGExMSAtIHMgKiBhMDE7XG4gICAgb3V0WzVdID0gYyAqIGExMiAtIHMgKiBhMDI7XG5cbiAgICBvdXRbNl0gPSBhMjA7XG4gICAgb3V0WzddID0gYTIxO1xuICAgIG91dFs4XSA9IGEyMjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDMgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICoqL1xubWF0My5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV07XG5cbiAgICBvdXRbMF0gPSB4ICogYVswXTtcbiAgICBvdXRbMV0gPSB4ICogYVsxXTtcbiAgICBvdXRbMl0gPSB4ICogYVsyXTtcblxuICAgIG91dFszXSA9IHkgKiBhWzNdO1xuICAgIG91dFs0XSA9IHkgKiBhWzRdO1xuICAgIG91dFs1XSA9IHkgKiBhWzVdO1xuXG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgZnJvbSBhIG1hdDJkIGludG8gYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byBjb3B5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKiovXG5tYXQzLmZyb21NYXQyZCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSAwO1xuXG4gICAgb3V0WzNdID0gYVsyXTtcbiAgICBvdXRbNF0gPSBhWzNdO1xuICAgIG91dFs1XSA9IDA7XG5cbiAgICBvdXRbNl0gPSBhWzRdO1xuICAgIG91dFs3XSA9IGFbNV07XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4qIENhbGN1bGF0ZXMgYSAzeDMgbWF0cml4IGZyb20gdGhlIGdpdmVuIHF1YXRlcm5pb25cbipcbiogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuKiBAcGFyYW0ge3F1YXR9IHEgUXVhdGVybmlvbiB0byBjcmVhdGUgbWF0cml4IGZyb21cbipcbiogQHJldHVybnMge21hdDN9IG91dFxuKi9cbm1hdDMuZnJvbVF1YXQgPSBmdW5jdGlvbiAob3V0LCBxKSB7XG4gICAgdmFyIHggPSBxWzBdLCB5ID0gcVsxXSwgeiA9IHFbMl0sIHcgPSBxWzNdLFxuICAgICAgICB4MiA9IHggKyB4LFxuICAgICAgICB5MiA9IHkgKyB5LFxuICAgICAgICB6MiA9IHogKyB6LFxuXG4gICAgICAgIHh4ID0geCAqIHgyLFxuICAgICAgICB5eCA9IHkgKiB4MixcbiAgICAgICAgeXkgPSB5ICogeTIsXG4gICAgICAgIHp4ID0geiAqIHgyLFxuICAgICAgICB6eSA9IHogKiB5MixcbiAgICAgICAgenogPSB6ICogejIsXG4gICAgICAgIHd4ID0gdyAqIHgyLFxuICAgICAgICB3eSA9IHcgKiB5MixcbiAgICAgICAgd3ogPSB3ICogejI7XG5cbiAgICBvdXRbMF0gPSAxIC0geXkgLSB6ejtcbiAgICBvdXRbM10gPSB5eCAtIHd6O1xuICAgIG91dFs2XSA9IHp4ICsgd3k7XG5cbiAgICBvdXRbMV0gPSB5eCArIHd6O1xuICAgIG91dFs0XSA9IDEgLSB4eCAtIHp6O1xuICAgIG91dFs3XSA9IHp5IC0gd3g7XG5cbiAgICBvdXRbMl0gPSB6eCAtIHd5O1xuICAgIG91dFs1XSA9IHp5ICsgd3g7XG4gICAgb3V0WzhdID0gMSAtIHh4IC0geXk7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4qIENhbGN1bGF0ZXMgYSAzeDMgbm9ybWFsIG1hdHJpeCAodHJhbnNwb3NlIGludmVyc2UpIGZyb20gdGhlIDR4NCBtYXRyaXhcbipcbiogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuKiBAcGFyYW0ge21hdDR9IGEgTWF0NCB0byBkZXJpdmUgdGhlIG5vcm1hbCBtYXRyaXggZnJvbVxuKlxuKiBAcmV0dXJucyB7bWF0M30gb3V0XG4qL1xubWF0My5ub3JtYWxGcm9tTWF0NCA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XSxcblxuICAgICAgICBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsXG4gICAgICAgIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMCxcbiAgICAgICAgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwLFxuICAgICAgICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsXG4gICAgICAgIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMSxcbiAgICAgICAgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyLFxuICAgICAgICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsXG4gICAgICAgIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMCxcbiAgICAgICAgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwLFxuICAgICAgICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsXG4gICAgICAgIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMSxcbiAgICAgICAgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyLFxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgICAgICAgZGV0ID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xuXG4gICAgaWYgKCFkZXQpIHsgXG4gICAgICAgIHJldHVybiBudWxsOyBcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzFdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzJdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG5cbiAgICBvdXRbM10gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcblxuICAgIG91dFs2XSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICAgIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICAgIG91dFs4XSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG1hdCBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQzLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQzKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBcbiAgICAgICAgICAgICAgICAgICAgYVszXSArICcsICcgKyBhWzRdICsgJywgJyArIGFbNV0gKyAnLCAnICsgXG4gICAgICAgICAgICAgICAgICAgIGFbNl0gKyAnLCAnICsgYVs3XSArICcsICcgKyBhWzhdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0My5mcm9iID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4oTWF0aC5zcXJ0KE1hdGgucG93KGFbMF0sIDIpICsgTWF0aC5wb3coYVsxXSwgMikgKyBNYXRoLnBvdyhhWzJdLCAyKSArIE1hdGgucG93KGFbM10sIDIpICsgTWF0aC5wb3coYVs0XSwgMikgKyBNYXRoLnBvdyhhWzVdLCAyKSArIE1hdGgucG93KGFbNl0sIDIpICsgTWF0aC5wb3coYVs3XSwgMikgKyBNYXRoLnBvdyhhWzhdLCAyKSkpXG59O1xuXG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLm1hdDMgPSBtYXQzO1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBcbiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG5BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBcbkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXG5BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbkxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxuQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG5TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gKi9cblxuLyoqXG4gKiBAY2xhc3MgNHg0IE1hdHJpeFxuICogQG5hbWUgbWF0NFxuICovXG5cbnZhciBtYXQ0ID0ge307XG5cbi8qKlxuICo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment