Mercurial > hg > digilib
changeset 1287:f4fb3482f116
authentication for annotator plugin works now.
author | robcast |
---|---|
date | Fri, 14 Mar 2014 16:47:58 +0100 |
parents | 98265aa69929 |
children | e2a95f3f1b9f |
files | README.md webapp/src/main/webapp/jquery/annotator-dl.js webapp/src/main/webapp/jquery/annotator-dl.min.js webapp/src/main/webapp/jquery/digilib-ann.html webapp/src/main/webapp/jquery/jquery.digilib.annotator.js |
diffstat | 5 files changed, 65 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- a/README.md Thu Mar 13 16:52:25 2014 +0100 +++ b/README.md Fri Mar 14 16:47:58 2014 +0100 @@ -1,4 +1,4 @@ -digilib - the Digital Image Library +digilib - The Digital Image Library =================================== A versatile image viewing environment for the internet.
--- a/webapp/src/main/webapp/jquery/annotator-dl.js Thu Mar 13 16:52:25 2014 +0100 +++ b/webapp/src/main/webapp/jquery/annotator-dl.js Fri Mar 14 16:47:58 2014 +0100 @@ -1,12 +1,12 @@ /* -** Annotator v2.0.0-dev-5b27640 +** Annotator v2.0.0-dev-e25ce72 ** https://github.com/okfn/annotator/ ** ** Copyright 2014, the Annotator project contributors. ** Dual licensed under the MIT and GPLv3 licenses. ** https://github.com/okfn/annotator/blob/master/LICENSE ** -** Built at: 2014-03-13 15:20:20Z +** Built at: 2014-03-14 15:39:01Z */ !function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Annotator=e()}}(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);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.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(_dereq_,module,exports){ /** @@ -1675,12 +1675,15 @@ function Auth(element, options) { Auth.__super__.constructor.apply(this, arguments); this.waitingForToken = []; + } + + Auth.prototype.pluginInit = function() { if (this.options.token) { - this.setToken(this.options.token); + return this.setToken(this.options.token); } else { - this.requestToken(); + return this.requestToken(); } - } + }; Auth.prototype.requestToken = function() { this.requestInProgress = true; @@ -1774,11 +1777,10 @@ }; Auth.prototype.updateHeaders = function() { - var current; - current = this.element.data('annotator:headers'); - return this.element.data('annotator:headers', $.extend(current, { - 'x-annotator-auth-token': this.token - })); + var _ref; + if (((_ref = this.annotator.registry.store) != null ? _ref.setHeader : void 0) != null) { + return this.annotator.registry.store.setHeader('x-annotator-auth-token', this.token); + } }; Auth.prototype.withToken = function(callback) { @@ -2352,6 +2354,7 @@ annotationData: {}, emulateHTTP: false, emulateJSON: false, + headers: {}, prefix: '/store', urls: { create: '/annotations', @@ -2393,6 +2396,10 @@ return dfd.promise(); }; + Store.prototype.setHeader = function(key, value) { + return this.options.headers[key] = value; + }; + Store.prototype._apiRequest = function(action, obj) { var id, options, request, url; id = obj && obj.id; @@ -2410,7 +2417,8 @@ opts = { type: method, dataType: "json", - error: this._onError + error: this._onError, + headers: this.options.headers }; if (this.options.emulateHTTP && (method === 'PUT' || method === 'DELETE')) { opts.headers = $.extend(opts.headers, { @@ -3728,4 +3736,4 @@ ("haW+cw") }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGtnL2Fubm90YXRvci1kaWdpbGliLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2JhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lL2JhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2JhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2JhY2tib25lLWV4dGVuZC1zdGFuZGFsb25lL2JhY2tib25lLWV4dGVuZC1zdGFuZGFsb25lLmpzIiwiYW5ub3RhdGlvbnMuY29mZmVlIiwiYW5ub3RhdG9yLmNvZmZlZSIsImNsYXNzLmNvZmZlZSIsImVkaXRvci5jb2ZmZWUiLCJub3RpZmljYXRpb24uY29mZmVlIiwicGx1Z2luL2F1dGhsb2dpbi5jb2ZmZWUiLCJwbHVnaW4vZmlsdGVyLmNvZmZlZSIsInBsdWdpbi9tYXJrZG93bi5jb2ZmZWUiLCJwbHVnaW4vcGVybWlzc2lvbnMuY29mZmVlIiwicGx1Z2luL3N0b3JlLmNvZmZlZSIsInBsdWdpbi90YWdzLmNvZmZlZSIsInBsdWdpbi91bnN1cHBvcnRlZC5jb2ZmZWUiLCJyYW5nZS5jb2ZmZWUiLCJyZWdpc3RyeS5jb2ZmZWUiLCJzdG9yYWdlLmNvZmZlZSIsInV0aWwuY29mZmVlIiwidmlld2VyLmNvZmZlZSIsIndpZGdldC5jb2ZmZWUiLCJ4cGF0aC5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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S0FBWixDQUFQO0FBQ0EsUUFBRyxTQUFRLElBQVg7QUFDRSxlQUFTLENBQVQ7QUFDQSxVQUFHLFVBQVMsS0FBWjtBQUNFLGVBQU8sS0FBUCxDQURGO09BRkY7S0FGRjtBQUFBLEdBSkE7QUFVQSxRQUFVLFVBQU0sc0NBQU4sQ0FBVixDQVhVO0FBQUEsQ0E5Q1o7O0FBQUEsV0E0REEsR0FBYyxTQUFDLElBQUQ7QUFDVjtBQUFBLGFBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFkLEVBQVg7QUFDQSxVQUFPLFFBQVA7QUFBQSxTQUNPLE9BRFA7QUFDb0IsYUFBTyxRQUFQLENBRHBCO0FBQUEsU0FFTyxVQUZQO0FBRXVCLGFBQU8sV0FBUCxDQUZ2QjtBQUFBLFNBR08sZ0JBSFA7QUFHNkIsYUFBTyxpQkFBUCxDQUg3QjtBQUFBO0FBSU8sYUFBTyxRQUFQLENBSlA7QUFBQSxHQUZVO0FBQUEsQ0E1RGQ7O0FBQUEsZUFxRUEsR0FBa0IsU0FBQyxJQUFEO0FBQ2hCO0FBQUEsUUFBTSxDQUFOO0FBQUEsRUFDQSxNQUFNLElBRE47QUFFQSxTQUFNLEdBQU47QUFDRSxRQUFHLEdBQUcsQ0FBQyxRQUFKLEtBQWdCLElBQUksQ0FBQyxRQUF4QjtBQUNFLFlBREY7S0FBQTtBQUFBLElBRUEsTUFBTSxHQUFHLENBQUMsZUFGVixDQURGO0VBQUEsQ0FGQTtTQU1BLElBUGdCO0FBQUEsQ0FyRWxCOztBQUFBLE1BK0VNLENBQUMsT0FBUCxHQUNFO0FBQUEscUJBQW1CLGlCQUFuQjtBQUFBLEVBQ0EsaUJBQWlCLGVBRGpCO0FBQUEsRUFFQSxXQUFXLFNBRlg7Q0FoRkYiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIil9dmFyIGY9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGYuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sZixmLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qKlxuICogU3RhbmRhbG9uZSBleHRyYWN0aW9uIG9mIEJhY2tib25lLkV2ZW50cywgbm8gZXh0ZXJuYWwgZGVwZW5kZW5jeSByZXF1aXJlZC5cbiAqIERlZ3JhZGVzIG5pY2VseSB3aGVuIEJhY2tvbmUvdW5kZXJzY29yZSBhcmUgYWxyZWFkeSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnRcbiAqIGdsb2JhbCBjb250ZXh0LlxuICpcbiAqIE5vdGUgdGhhdCBkb2NzIHN1Z2dlc3QgdG8gdXNlIHVuZGVyc2NvcmUncyBgXy5leHRlbmQoKWAgbWV0aG9kIHRvIGFkZCBFdmVudHNcbiAqIHN1cHBvcnQgdG8gc29tZSBnaXZlbiBvYmplY3QuIEEgYG1peGluKClgIG1ldGhvZCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgRXZlbnRzXG4gKiBwcm90b3R5cGUgdG8gYXZvaWQgdXNpbmcgdW5kZXJzY29yZSBmb3IgdGhhdCBzb2xlIHB1cnBvc2U6XG4gKlxuICogICAgIHZhciBteUV2ZW50RW1pdHRlciA9IEJhY2tib25lRXZlbnRzLm1peGluKHt9KTtcbiAqXG4gKiBPciBmb3IgYSBmdW5jdGlvbiBjb25zdHJ1Y3RvcjpcbiAqXG4gKiAgICAgZnVuY3Rpb24gTXlDb25zdHJ1Y3Rvcigpe31cbiAqICAgICBNeUNvbnN0cnVjdG9yLnByb3RvdHlwZS5mb28gPSBmdW5jdGlvbigpe31cbiAqICAgICBCYWNrYm9uZUV2ZW50cy5taXhpbihNeUNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG4gKlxuICogKGMpIDIwMDktMjAxMyBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgSW5jLlxuICogKGMpIDIwMTMgTmljb2xhcyBQZXJyaWF1bHRcbiAqL1xuLyogZ2xvYmFsIGV4cG9ydHM6dHJ1ZSwgZGVmaW5lLCBtb2R1bGUgKi9cbihmdW5jdGlvbigpIHtcbiAgdmFyIHJvb3QgPSB0aGlzLFxuICAgICAgYnJlYWtlciA9IHt9LFxuICAgICAgbmF0aXZlRm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLFxuICAgICAgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuICAgICAgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsXG4gICAgICBpZENvdW50ZXIgPSAwO1xuXG4gIC8vIFJldHVybnMgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG1hdGNoaW5nIHRoZSBtaW5pbWFsIEFQSSBzdWJzZXQgcmVxdWlyZWRcbiAgLy8gYnkgQmFja2JvbmUuRXZlbnRzXG4gIGZ1bmN0aW9uIG1pbmlzY29yZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5czogT2JqZWN0LmtleXMsXG5cbiAgICAgIHVuaXF1ZUlkOiBmdW5jdGlvbihwcmVmaXgpIHtcbiAgICAgICAgdmFyIGlkID0gKytpZENvdW50ZXIgKyAnJztcbiAgICAgICAgcmV0dXJuIHByZWZpeCA/IHByZWZpeCArIGlkIDogaWQ7XG4gICAgICB9LFxuXG4gICAgICBoYXM6IGZ1bmN0aW9uKG9iaiwga2V5KSB7XG4gICAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbiAgICAgIH0sXG5cbiAgICAgIGVhY2g6IGZ1bmN0aW9uKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmIChuYXRpdmVGb3JFYWNoICYmIG9iai5mb3JFYWNoID09PSBuYXRpdmVGb3JFYWNoKSB7XG4gICAgICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbaV0sIGksIG9iaikgPT09IGJyZWFrZXIpIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopID09PSBicmVha2VyKSByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBvbmNlOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgICAgIHZhciByYW4gPSBmYWxzZSwgbWVtbztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmIChyYW4pIHJldHVybiBtZW1vO1xuICAgICAgICAgIHJhbiA9IHRydWU7XG4gICAgICAgICAgbWVtbyA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICBmdW5jID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIF8gPSBtaW5pc2NvcmUoKSwgRXZlbnRzO1xuXG4gIC8vIEJhY2tib25lLkV2ZW50c1xuICAvLyAtLS0tLS0tLS0tLS0tLS1cblxuICAvLyBBIG1vZHVsZSB0aGF0IGNhbiBiZSBtaXhlZCBpbiB0byAqYW55IG9iamVjdCogaW4gb3JkZXIgdG8gcHJvdmlkZSBpdCB3aXRoXG4gIC8vIGN1c3RvbSBldmVudHMuIFlvdSBtYXkgYmluZCB3aXRoIGBvbmAgb3IgcmVtb3ZlIHdpdGggYG9mZmAgY2FsbGJhY2tcbiAgLy8gZnVuY3Rpb25zIHRvIGFuIGV2ZW50OyBgdHJpZ2dlcmAtaW5nIGFuIGV2ZW50IGZpcmVzIGFsbCBjYWxsYmFja3MgaW5cbiAgLy8gc3VjY2Vzc2lvbi5cbiAgLy9cbiAgLy8gICAgIHZhciBvYmplY3QgPSB7fTtcbiAgLy8gICAgIF8uZXh0ZW5kKG9iamVjdCwgQmFja2JvbmUuRXZlbnRzKTtcbiAgLy8gICAgIG9iamVjdC5vbignZXhwYW5kJywgZnVuY3Rpb24oKXsgYWxlcnQoJ2V4cGFuZGVkJyk7IH0pO1xuICAvLyAgICAgb2JqZWN0LnRyaWdnZXIoJ2V4cGFuZCcpO1xuICAvL1xuICBFdmVudHMgPSB7XG5cbiAgICAvLyBCaW5kIGFuIGV2ZW50IHRvIGEgYGNhbGxiYWNrYCBmdW5jdGlvbi4gUGFzc2luZyBgXCJhbGxcImAgd2lsbCBiaW5kXG4gICAgLy8gdGhlIGNhbGxiYWNrIHRvIGFsbCBldmVudHMgZmlyZWQuXG4gICAgb246IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICBpZiAoIWV2ZW50c0FwaSh0aGlzLCAnb24nLCBuYW1lLCBbY2FsbGJhY2ssIGNvbnRleHRdKSB8fCAhY2FsbGJhY2spIHJldHVybiB0aGlzO1xuICAgICAgdGhpcy5fZXZlbnRzIHx8ICh0aGlzLl9ldmVudHMgPSB7fSk7XG4gICAgICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzW25hbWVdIHx8ICh0aGlzLl9ldmVudHNbbmFtZV0gPSBbXSk7XG4gICAgICBldmVudHMucHVzaCh7Y2FsbGJhY2s6IGNhbGxiYWNrLCBjb250ZXh0OiBjb250ZXh0LCBjdHg6IGNvbnRleHQgfHwgdGhpc30pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIEJpbmQgYW4gZXZlbnQgdG8gb25seSBiZSB0cmlnZ2VyZWQgYSBzaW5nbGUgdGltZS4gQWZ0ZXIgdGhlIGZpcnN0IHRpbWVcbiAgICAvLyB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCwgaXQgd2lsbCBiZSByZW1vdmVkLlxuICAgIG9uY2U6IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICBpZiAoIWV2ZW50c0FwaSh0aGlzLCAnb25jZScsIG5hbWUsIFtjYWxsYmFjaywgY29udGV4dF0pIHx8ICFjYWxsYmFjaykgcmV0dXJuIHRoaXM7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgb25jZSA9IF8ub25jZShmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vZmYobmFtZSwgb25jZSk7XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9KTtcbiAgICAgIG9uY2UuX2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICByZXR1cm4gdGhpcy5vbihuYW1lLCBvbmNlLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIG9uZSBvciBtYW55IGNhbGxiYWNrcy4gSWYgYGNvbnRleHRgIGlzIG51bGwsIHJlbW92ZXMgYWxsXG4gICAgLy8gY2FsbGJhY2tzIHdpdGggdGhhdCBmdW5jdGlvbi4gSWYgYGNhbGxiYWNrYCBpcyBudWxsLCByZW1vdmVzIGFsbFxuICAgIC8vIGNhbGxiYWNrcyBmb3IgdGhlIGV2ZW50LiBJZiBgbmFtZWAgaXMgbnVsbCwgcmVtb3ZlcyBhbGwgYm91bmRcbiAgICAvLyBjYWxsYmFja3MgZm9yIGFsbCBldmVudHMuXG4gICAgb2ZmOiBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgdmFyIHJldGFpbiwgZXYsIGV2ZW50cywgbmFtZXMsIGksIGwsIGosIGs7XG4gICAgICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhZXZlbnRzQXBpKHRoaXMsICdvZmYnLCBuYW1lLCBbY2FsbGJhY2ssIGNvbnRleHRdKSkgcmV0dXJuIHRoaXM7XG4gICAgICBpZiAoIW5hbWUgJiYgIWNhbGxiYWNrICYmICFjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbmFtZXMgPSBuYW1lID8gW25hbWVdIDogXy5rZXlzKHRoaXMuX2V2ZW50cyk7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gbmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgaWYgKGV2ZW50cyA9IHRoaXMuX2V2ZW50c1tuYW1lXSkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IHJldGFpbiA9IFtdO1xuICAgICAgICAgIGlmIChjYWxsYmFjayB8fCBjb250ZXh0KSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwLCBrID0gZXZlbnRzLmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgICBldiA9IGV2ZW50c1tqXTtcbiAgICAgICAgICAgICAgaWYgKChjYWxsYmFjayAmJiBjYWxsYmFjayAhPT0gZXYuY2FsbGJhY2sgJiYgY2FsbGJhY2sgIT09IGV2LmNhbGxiYWNrLl9jYWxsYmFjaykgfHxcbiAgICAgICAgICAgICAgICAgIChjb250ZXh0ICYmIGNvbnRleHQgIT09IGV2LmNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0YWluLnB1c2goZXYpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcmV0YWluLmxlbmd0aCkgZGVsZXRlIHRoaXMuX2V2ZW50c1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBvbmUgb3IgbWFueSBldmVudHMsIGZpcmluZyBhbGwgYm91bmQgY2FsbGJhY2tzLiBDYWxsYmFja3MgYXJlXG4gICAgLy8gcGFzc2VkIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBgdHJpZ2dlcmAgaXMsIGFwYXJ0IGZyb20gdGhlIGV2ZW50IG5hbWVcbiAgICAvLyAodW5sZXNzIHlvdSdyZSBsaXN0ZW5pbmcgb24gYFwiYWxsXCJgLCB3aGljaCB3aWxsIGNhdXNlIHlvdXIgY2FsbGJhY2sgdG9cbiAgICAvLyByZWNlaXZlIHRoZSB0cnVlIG5hbWUgb2YgdGhlIGV2ZW50IGFzIHRoZSBmaXJzdCBhcmd1bWVudCkuXG4gICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSkge1xuICAgICAgaWYgKCF0aGlzLl9ldmVudHMpIHJldHVybiB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICBpZiAoIWV2ZW50c0FwaSh0aGlzLCAndHJpZ2dlcicsIG5hbWUsIGFyZ3MpKSByZXR1cm4gdGhpcztcbiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHNbbmFtZV07XG4gICAgICB2YXIgYWxsRXZlbnRzID0gdGhpcy5fZXZlbnRzLmFsbDtcbiAgICAgIGlmIChldmVudHMpIHRyaWdnZXJFdmVudHMoZXZlbnRzLCBhcmdzKTtcbiAgICAgIGlmIChhbGxFdmVudHMpIHRyaWdnZXJFdmVudHMoYWxsRXZlbnRzLCBhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIFRlbGwgdGhpcyBvYmplY3QgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gZWl0aGVyIHNwZWNpZmljIGV2ZW50cyAuLi4gb3JcbiAgICAvLyB0byBldmVyeSBvYmplY3QgaXQncyBjdXJyZW50bHkgbGlzdGVuaW5nIHRvLlxuICAgIHN0b3BMaXN0ZW5pbmc6IGZ1bmN0aW9uKG9iaiwgbmFtZSwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG4gICAgICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIHRoaXM7XG4gICAgICB2YXIgZGVsZXRlTGlzdGVuZXIgPSAhbmFtZSAmJiAhY2FsbGJhY2s7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSBjYWxsYmFjayA9IHRoaXM7XG4gICAgICBpZiAob2JqKSAobGlzdGVuZXJzID0ge30pW29iai5fbGlzdGVuZXJJZF0gPSBvYmo7XG4gICAgICBmb3IgKHZhciBpZCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgbGlzdGVuZXJzW2lkXS5vZmYobmFtZSwgY2FsbGJhY2ssIHRoaXMpO1xuICAgICAgICBpZiAoZGVsZXRlTGlzdGVuZXIpIGRlbGV0ZSB0aGlzLl9saXN0ZW5lcnNbaWRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gIH07XG5cbiAgLy8gUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gc3BsaXQgZXZlbnQgc3RyaW5ncy5cbiAgdmFyIGV2ZW50U3BsaXR0ZXIgPSAvXFxzKy87XG5cbiAgLy8gSW1wbGVtZW50IGZhbmN5IGZlYXR1cmVzIG9mIHRoZSBFdmVudHMgQVBJIHN1Y2ggYXMgbXVsdGlwbGUgZXZlbnRcbiAgLy8gbmFtZXMgYFwiY2hhbmdlIGJsdXJcImAgYW5kIGpRdWVyeS1zdHlsZSBldmVudCBtYXBzIGB7Y2hhbmdlOiBhY3Rpb259YFxuICAvLyBpbiB0ZXJtcyBvZiB0aGUgZXhpc3RpbmcgQVBJLlxuICB2YXIgZXZlbnRzQXBpID0gZnVuY3Rpb24ob2JqLCBhY3Rpb24sIG5hbWUsIHJlc3QpIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gSGFuZGxlIGV2ZW50IG1hcHMuXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yICh2YXIga2V5IGluIG5hbWUpIHtcbiAgICAgICAgb2JqW2FjdGlvbl0uYXBwbHkob2JqLCBba2V5LCBuYW1lW2tleV1dLmNvbmNhdChyZXN0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNwYWNlIHNlcGFyYXRlZCBldmVudCBuYW1lcy5cbiAgICBpZiAoZXZlbnRTcGxpdHRlci50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgbmFtZXMgPSBuYW1lLnNwbGl0KGV2ZW50U3BsaXR0ZXIpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBuYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgb2JqW2FjdGlvbl0uYXBwbHkob2JqLCBbbmFtZXNbaV1dLmNvbmNhdChyZXN0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLy8gQSBkaWZmaWN1bHQtdG8tYmVsaWV2ZSwgYnV0IG9wdGltaXplZCBpbnRlcm5hbCBkaXNwYXRjaCBmdW5jdGlvbiBmb3JcbiAgLy8gdHJpZ2dlcmluZyBldmVudHMuIFRyaWVzIHRvIGtlZXAgdGhlIHVzdWFsIGNhc2VzIHNwZWVkeSAobW9zdCBpbnRlcm5hbFxuICAvLyBCYWNrYm9uZSBldmVudHMgaGF2ZSAzIGFyZ3VtZW50cykuXG4gIHZhciB0cmlnZ2VyRXZlbnRzID0gZnVuY3Rpb24oZXZlbnRzLCBhcmdzKSB7XG4gICAgdmFyIGV2LCBpID0gLTEsIGwgPSBldmVudHMubGVuZ3RoLCBhMSA9IGFyZ3NbMF0sIGEyID0gYXJnc1sxXSwgYTMgPSBhcmdzWzJdO1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogd2hpbGUgKCsraSA8IGwpIChldiA9IGV2ZW50c1tpXSkuY2FsbGJhY2suY2FsbChldi5jdHgpOyByZXR1cm47XG4gICAgICBjYXNlIDE6IHdoaWxlICgrK2kgPCBsKSAoZXYgPSBldmVudHNbaV0pLmNhbGxiYWNrLmNhbGwoZXYuY3R4LCBhMSk7IHJldHVybjtcbiAgICAgIGNhc2UgMjogd2hpbGUgKCsraSA8IGwpIChldiA9IGV2ZW50c1tpXSkuY2FsbGJhY2suY2FsbChldi5jdHgsIGExLCBhMik7IHJldHVybjtcbiAgICAgIGNhc2UgMzogd2hpbGUgKCsraSA8IGwpIChldiA9IGV2ZW50c1tpXSkuY2FsbGJhY2suY2FsbChldi5jdHgsIGExLCBhMiwgYTMpOyByZXR1cm47XG4gICAgICBkZWZhdWx0OiB3aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5hcHBseShldi5jdHgsIGFyZ3MpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgbGlzdGVuTWV0aG9kcyA9IHtsaXN0ZW5UbzogJ29uJywgbGlzdGVuVG9PbmNlOiAnb25jZSd9O1xuXG4gIC8vIEludmVyc2lvbi1vZi1jb250cm9sIHZlcnNpb25zIG9mIGBvbmAgYW5kIGBvbmNlYC4gVGVsbCAqdGhpcyogb2JqZWN0IHRvXG4gIC8vIGxpc3RlbiB0byBhbiBldmVudCBpbiBhbm90aGVyIG9iamVjdCAuLi4ga2VlcGluZyB0cmFjayBvZiB3aGF0IGl0J3NcbiAgLy8gbGlzdGVuaW5nIHRvLlxuICBfLmVhY2gobGlzdGVuTWV0aG9kcywgZnVuY3Rpb24oaW1wbGVtZW50YXRpb24sIG1ldGhvZCkge1xuICAgIEV2ZW50c1ttZXRob2RdID0gZnVuY3Rpb24ob2JqLCBuYW1lLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycyB8fCAodGhpcy5fbGlzdGVuZXJzID0ge30pO1xuICAgICAgdmFyIGlkID0gb2JqLl9saXN0ZW5lcklkIHx8IChvYmouX2xpc3RlbmVySWQgPSBfLnVuaXF1ZUlkKCdsJykpO1xuICAgICAgbGlzdGVuZXJzW2lkXSA9IG9iajtcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIGNhbGxiYWNrID0gdGhpcztcbiAgICAgIG9ialtpbXBsZW1lbnRhdGlvbl0obmFtZSwgY2FsbGJhY2ssIHRoaXMpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gQWxpYXNlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gIEV2ZW50cy5iaW5kICAgPSBFdmVudHMub247XG4gIEV2ZW50cy51bmJpbmQgPSBFdmVudHMub2ZmO1xuXG4gIC8vIE1peGluIHV0aWxpdHlcbiAgRXZlbnRzLm1peGluID0gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICB2YXIgZXhwb3J0cyA9IFsnb24nLCAnb25jZScsICdvZmYnLCAndHJpZ2dlcicsICdzdG9wTGlzdGVuaW5nJywgJ2xpc3RlblRvJyxcbiAgICAgICAgICAgICAgICAgICAnbGlzdGVuVG9PbmNlJywgJ2JpbmQnLCAndW5iaW5kJ107XG4gICAgXy5lYWNoKGV4cG9ydHMsIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHByb3RvW25hbWVdID0gdGhpc1tuYW1lXTtcbiAgICB9LCB0aGlzKTtcbiAgICByZXR1cm4gcHJvdG87XG4gIH07XG5cbiAgLy8gRXhwb3J0IEV2ZW50cyBhcyBCYWNrYm9uZUV2ZW50cyBkZXBlbmRpbmcgb24gY3VycmVudCBjb250ZXh0XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gRXZlbnRzO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gRXZlbnRzO1xuICAgIH1cbiAgICBleHBvcnRzLkJhY2tib25lRXZlbnRzID0gRXZlbnRzO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuQmFja2JvbmVFdmVudHMgPSBFdmVudHM7XG4gIH1cbn0pKHRoaXMpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2JhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lJyk7XG4iLCIoZnVuY3Rpb24gKGRlZmluaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKCk7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKGRlZmluaXRpb24pO1xuICB9XG4gIGVsc2Uge1xuICAgIHdpbmRvdy5CYWNrYm9uZUV4dGVuZCA9IGRlZmluaXRpb24oKTtcbiAgfVxufSkoZnVuY3Rpb24gKCkge1xuICBcInVzZSBzdHJpY3RcIjtcbiAgXG4gIC8vIG1pbmktdW5kZXJzY29yZVxuICB2YXIgXyA9IHtcbiAgICBoYXM6IGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG4gICAgfSxcbiAgXG4gICAgZXh0ZW5kOiBmdW5jdGlvbihvYmopIHtcbiAgICAgIGZvciAodmFyIGk9MTsgaTxhcmd1bWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgfTtcblxuICAvLy8gRm9sbG93aW5nIGNvZGUgaXMgcGFzdGVkIGZyb20gQmFja2JvbmUuanMgLy8vXG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvcnJlY3RseSBzZXQgdXAgdGhlIHByb3RvdHlwZSBjaGFpbiwgZm9yIHN1YmNsYXNzZXMuXG4gIC8vIFNpbWlsYXIgdG8gYGdvb2cuaW5oZXJpdHNgLCBidXQgdXNlcyBhIGhhc2ggb2YgcHJvdG90eXBlIHByb3BlcnRpZXMgYW5kXG4gIC8vIGNsYXNzIHByb3BlcnRpZXMgdG8gYmUgZXh0ZW5kZWQuXG4gIHZhciBleHRlbmQgPSBmdW5jdGlvbihwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzO1xuICAgIHZhciBjaGlsZDtcblxuICAgIC8vIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgdGhlIG5ldyBzdWJjbGFzcyBpcyBlaXRoZXIgZGVmaW5lZCBieSB5b3VcbiAgICAvLyAodGhlIFwiY29uc3RydWN0b3JcIiBwcm9wZXJ0eSBpbiB5b3VyIGBleHRlbmRgIGRlZmluaXRpb24pLCBvciBkZWZhdWx0ZWRcbiAgICAvLyBieSB1cyB0byBzaW1wbHkgY2FsbCB0aGUgcGFyZW50J3MgY29uc3RydWN0b3IuXG4gICAgaWYgKHByb3RvUHJvcHMgJiYgXy5oYXMocHJvdG9Qcm9wcywgJ2NvbnN0cnVjdG9yJykpIHtcbiAgICAgIGNoaWxkID0gcHJvdG9Qcm9wcy5jb25zdHJ1Y3RvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGQgPSBmdW5jdGlvbigpeyByZXR1cm4gcGFyZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgfVxuXG4gICAgLy8gQWRkIHN0YXRpYyBwcm9wZXJ0aWVzIHRvIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgaWYgc3VwcGxpZWQuXG4gICAgXy5leHRlbmQoY2hpbGQsIHBhcmVudCwgc3RhdGljUHJvcHMpO1xuXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgY2hhaW4gdG8gaW5oZXJpdCBmcm9tIGBwYXJlbnRgLCB3aXRob3V0IGNhbGxpbmdcbiAgICAvLyBgcGFyZW50YCdzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICAgIHZhciBTdXJyb2dhdGUgPSBmdW5jdGlvbigpeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH07XG4gICAgU3Vycm9nYXRlLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgY2hpbGQucHJvdG90eXBlID0gbmV3IFN1cnJvZ2F0ZSgpO1xuXG4gICAgLy8gQWRkIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChpbnN0YW5jZSBwcm9wZXJ0aWVzKSB0byB0aGUgc3ViY2xhc3MsXG4gICAgLy8gaWYgc3VwcGxpZWQuXG4gICAgaWYgKHByb3RvUHJvcHMpIF8uZXh0ZW5kKGNoaWxkLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG5cbiAgICAvLyBTZXQgYSBjb252ZW5pZW5jZSBwcm9wZXJ0eSBpbiBjYXNlIHRoZSBwYXJlbnQncyBwcm90b3R5cGUgaXMgbmVlZGVkXG4gICAgLy8gbGF0ZXIuXG4gICAgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTtcblxuICAgIHJldHVybiBjaGlsZDtcbiAgfTtcblxuICAvLyBFeHBvc2UgdGhlIGV4dGVuZCBmdW5jdGlvblxuICByZXR1cm4gZXh0ZW5kO1xufSk7XG4iLCJTdG9yYWdlUHJvdmlkZXIgPSByZXF1aXJlKCcuL3N0b3JhZ2UnKVxuXG5cbiMgUHVibGljOiBQcm92aWRlcyBDUlVEIG1ldGhvZHMgZm9yIGFubm90YXRpb25zIHdoaWNoIGNhbGwgY29ycmVzcG9uZGluZyByZWdpc3RyeSBob29rcy5cbmNsYXNzIEFubm90YXRpb25Qcm92aWRlclxuXG4gIEBjb25maWd1cmU6IChyZWdpc3RyeSkgLT5cbiAgICByZWdpc3RyeVsnYW5ub3RhdGlvbnMnXSA/PSBuZXcgdGhpcyhyZWdpc3RyeSlcbiAgICByZWdpc3RyeS5pbmNsdWRlKFN0b3JhZ2VQcm92aWRlcilcblxuICBjb25zdHJ1Y3RvcjogKEByZWdpc3RyeSkgLT5cblxuICAjIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgYW5ub3RhdGlvbiBvYmplY3QuXG4gICNcbiAgIyBSdW5zIHRoZSAnYmVmb3JlQ3JlYXRlQW5ub3RhdGlvbicgaG9vayB0byBhbGxvdyB0aGUgbmV3IGFubm90YXRpb24gdG9cbiAgIyBiZSBpbml0aWFsaXplZCBvciBwcmV2ZW50ZWQuXG4gICNcbiAgIyBSdW5zIHRoZSAnY3JlYXRlQW5ub3RhdGlvbicgaG9vayB3aGVuIHRoZSBuZXcgYW5ub3RhdGlvbiBpcyBpbml0aWFsaXplZC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIC5jcmVhdGUoe30pXG4gICNcbiAgIyAgIHJlZ2lzdHJ5Lm9uICdiZWZvcmVBbm5vdGF0aW9uQ3JlYXRlZCcsIChhbm5vdGF0aW9uKSAtPlxuICAjICAgICBhbm5vdGF0aW9uLm15UHJvcGVydHkgPSAnVGhpcyBpcyBhIGN1c3RvbSBwcm9wZXJ0eSdcbiAgIyAgIHJlZ2lzdHJ5LmNyZWF0ZSh7fSkgIyBSZXNvbHZlcyB0byB7bXlQcm9wZXJ0eTogXCJUaGlzIGlzIGHigKZcIn1cbiAgI1xuICAjIFJldHVybnMgYSBQcm9taXNlIG9mIGFuIGFubm90YXRpb24gT2JqZWN0LlxuICBjcmVhdGU6IChvYmo9e30pIC0+XG4gICAgdGhpcy5fY3ljbGUob2JqLCAnY3JlYXRlJylcblxuICAjIFVwZGF0ZXMgYW4gYW5ub3RhdGlvbi5cbiAgI1xuICAjIFB1Ymxpc2hlcyB0aGUgJ2JlZm9yZUFubm90YXRpb25VcGRhdGVkJyBhbmQgJ2Fubm90YXRpb25VcGRhdGVkJyBldmVudHMuXG4gICMgTGlzdGVuZXJzIHdpc2hpbmcgdG8gbW9kaWZ5IGFuIHVwZGF0ZWQgYW5ub3RhdGlvbiBzaG91bGQgc3Vic2NyaWJlIHRvXG4gICMgJ2JlZm9yZUFubm90YXRpb25VcGRhdGVkJyB3aGlsZSBsaXN0ZW5lcnMgc3RvcmluZyBhbm5vdGF0aW9ucyBzaG91bGRcbiAgIyBzdWJzY3JpYmUgdG8gJ2Fubm90YXRpb25VcGRhdGVkJy5cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdCB0byB1cGRhdGUuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBhbm5vdGF0aW9uID0ge3RhZ3M6ICdhcHBsZXMgb3JhbmdlcyBwZWFycyd9XG4gICMgICByZWdpc3RyeS5vbiAnYmVmb3JlQW5ub3RhdGlvblVwZGF0ZWQnLCAoYW5ub3RhdGlvbikgLT5cbiAgIyAgICAgIyB2YWxpZGF0ZSBvciBtb2RpZnkgYSBwcm9wZXJ0eS5cbiAgIyAgICAgYW5ub3RhdGlvbi50YWdzID0gYW5ub3RhdGlvbi50YWdzLnNwbGl0KCcgJylcbiAgIyAgIHJlZ2lzdHJ5LnVwZGF0ZShhbm5vdGF0aW9uKVxuICAjICAgIyA9PiBSZXR1cm5zIFtcImFwcGxlc1wiLCBcIm9yYW5nZXNcIiwgXCJwZWFyc1wiXVxuICAjXG4gICMgUmV0dXJucyBhIFByb21pc2Ugb2YgYW4gYW5ub3RhdGlvbiBPYmplY3QuXG4gIHVwZGF0ZTogKG9iaikgLT5cbiAgICBpZiBub3Qgb2JqLmlkP1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFubm90YXRpb24gbXVzdCBoYXZlIGFuIGlkIGZvciB1cGRhdGUoKVwiKVxuICAgIHRoaXMuX2N5Y2xlKG9iaiwgJ3VwZGF0ZScpXG5cbiAgIyBQdWJsaWM6IERlbGV0ZXMgdGhlIGFubm90YXRpb24uXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBPYmplY3QgdG8gZGVsZXRlLlxuICAjXG4gICMgUmV0dXJucyBhIFByb21pc2Ugb2YgYW4gYW5ub3RhdGlvbiBPYmplY3QuXG4gIGRlbGV0ZTogKG9iaikgLT5cbiAgICBpZiBub3Qgb2JqLmlkP1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFubm90YXRpb24gbXVzdCBoYXZlIGFuIGlkIGZvciBkZWxldGUoKVwiKVxuICAgIHRoaXMuX2N5Y2xlKG9iaiwgJ2RlbGV0ZScpXG5cbiAgIyBQdWJsaWM6IFF1ZXJpZXMgdGhlIHN0b3JlXG4gICNcbiAgIyBxdWVyeSAtIEFuIE9iamVjdCBkZWZpbmluZyBhIHF1ZXJ5LiBUaGlzIG1heSBiZSBpbnRlcnByZXRlZCBkaWZmZXJlbnRseSBieVxuICAjICAgICAgICAgZGlmZmVyZW50IHN0b3Jlcy5cbiAgI1xuICAjIFJldHVybnMgYSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgc3RvcmUgcmV0dXJuIHZhbHVlLlxuICBxdWVyeTogKHF1ZXJ5KSAtPlxuICAgIHJldHVybiBAcmVnaXN0cnlbJ3N0b3JlJ10ucXVlcnkocXVlcnkpXG5cbiAgIyBQdWJsaWM6IFF1ZXJpZXMgdGhlIHN0b3JlXG4gICNcbiAgIyBxdWVyeSAtIEFuIE9iamVjdCBkZWZpbmluZyBhIHF1ZXJ5LiBUaGlzIG1heSBiZSBpbnRlcnByZXRlZCBkaWZmZXJlbnRseSBieVxuICAjICAgICAgICAgZGlmZmVyZW50IHN0b3Jlcy5cbiAgI1xuICAjIFJldHVybnMgYSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgYW5ub3RhdGlvbnMuXG4gIGxvYWQ6IChxdWVyeSkgLT5cbiAgICByZXR1cm4gdGhpcy5xdWVyeShxdWVyeSlcblxuICAjIFByaXZhdGU6IGN5Y2xlIGEgc3RvcmUgZXZlbnQsIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGFubm90YXRpb24gb2JqZWN0IGFuZFxuICAjIHVwZGF0aW5nIGl0IGFzIG5lY2Vzc2FyeS5cbiAgX2N5Y2xlOiAob2JqLCBzdG9yZUZ1bmMpIC0+XG4gICAgc2FmZUNvcHkgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb2JqKVxuICAgIGRlbGV0ZSBzYWZlQ29weS5fbG9jYWxcblxuICAgIEByZWdpc3RyeVsnc3RvcmUnXVtzdG9yZUZ1bmNdKHNhZmVDb3B5KVxuICAgICAgLnRoZW4gKHJldCkgPT5cbiAgICAgICAgIyBFbXB0eSBvYmplY3Qgd2l0aG91dCBjaGFuZ2luZyBpZGVudGl0eVxuICAgICAgICBmb3Igb3duIGssIHYgb2Ygb2JqXG4gICAgICAgICAgaWYgayAhPSAnX2xvY2FsJ1xuICAgICAgICAgICAgZGVsZXRlIG9ialtrXVxuXG4gICAgICAgICMgVXBkYXRlIHdpdGggc3RvcmUgcmV0dXJuIHZhbHVlXG4gICAgICAgICQuZXh0ZW5kKG9iaiwgcmV0KVxuXG4gICAgICAgIHJldHVybiBvYmogXG5cbm1vZHVsZS5leHBvcnRzID0gQW5ub3RhdGlvblByb3ZpZGVyXG4iLCJleHRlbmQgPSByZXF1aXJlICdiYWNrYm9uZS1leHRlbmQtc3RhbmRhbG9uZSdcblxuRGVsZWdhdG9yID0gcmVxdWlyZSAnLi9jbGFzcydcblJhbmdlID0gcmVxdWlyZSAnLi9yYW5nZSdcblV0aWwgPSByZXF1aXJlICcuL3V0aWwnXG5XaWRnZXQgPSByZXF1aXJlICcuL3dpZGdldCdcblZpZXdlciA9IHJlcXVpcmUgJy4vdmlld2VyJ1xuRWRpdG9yID0gcmVxdWlyZSAnLi9lZGl0b3InXG5Ob3RpZmljYXRpb24gPSByZXF1aXJlICcuL25vdGlmaWNhdGlvbidcblJlZ2lzdHJ5ID0gcmVxdWlyZSAnLi9yZWdpc3RyeSdcblxuQW5ub3RhdGlvblByb3ZpZGVyID0gcmVxdWlyZSAnLi9hbm5vdGF0aW9ucydcblxuX3QgPSBVdGlsLlRyYW5zbGF0aW9uU3RyaW5nXG5cblxuXG4jIFNlbGVjdGlvbiBhbmQgcmFuZ2UgY3JlYXRpb24gcmVmZXJlbmNlIGZvciB0aGUgZm9sbG93aW5nIGNvZGU6XG4jIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvZG9tL3JhbmdlX2ludHJvLmh0bWxcbiNcbiMgSSd2ZSByZW1vdmVkIGFueSBzdXBwb3J0IGZvciBJRSBUZXh0UmFuZ2UgKHNlZSBjb21taXQgZDcwODViZjIgZm9yIGNvZGUpXG4jIGZvciB0aGUgbW9tZW50LCBoYXZpbmcgbm8gbWVhbnMgb2YgdGVzdGluZyBpdC5cblxuIyBTdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBBbm5vdGF0b3Igb2JqZWN0LlxuX0Fubm90YXRvciA9IHRoaXMuQW5ub3RhdG9yXG5cbmhhbmRsZUVycm9yID0gLT5cbiAgY29uc29sZS5lcnJvci5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpXG5cbmNsYXNzIEFubm90YXRvciBleHRlbmRzIERlbGVnYXRvclxuICAjIEV2ZW50cyB0byBiZSBib3VuZCBvbiBBbm5vdGF0b3IjZWxlbWVudC5cbiAgZXZlbnRzOlxuICAgIFwiLmFubm90YXRvci1hZGRlciBidXR0b24gY2xpY2tcIjogICAgIFwib25BZGRlckNsaWNrXCJcbiAgICBcIi5hbm5vdGF0b3ItYWRkZXIgYnV0dG9uIG1vdXNlZG93blwiOiBcIm9uQWRkZXJNb3VzZWRvd25cIlxuICAgIFwiLmFubm90YXRvci1obCBtb3VzZW92ZXJcIjogICAgICAgICAgIFwib25IaWdobGlnaHRNb3VzZW92ZXJcIlxuICAgIFwiLmFubm90YXRvci1obCBtb3VzZW91dFwiOiAgICAgICAgICAgIFwic3RhcnRWaWV3ZXJIaWRlVGltZXJcIlxuXG4gIGh0bWw6XG4gICAgYWRkZXI6ICAgJzxkaXYgY2xhc3M9XCJhbm5vdGF0b3ItYWRkZXJcIj48YnV0dG9uIHR5cGU9XCJidXR0b25cIj4nICsgX3QoJ0Fubm90YXRlJykgKyAnPC9idXR0b24+PC9kaXY+J1xuICAgIHdyYXBwZXI6ICc8ZGl2IGNsYXNzPVwiYW5ub3RhdG9yLXdyYXBwZXJcIj48L2Rpdj4nXG5cbiAgb3B0aW9uczogIyBDb25maWd1cmF0aW9uIG9wdGlvbnNcblxuICAgIHN0b3JlOiBudWxsICMgU3RvcmUgcGx1Z2luIHRvIHVzZS4gSWYgbnVsbCwgQW5ub3RhdG9yIHdpbGwgdXNlIGEgZGVmYXVsdCBzdG9yZS5cblxuICAgIHJlYWRPbmx5OiBmYWxzZSAjIFN0YXJ0IEFubm90YXRvciBpbiByZWFkLW9ubHkgbW9kZS4gTm8gY29udHJvbHMgd2lsbCBiZSBzaG93bi5cblxuICAgIGxvYWRRdWVyeToge30gIyBJbml0aWFsIHF1ZXJ5IHRvIGxvYWQgQW5ub3RhdGlvbnNcblxuICBwbHVnaW5zOiB7fVxuXG4gIGVkaXRvcjogbnVsbFxuXG4gIHZpZXdlcjogbnVsbFxuXG4gIHNlbGVjdGVkUmFuZ2VzOiBudWxsXG5cbiAgbW91c2VJc0Rvd246IGZhbHNlXG5cbiAgaWdub3JlTW91c2V1cDogZmFsc2VcblxuICB2aWV3ZXJIaWRlVGltZXI6IG51bGxcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW5ub3RhdG9yLiBSZXF1aXJlcyBhIERPTSBFbGVtZW50IGluXG4gICMgd2hpY2ggdG8gd2F0Y2ggZm9yIGFubm90YXRpb25zIGFzIHdlbGwgYXMgYW55IG9wdGlvbnMuXG4gICNcbiAgIyBOT1RFOiBJZiB0aGUgQW5ub3RhdG9yIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgYnJvd3NlciBpdCB3aWxsIG5vdFxuICAjIHBlcmZvcm0gYW55IHNldHVwIGFuZCBzaW1wbHkgcmV0dXJuIGEgYmFzaWMgb2JqZWN0LiBUaGlzIGFsbG93cyBwbHVnaW5zXG4gICMgdG8gc3RpbGwgYmUgbG9hZGVkIGJ1dCB3aWxsIG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZC4gSXQgaXMgcmVjY29tZW5kZWRcbiAgIyB0byBjYWxsIEFubm90YXRvci5zdXBwb3J0ZWQoKSBiZWZvcmUgY3JlYXRpbmcgdGhlIGluc3RhbmNlIG9yIHVzaW5nIHRoZVxuICAjIFVuc3VwcG9ydGVkIHBsdWdpbiB3aGljaCB3aWxsIG5vdGlmeSB1c2VycyB0aGF0IHRoZSBBbm5vdGF0b3Igd2lsbCBub3Qgd29yay5cbiAgI1xuICAjIGVsZW1lbnQgLSBBIERPTSBFbGVtZW50IGluIHdoaWNoIHRvIGFubm90YXRlLlxuICAjIG9wdGlvbnMgLSBBbiBvcHRpb25zIE9iamVjdC4gTk9URTogVGhlcmUgYXJlIGN1cnJlbnRseSBubyB1c2VyIG9wdGlvbnMuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBhbm5vdGF0b3IgPSBuZXcgQW5ub3RhdG9yKGRvY3VtZW50LmJvZHkpXG4gICNcbiAgIyAgICMgRXhhbXBsZSBvZiBjaGVja2luZyBmb3Igc3VwcG9ydC5cbiAgIyAgIGlmIEFubm90YXRvci5zdXBwb3J0ZWQoKVxuICAjICAgICBhbm5vdGF0b3IgPSBuZXcgQW5ub3RhdG9yKGRvY3VtZW50LmJvZHkpXG4gICMgICBlbHNlXG4gICMgICAgICMgRmFsbGJhY2sgZm9yIHVuc3VwcG9ydGVkIGJyb3dzZXJzLlxuICAjXG4gICMgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQW5ub3RhdG9yLlxuICBjb25zdHJ1Y3RvcjogKGVsZW1lbnQsIG9wdGlvbnMpIC0+XG4gICAgc3VwZXJcbiAgICBAcGx1Z2lucyA9IHt9XG5cbiAgICBBbm5vdGF0b3IuX2luc3RhbmNlcy5wdXNoKHRoaXMpXG5cbiAgICAjIFJldHVybiBlYXJseSBpZiB0aGUgYW5ub3RhdG9yIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgcmV0dXJuIHRoaXMgdW5sZXNzIEFubm90YXRvci5zdXBwb3J0ZWQoKVxuXG4gICAgIyBDcmVhdGUgdGhlIHJlZ2lzdHJ5IGFuZCBzdGFydCB0aGUgYXBwbGljYXRpb25cbiAgICBSZWdpc3RyeS5jcmVhdGVBcHAodGhpcywgb3B0aW9ucylcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhIHN1YmNsYXNzIG9mIEFubm90YXRvci5cbiAgI1xuICAjIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tIEJhY2tib25lOiBodHRwOi8vYmFja2JvbmVqcy5vcmcvI01vZGVsLWV4dGVuZFxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgdmFyIEV4dGVuZGVkQW5ub3RhdG9yID0gQW5ub3RhdG9yLmV4dGVuZCh7XG4gICMgICAgIHNldHVwQW5ub3RhdGlvbjogZnVuY3Rpb24gKGFubm90YXRpb24pIHtcbiAgIyAgICAgICAvLyBJbnZva2UgdGhlIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uXG4gICMgICAgICAgdHJ5IHtcbiAgIyAgICAgICAgIEFubm90YXRvci5wcm90b3R5cGUuc2V0dXBBbm5vdGF0aW9uLmNhbGwodGhpcywgYW5ub3RhdGlvbik7XG4gICMgICAgICAgfSBjYXRjaCAoZSkge1xuICAjICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBbm5vdGF0b3IuUmFuZ2UuUmFuZ2VFcnJvcikge1xuICAjICAgICAgICAgICAvLyBUcnkgdG8gbG9jYXRlIHRoZSBBbm5vdGF0aW9uIHVzaW5nIHRoZSBxdW90ZVxuICAjICAgICAgICAgfSBlbHNlIHtcbiAgIyAgICAgICAgICAgdGhyb3cgZTtcbiAgIyAgICAgICAgIH1cbiAgIyAgICAgICB9XG4gICNcbiAgIyAgICAgICByZXR1cm4gYW5ub3RhdGlvbjtcbiAgIyAgIH0pO1xuICAjXG4gICMgICB2YXIgYW5ub3RhdG9yID0gbmV3IEV4dGVuZGVkQW5ub3RhdG9yKGRvY3VtZW50LmJvZHksIC8qIHtvcHRpb25zfSAqLyk7XG4gIEBleHRlbmQ6IGV4dGVuZFxuXG4gICMgV3JhcHMgdGhlIGNoaWxkcmVuIG9mIEBlbGVtZW50IGluIGEgQHdyYXBwZXIgZGl2LiBOT1RFOiBUaGlzIG1ldGhvZCB3aWxsIGFsc29cbiAgIyByZW1vdmUgYW55IHNjcmlwdCBlbGVtZW50cyBpbnNpZGUgQGVsZW1lbnQgdG8gcHJldmVudCB0aGVtIHJlLWV4ZWN1dGluZy5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nLlxuICBfc2V0dXBXcmFwcGVyOiAtPlxuICAgIEB3cmFwcGVyID0gJChAaHRtbC53cmFwcGVyKVxuXG4gICAgIyBXZSBuZWVkIHRvIHJlbW92ZSBhbGwgc2NyaXB0cyB3aXRoaW4gdGhlIGVsZW1lbnQgYmVmb3JlIHdyYXBwaW5nIHRoZVxuICAgICMgY29udGVudHMgd2l0aGluIGEgZGl2LiBPdGhlcndpc2Ugd2hlbiBzY3JpcHRzIGFyZSByZWFwcGVuZGVkIHRvIHRoZSBET01cbiAgICAjIHRoZXkgd2lsbCByZS1leGVjdXRlLiBUaGlzIGlzIGFuIGlzc3VlIGZvciBzY3JpcHRzIHRoYXQgY2FsbFxuICAgICMgZG9jdW1lbnQud3JpdGUoKSAtIHN1Y2ggYXMgYWRzIC0gYXMgdGhleSB3aWxsIGNsZWFyIHRoZSBwYWdlLlxuICAgIEBlbGVtZW50LmZpbmQoJ3NjcmlwdCcpLnJlbW92ZSgpXG4gICAgQGVsZW1lbnQud3JhcElubmVyKEB3cmFwcGVyKVxuICAgIEB3cmFwcGVyID0gQGVsZW1lbnQuZmluZCgnLmFubm90YXRvci13cmFwcGVyJylcblxuICAgIHRoaXNcblxuICAjIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQW5ub3RhdG9yLlZpZXdlciBhbmQgYXNzaWducyBpdCB0byB0aGUgQHZpZXdlclxuICAjIHByb3BlcnR5LCBhcHBlbmRzIGl0IHRvIHRoZSBAd3JhcHBlciBhbmQgc2V0cyB1cCBldmVudCBsaXN0ZW5lcnMuXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZy5cbiAgX3NldHVwVmlld2VyOiAtPlxuICAgIEB2aWV3ZXIgPSBuZXcgQW5ub3RhdG9yLlZpZXdlcihyZWFkT25seTogQG9wdGlvbnMucmVhZE9ubHkpXG4gICAgQHZpZXdlci5oaWRlKClcbiAgICAgIC5vbihcImVkaXRcIiwgdGhpcy5vbkVkaXRBbm5vdGF0aW9uKVxuICAgICAgLm9uKFwiZGVsZXRlXCIsIChhbm5vdGF0aW9uKSA9PlxuICAgICAgICBAdmlld2VyLmhpZGUoKVxuICAgICAgICB0aGlzLnB1Ymxpc2goJ2JlZm9yZUFubm90YXRpb25EZWxldGVkJywgW2Fubm90YXRpb25dKVxuICAgICAgICAjIERlbGV0ZSBoaWdobGlnaHQgZWxlbWVudHMuXG4gICAgICAgIHRoaXMuY2xlYW51cEFubm90YXRpb24oYW5ub3RhdGlvbilcbiAgICAgICAgIyBEZWxldGUgYW5ub3RhdGlvblxuICAgICAgICB0aGlzLmFubm90YXRpb25zLmRlbGV0ZShhbm5vdGF0aW9uKVxuICAgICAgICAgIC5kb25lID0+IHRoaXMucHVibGlzaCgnYW5ub3RhdGlvbkRlbGV0ZWQnLCBbYW5ub3RhdGlvbl0pXG4gICAgICApXG4gICAgICAuYWRkRmllbGQoe1xuICAgICAgICBsb2FkOiAoZmllbGQsIGFubm90YXRpb24pID0+XG4gICAgICAgICAgaWYgYW5ub3RhdGlvbi50ZXh0XG4gICAgICAgICAgICAkKGZpZWxkKS5odG1sKFV0aWwuZXNjYXBlKGFubm90YXRpb24udGV4dCkpXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgJChmaWVsZCkuaHRtbChcIjxpPiN7X3QgJ05vIENvbW1lbnQnfTwvaT5cIilcbiAgICAgICAgICB0aGlzLnB1Ymxpc2goJ2Fubm90YXRpb25WaWV3ZXJUZXh0RmllbGQnLCBbZmllbGQsIGFubm90YXRpb25dKVxuICAgICAgfSlcbiAgICAgIC5lbGVtZW50LmFwcGVuZFRvKEB3cmFwcGVyKS5iaW5kKHtcbiAgICAgICAgXCJtb3VzZW92ZXJcIjogdGhpcy5jbGVhclZpZXdlckhpZGVUaW1lclxuICAgICAgICBcIm1vdXNlb3V0XCI6ICB0aGlzLnN0YXJ0Vmlld2VySGlkZVRpbWVyXG4gICAgICB9KVxuICAgIHRoaXNcblxuICAjIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFubm90YXRvci5FZGl0b3IgYW5kIGFzc2lnbnMgaXQgdG8gQGVkaXRvci5cbiAgIyBBcHBlbmRzIHRoaXMgdG8gdGhlIEB3cmFwcGVyIGFuZCBzZXRzIHVwIGV2ZW50IGxpc3RlbmVycy5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgX3NldHVwRWRpdG9yOiAtPlxuICAgIEBlZGl0b3IgPSBuZXcgQW5ub3RhdG9yLkVkaXRvcigpXG4gICAgQGVkaXRvci5oaWRlKClcbiAgICAgIC5vbignaGlkZScsIHRoaXMub25FZGl0b3JIaWRlKVxuICAgICAgLm9uKCdzYXZlJywgdGhpcy5vbkVkaXRvclN1Ym1pdClcbiAgICAgIC5hZGRGaWVsZCh7XG4gICAgICAgIHR5cGU6ICd0ZXh0YXJlYScsXG4gICAgICAgIGxhYmVsOiBfdCgnQ29tbWVudHMnKSArICdcXHUyMDI2J1xuICAgICAgICBsb2FkOiAoZmllbGQsIGFubm90YXRpb24pIC0+XG4gICAgICAgICAgJChmaWVsZCkuZmluZCgndGV4dGFyZWEnKS52YWwoYW5ub3RhdGlvbi50ZXh0IHx8ICcnKVxuICAgICAgICBzdWJtaXQ6IChmaWVsZCwgYW5ub3RhdGlvbikgLT5cbiAgICAgICAgICBhbm5vdGF0aW9uLnRleHQgPSAkKGZpZWxkKS5maW5kKCd0ZXh0YXJlYScpLnZhbCgpXG4gICAgICB9KVxuXG4gICAgQGVkaXRvci5lbGVtZW50LmFwcGVuZFRvKEB3cmFwcGVyKVxuICAgIHRoaXNcblxuICAjIFNldHMgdXAgdGhlIHNlbGVjdGlvbiBldmVudCBsaXN0ZW5lcnMgdG8gd2F0Y2ggbW91c2UgYWN0aW9ucyBvbiB0aGUgZG9jdW1lbnQuXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gIF9zZXR1cERvY3VtZW50RXZlbnRzOiAtPlxuICAgICQoZG9jdW1lbnQpLmJpbmQoe1xuICAgICAgXCJtb3VzZXVwXCI6ICAgdGhpcy5jaGVja0ZvckVuZFNlbGVjdGlvblxuICAgICAgXCJtb3VzZWRvd25cIjogdGhpcy5jaGVja0ZvclN0YXJ0U2VsZWN0aW9uXG4gICAgfSlcbiAgICB0aGlzXG5cbiAgIyBTZXRzIHVwIGFueSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIENTUyBmb3IgdGhlIEFubm90YXRvci5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgX3NldHVwRHluYW1pY1N0eWxlOiAtPlxuICAgIHN0eWxlID0gJCgnI2Fubm90YXRvci1keW5hbWljLXN0eWxlJylcblxuICAgIGlmICghc3R5bGUubGVuZ3RoKVxuICAgICAgc3R5bGUgPSAkKCc8c3R5bGUgaWQ9XCJhbm5vdGF0b3ItZHluYW1pYy1zdHlsZVwiPjwvc3R5bGU+JykuYXBwZW5kVG8oZG9jdW1lbnQuaGVhZClcblxuICAgIHNlbCA9ICcqJyArIChcIjpub3QoLmFubm90YXRvci0je3h9KVwiIGZvciB4IGluIFsnYWRkZXInLCAnb3V0ZXInLCAnbm90aWNlJywgJ2ZpbHRlciddKS5qb2luKCcnKVxuXG4gICAgIyB1c2UgdGhlIG1heGltdW0gei1pbmRleCBpbiB0aGUgcGFnZVxuICAgIG1heCA9IFV0aWwubWF4WkluZGV4KCQoZG9jdW1lbnQuYm9keSkuZmluZChzZWwpKVxuXG4gICAgIyBidXQgZG9uJ3QgZ28gc21hbGxlciB0aGFuIDEwMTAsIGJlY2F1c2UgdGhpcyBpc24ndCBidWxsZXRwcm9vZiAtLVxuICAgICMgZHluYW1pYyBlbGVtZW50cyBpbiB0aGUgcGFnZSAobm90aWZpY2F0aW9ucywgZGlhbG9ncywgZXRjLikgbWF5IHdlbGxcbiAgICAjIGhhdmUgaGlnaCB6LWluZGljZXMgdGhhdCB3ZSBjYW4ndCBjYXRjaCB1c2luZyB0aGUgYWJvdmUgbWV0aG9kLlxuICAgIG1heCA9IE1hdGgubWF4KG1heCwgMTAwMClcblxuICAgIHN0eWxlLnRleHQgW1xuICAgICAgXCIuYW5ub3RhdG9yLWFkZGVyLCAuYW5ub3RhdG9yLW91dGVyLCAuYW5ub3RhdG9yLW5vdGljZSB7XCJcbiAgICAgIFwiICB6LWluZGV4OiAje21heCArIDIwfTtcIlxuICAgICAgXCJ9XCJcbiAgICAgIFwiLmFubm90YXRvci1maWx0ZXIge1wiXG4gICAgICBcIiAgei1pbmRleDogI3ttYXggKyAxMH07XCJcbiAgICAgIFwifVwiXG4gICAgXS5qb2luKFwiXFxuXCIpXG5cbiAgICB0aGlzXG5cbiAgIyBQdWJsaWM6IExvYWQgYW5kIGRyYXcgYW5ub3RhdGlvbnMgZnJvbSBhIGdpdmVuIHF1ZXJ5LlxuICAjXG4gICMgcXVlcnkgLSB0aGUgcXVlcnkgdG8gcGFzcyB0byB0aGUgYmFja2VuZFxuICAjXG4gICMgUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGxvYWRpbmcgaXMgY29tcGxldGUuXG4gIGxvYWQ6IChxdWVyeSkgLT5cbiAgICBAYW5ub3RhdGlvbnMubG9hZChxdWVyeSlcbiAgICAgIC50aGVuIChhbm5vdGF0aW9ucywgbWV0YSkgPT5cbiAgICAgICAgdGhpcy5sb2FkQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpXG5cbiAgIyBQdWJsaWM6IERlc3Ryb3kgdGhlIGN1cnJlbnQgQW5ub3RhdG9yIGluc3RhbmNlLCB1bmJpbmRpbmcgYWxsIGV2ZW50cyBhbmRcbiAgIyBkaXNwb3Npbmcgb2YgYWxsIHJlbGV2YW50IGVsZW1lbnRzLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBkZXN0cm95OiAtPlxuICAgICQoZG9jdW1lbnQpLnVuYmluZCh7XG4gICAgICBcIm1vdXNldXBcIjogICB0aGlzLmNoZWNrRm9yRW5kU2VsZWN0aW9uXG4gICAgICBcIm1vdXNlZG93blwiOiB0aGlzLmNoZWNrRm9yU3RhcnRTZWxlY3Rpb25cbiAgICB9KVxuXG4gICAgJCgnI2Fubm90YXRvci1keW5hbWljLXN0eWxlJykucmVtb3ZlKClcblxuICAgIEBhZGRlci5yZW1vdmUoKVxuICAgIEB2aWV3ZXIuZGVzdHJveSgpXG4gICAgQGVkaXRvci5kZXN0cm95KClcblxuICAgIEB3cmFwcGVyLmZpbmQoJy5hbm5vdGF0b3ItaGwnKS5lYWNoIC0+XG4gICAgICAkKHRoaXMpLmNvbnRlbnRzKCkuaW5zZXJ0QmVmb3JlKHRoaXMpXG4gICAgICAkKHRoaXMpLnJlbW92ZSgpXG5cbiAgICBAd3JhcHBlci5jb250ZW50cygpLmluc2VydEJlZm9yZShAd3JhcHBlcilcbiAgICBAd3JhcHBlci5yZW1vdmUoKVxuICAgIEBlbGVtZW50LmRhdGEoJ2Fubm90YXRvcicsIG51bGwpXG5cbiAgICBmb3IgbmFtZSwgcGx1Z2luIG9mIEBwbHVnaW5zXG4gICAgICBAcGx1Z2luc1tuYW1lXS5kZXN0cm95KClcblxuICAgIHRoaXMucmVtb3ZlRXZlbnRzKClcbiAgICBpZHggPSBBbm5vdGF0b3IuX2luc3RhbmNlcy5pbmRleE9mKHRoaXMpXG4gICAgaWYgaWR4ICE9IC0xXG4gICAgICBBbm5vdGF0b3IuX2luc3RhbmNlcy5zcGxpY2UoaWR4LCAxKVxuXG4gICMgUHVibGljOiBHZXRzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBleGNsdWRpbmcgYW55IG5vZGVzIHRoYXQgZmFsbCBvdXRzaWRlIG9mXG4gICMgdGhlIEB3cmFwcGVyLiBUaGVuIHJldHVybnMgYW5kIEFycmF5IG9mIE5vcm1hbGl6ZWRSYW5nZSBpbnN0YW5jZXMuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIEEgc2VsZWN0aW9uIGluc2lkZSBAd3JhcHBlclxuICAjICAgYW5ub3RhdGlvbi5nZXRTZWxlY3RlZFJhbmdlcygpXG4gICMgICAjID0+IFJldHVybnMgW05vcm1hbGl6ZWRSYW5nZV1cbiAgI1xuICAjICAgIyBBIHNlbGVjdGlvbiBvdXRzaWRlIG9mIEB3cmFwcGVyXG4gICMgICBhbm5vdGF0aW9uLmdldFNlbGVjdGVkUmFuZ2VzKClcbiAgIyAgICMgPT4gUmV0dXJucyBbXVxuICAjXG4gICMgUmV0dXJucyBBcnJheSBvZiBOb3JtYWxpemVkUmFuZ2UgaW5zdGFuY2VzLlxuICBnZXRTZWxlY3RlZFJhbmdlczogLT5cbiAgICBzZWxlY3Rpb24gPSBVdGlsLmdldEdsb2JhbCgpLmdldFNlbGVjdGlvbigpXG5cbiAgICByYW5nZXMgPSBbXVxuICAgIHJhbmdlc1RvSWdub3JlID0gW11cbiAgICB1bmxlc3Mgc2VsZWN0aW9uLmlzQ29sbGFwc2VkXG4gICAgICByYW5nZXMgPSBmb3IgaSBpbiBbMC4uLnNlbGVjdGlvbi5yYW5nZUNvdW50XVxuICAgICAgICByID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSlcbiAgICAgICAgYnJvd3NlclJhbmdlID0gbmV3IFJhbmdlLkJyb3dzZXJSYW5nZShyKVxuICAgICAgICBub3JtZWRSYW5nZSA9IGJyb3dzZXJSYW5nZS5ub3JtYWxpemUoKS5saW1pdChAd3JhcHBlclswXSlcblxuICAgICAgICAjIElmIHRoZSBuZXcgcmFuZ2UgZmFsbHMgZnVsbHkgb3V0c2lkZSB0aGUgd3JhcHBlciwgd2VcbiAgICAgICAgIyBzaG91bGQgYWRkIGl0IGJhY2sgdG8gdGhlIGRvY3VtZW50IGJ1dCBub3QgcmV0dXJuIGl0IGZyb21cbiAgICAgICAgIyB0aGlzIG1ldGhvZFxuICAgICAgICByYW5nZXNUb0lnbm9yZS5wdXNoKHIpIGlmIG5vcm1lZFJhbmdlIGlzIG51bGxcblxuICAgICAgICBub3JtZWRSYW5nZVxuXG4gICAgICAjIEJyb3dzZXJSYW5nZSNub3JtYWxpemUoKSBtb2RpZmllcyB0aGUgRE9NIHN0cnVjdHVyZSBhbmQgZGVzZWxlY3RzIHRoZVxuICAgICAgIyB1bmRlcmx5aW5nIHRleHQgYXMgYSByZXN1bHQuIFNvIGhlcmUgd2UgcmVtb3ZlIHRoZSBzZWxlY3RlZCByYW5nZXMgYW5kXG4gICAgICAjIHJlYXBwbHkgdGhlIG5ldyBvbmVzLlxuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG5cbiAgICBmb3IgciBpbiByYW5nZXNUb0lnbm9yZVxuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHIpXG5cbiAgICAjIFJlbW92ZSBhbnkgcmFuZ2VzIHRoYXQgZmVsbCBvdXRzaWRlIG9mIEB3cmFwcGVyLlxuICAgICQuZ3JlcCByYW5nZXMsIChyYW5nZSkgLT5cbiAgICAgICMgQWRkIHRoZSBub3JtZWQgcmFuZ2UgYmFjayB0byB0aGUgc2VsZWN0aW9uIGlmIGl0IGV4aXN0cy5cbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZS50b1JhbmdlKCkpIGlmIHJhbmdlXG4gICAgICByYW5nZVxuXG5cbiAgIyBQdWJsaWM6IEluaXRpYWxpc2VzIGFuIGFubm90YXRpb24gZnJvbSBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24uIEl0IGZpbmRzXG4gICMgdGhlIHNlbGVjdGVkIHJhbmdlIGFuZCBoaWdsaWdodHMgdGhlIHNlbGVjdGlvbiBpbiB0aGUgRE9NLlxuICAjXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gT2JqZWN0IHRvIGluaXRpYWxpc2UuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIENyZWF0ZSBhIGJyYW5kIG5ldyBhbm5vdGF0aW9uIGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0LlxuICAjICAgYW5ub3RhdGlvbiA9IGFubm90YXRvci5zZXR1cEFubm90YXRpb24oe3JhbmdlczogYW5ub3RhdG9yLnNlbGVjdGVkUmFuZ2VzfSlcbiAgIyAgICMgYW5ub3RhdGlvbiBoYXMgbm93IGJlZW4gYXNzaWduZWQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByYW5nZVxuICAjICAgIyBhbmQgYSBoaWdobGlnaHQgYXBwZW5kZWQgdG8gdGhlIERPTS5cbiAgI1xuICAjICAgIyBBZGQgYW4gZXhpc3RpbmcgYW5ub3RhdGlvbiB0aGF0IGhhcyBiZWVuIHN0b3JlZCBlbHNld2VyZSB0byB0aGUgRE9NLlxuICAjICAgYW5ub3RhdGlvbiA9IGdldFN0b3JlZEFubm90YXRpb25XaXRoU2VyaWFsaXplZFJhbmdlcygpXG4gICMgICBhbm5vdGF0aW9uID0gYW5ub3RhdG9yLnNldHVwQW5ub3RhdGlvbihhbm5vdGF0aW9uKVxuICAjXG4gICMgUmV0dXJucyB0aGUgaW5pdGlhbGlzZWQgYW5ub3RhdGlvbi5cbiAgc2V0dXBBbm5vdGF0aW9uOiAoYW5ub3RhdGlvbikgLT5cbiAgICByb290ID0gQHdyYXBwZXJbMF1cblxuICAgIG5vcm1lZFJhbmdlcyA9IFtdXG4gICAgZm9yIHIgaW4gYW5ub3RhdGlvbi5yYW5nZXNcbiAgICAgIHRyeVxuICAgICAgICBub3JtZWRSYW5nZXMucHVzaChSYW5nZS5zbmlmZihyKS5ub3JtYWxpemUocm9vdCkpXG4gICAgICBjYXRjaCBlXG4gICAgICAgIGlmIGUgaW5zdGFuY2VvZiBSYW5nZS5SYW5nZUVycm9yXG4gICAgICAgICAgdGhpcy5wdWJsaXNoKCdyYW5nZU5vcm1hbGl6ZUZhaWwnLCBbYW5ub3RhdGlvbiwgciwgZV0pXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAjIE9oIEphdmFzY3JpcHQsIHdoeSB5b3Ugc28gY3JhcD8gVGhpcyB3aWxsIGxvc2UgdGhlIHRyYWNlYmFjay5cbiAgICAgICAgICB0aHJvdyBlXG5cbiAgICBhbm5vdGF0aW9uLnF1b3RlICAgICAgPSBbXVxuICAgIGFubm90YXRpb24ucmFuZ2VzICAgICA9IFtdXG4gICAgYW5ub3RhdGlvbi5fbG9jYWwgPSB7fVxuICAgIGFubm90YXRpb24uX2xvY2FsLmhpZ2hsaWdodHMgPSBbXVxuXG4gICAgZm9yIG5vcm1lZCBpbiBub3JtZWRSYW5nZXNcbiAgICAgIGFubm90YXRpb24ucXVvdGUucHVzaCAgICAgICQudHJpbShub3JtZWQudGV4dCgpKVxuICAgICAgYW5ub3RhdGlvbi5yYW5nZXMucHVzaCAgICAgbm9ybWVkLnNlcmlhbGl6ZShAd3JhcHBlclswXSwgJy5hbm5vdGF0b3ItaGwnKVxuICAgICAgJC5tZXJnZSBhbm5vdGF0aW9uLl9sb2NhbC5oaWdobGlnaHRzLCB0aGlzLmhpZ2hsaWdodFJhbmdlKG5vcm1lZClcblxuICAgICMgSm9pbiBhbGwgdGhlIHF1b3RlcyBpbnRvIG9uZSBzdHJpbmcuXG4gICAgYW5ub3RhdGlvbi5xdW90ZSA9IGFubm90YXRpb24ucXVvdGUuam9pbignIC8gJylcblxuICAgICMgU2F2ZSB0aGUgYW5ub3RhdGlvbiBkYXRhIG9uIGVhY2ggaGlnaGxpZ2h0ZXIgZWxlbWVudC5cbiAgICAkKGFubm90YXRpb24uX2xvY2FsLmhpZ2hsaWdodHMpLmRhdGEoJ2Fubm90YXRpb24nLCBhbm5vdGF0aW9uKVxuXG4gICAgYW5ub3RhdGlvblxuXG4gICMgUHVibGljOiBEZWxldGVzIHRoZSBhbm5vdGF0aW9uIGJ5IHJlbW92aW5nIHRoZSBoaWdobGlnaHQgZnJvbSB0aGUgRE9NLlxuICAjXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gT2JqZWN0IHRvIGRlbGV0ZS5cbiAgI1xuICAjIFJldHVybnMgZGVsZXRlZCBhbm5vdGF0aW9uLlxuICBjbGVhbnVwQW5ub3RhdGlvbjogKGFubm90YXRpb24pIC0+XG4gICAgaWYgYW5ub3RhdGlvbi5fbG9jYWw/LmhpZ2hsaWdodHM/XG4gICAgICBmb3IgaCBpbiBhbm5vdGF0aW9uLl9sb2NhbC5oaWdobGlnaHRzIHdoZW4gaC5wYXJlbnROb2RlP1xuICAgICAgICAkKGgpLnJlcGxhY2VXaXRoKGguY2hpbGROb2RlcylcbiAgICAgIGRlbGV0ZSBhbm5vdGF0aW9uLl9sb2NhbC5oaWdobGlnaHRzXG5cbiAgICBhbm5vdGF0aW9uXG5cbiAgIyBQdWJsaWM6IExvYWRzIGFuIEFycmF5IG9mIGFubm90YXRpb25zIGludG8gdGhlIEBlbGVtZW50LiBCcmVha3MgdGhlIHRhc2tcbiAgIyBpbnRvIGNodW5rcyBvZiAxMCBhbm5vdGF0aW9ucy5cbiAgI1xuICAjIGFubm90YXRpb25zIC0gQW4gQXJyYXkgb2YgYW5ub3RhdGlvbiBPYmplY3RzLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgbG9hZEFubm90YXRpb25zRnJvbVN0b3JlIChhbm5vdGF0aW9ucykgLT5cbiAgIyAgICAgYW5ub3RhdG9yLmxvYWRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucylcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgbG9hZEFubm90YXRpb25zOiAoYW5ub3RhdGlvbnM9W10pIC0+XG4gICAgbG9hZGVyID0gKGFubkxpc3Q9W10pID0+XG4gICAgICBub3cgPSBhbm5MaXN0LnNwbGljZSgwLDEwKVxuXG4gICAgICBmb3IgbiBpbiBub3dcbiAgICAgICAgdGhpcy5zZXR1cEFubm90YXRpb24obilcblxuICAgICAgIyBJZiB0aGVyZSBhcmUgbW9yZSB0byBkbywgZG8gdGhlbSBhZnRlciBhIDEwbXMgYnJlYWsgKGZvciBicm93c2VyXG4gICAgICAjIHJlc3BvbnNpdmVuZXNzKS5cbiAgICAgIGlmIGFubkxpc3QubGVuZ3RoID4gMFxuICAgICAgICBzZXRUaW1lb3V0KCgtPiBsb2FkZXIoYW5uTGlzdCkpLCAxMClcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5wdWJsaXNoICdhbm5vdGF0aW9uc0xvYWRlZCcsIFtjbG9uZV1cblxuICAgIGNsb25lID0gYW5ub3RhdGlvbnMuc2xpY2UoKVxuICAgIGxvYWRlciBhbm5vdGF0aW9uc1xuXG4gICAgdGhpc1xuXG4gICMgUHVibGljOiBDYWxscyB0aGUgU3RvcmUjZHVtcEFubm90YXRpb25zKCkgbWV0aG9kLlxuICAjXG4gICMgUmV0dXJucyBkdW1wZWQgYW5ub3RhdGlvbnMgQXJyYXkgb3IgZmFsc2UgaWYgU3RvcmUgaXMgbm90IGxvYWRlZC5cbiAgZHVtcEFubm90YXRpb25zOiAoKSAtPlxuICAgIGlmIEBwbHVnaW5zWydTdG9yZSddXG4gICAgICBAcGx1Z2luc1snU3RvcmUnXS5kdW1wQW5ub3RhdGlvbnMoKVxuICAgIGVsc2VcbiAgICAgIGNvbnNvbGUud2FybihfdChcIkNhbid0IGR1bXAgYW5ub3RhdGlvbnMgd2l0aG91dCBTdG9yZSBwbHVnaW4uXCIpKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgIyBQdWJsaWM6IFdyYXBzIHRoZSBET00gTm9kZXMgd2l0aGluIHRoZSBwcm92aWRlZCByYW5nZSB3aXRoIGEgaGlnaGxpZ2h0XG4gICMgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzwqBhbmQgcmV0dXJucyB0aGUgaGlnaGxpZ2h0IEVsZW1lbnRzLlxuICAjXG4gICMgbm9ybWVkUmFuZ2UgLSBBIE5vcm1hbGl6ZWRSYW5nZSB0byBiZSBoaWdobGlnaHRlZC5cbiAgIyBjc3NDbGFzcyAtIEEgQ1NTIGNsYXNzIHRvIHVzZSBmb3IgdGhlIGhpZ2hsaWdodCAoZGVmYXVsdDogJ2Fubm90YXRvci1obCcpXG4gICNcbiAgIyBSZXR1cm5zIGFuIGFycmF5IG9mIGhpZ2hsaWdodCBFbGVtZW50cy5cbiAgaGlnaGxpZ2h0UmFuZ2U6IChub3JtZWRSYW5nZSwgY3NzQ2xhc3M9J2Fubm90YXRvci1obCcpIC0+XG4gICAgd2hpdGUgPSAvXlxccyokL1xuXG4gICAgaGwgPSAkKFwiPHNwYW4gY2xhc3M9JyN7Y3NzQ2xhc3N9Jz48L3NwYW4+XCIpXG5cbiAgICAjIElnbm9yZSB0ZXh0IG5vZGVzIHRoYXQgY29udGFpbiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4gVGhpcyBwcmV2ZW50c1xuICAgICMgc3BhbnMgYmVpbmcgaW5qZWN0ZWQgYmV0d2VlbiBlbGVtZW50cyB0aGF0IGNhbiBvbmx5IGNvbnRhaW4gYSByZXN0cmljdGVkXG4gICAgIyBzdWJzZXQgb2Ygbm9kZXMgc3VjaCBhcyB0YWJsZSByb3dzIGFuZCBsaXN0cy4gVGhpcyBkb2VzIG1lYW4gdGhhdCB0aGVyZVxuICAgICMgbWF5IGJlIHRoZSBvZGQgYWJhbmRvbmVkIHdoaXRlc3BhY2Ugbm9kZSBpbiBhIHBhcmFncmFwaCB0aGF0IGlzIHNraXBwZWRcbiAgICAjIGJ1dCBiZXR0ZXIgdGhhbiBicmVha2luZyB0YWJsZSBsYXlvdXRzLlxuICAgIGZvciBub2RlIGluIG5vcm1lZFJhbmdlLnRleHROb2RlcygpIHdoZW4gbm90IHdoaXRlLnRlc3Qobm9kZS5ub2RlVmFsdWUpXG4gICAgICAkKG5vZGUpLndyYXBBbGwoaGwpLnBhcmVudCgpLnNob3coKVswXVxuXG4gICMgUHVibGljOiBoaWdobGlnaHQgYSBsaXN0IG9mIHJhbmdlc1xuICAjXG4gICMgbm9ybWVkUmFuZ2VzIC0gQW4gYXJyYXkgb2YgTm9ybWFsaXplZFJhbmdlcyB0byBiZSBoaWdobGlnaHRlZC5cbiAgIyBjc3NDbGFzcyAtIEEgQ1NTIGNsYXNzIHRvIHVzZSBmb3IgdGhlIGhpZ2hsaWdodCAoZGVmYXVsdDogJ2Fubm90YXRvci1obCcpXG4gICNcbiAgIyBSZXR1cm5zIGFuIGFycmF5IG9mIGhpZ2hsaWdodCBFbGVtZW50cy5cbiAgaGlnaGxpZ2h0UmFuZ2VzOiAobm9ybWVkUmFuZ2VzLCBjc3NDbGFzcz0nYW5ub3RhdG9yLWhsJykgLT5cbiAgICBoaWdobGlnaHRzID0gW11cbiAgICBmb3IgciBpbiBub3JtZWRSYW5nZXNcbiAgICAgICQubWVyZ2UgaGlnaGxpZ2h0cywgdGhpcy5oaWdobGlnaHRSYW5nZShyLCBjc3NDbGFzcylcbiAgICBoaWdobGlnaHRzXG5cbiAgIyBQdWJsaWM6IFJlZ2lzdGVycyBhIHBsdWdpbiB3aXRoIHRoZSBBbm5vdGF0b3IuIEEgcGx1Z2luIGNhbiBvbmx5IGJlXG4gICMgcmVnaXN0ZXJlZCBvbmNlLiBUaGUgcGx1Z2luIHdpbGwgYmUgaW5zdGFudGlhdGVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIuXG4gICNcbiAgIyAxLiBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgcGx1Z2luIHdpbGwgYmUgY3JlYXRlZCAocHJvdmlkaW5nIHRoZSBAZWxlbWVudCBhbmRcbiAgIyAgICBvcHRpb25zIGFzIHBhcmFtcykgdGhlbiBhc3NpZ25lZCB0byB0aGUgQHBsdWdpbnMgcmVnaXN0cnkuXG4gICMgMi4gVGhlIGN1cnJlbnQgQW5ub3RhdG9yIGluc3RhbmNlIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHBsdWdpbi5cbiAgIyAzLiBUaGUgUGx1Z2luI3BsdWdpbkluaXQoKSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgaWYgaXQgZXhpc3RzLlxuICAjXG4gICMgbmFtZSAgICAtIFBsdWdpbiB0byBpbnN0YW50aWF0ZS4gTXVzdCBiZSBpbiB0aGUgQW5ub3RhdG9yLlBsdWdpbnMgbmFtZXNwYWNlLlxuICAjIG9wdGlvbnMgLSBBbnkgb3B0aW9ucyB0byBiZSBwcm92aWRlZCB0byB0aGUgcGx1Z2luIGNvbnN0cnVjdG9yLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgYW5ub3RhdG9yXG4gICMgICAgIC5hZGRQbHVnaW4oJ1RhZ3MnKVxuICAjICAgICAuYWRkUGx1Z2luKCdTdG9yZScsIHtcbiAgIyAgICAgICBwcmVmaXg6ICcvc3RvcmUnXG4gICMgICAgIH0pXG4gICMgICAgIC5hZGRQbHVnaW4oJ1Blcm1pc3Npb25zJywge1xuICAjICAgICAgIHVzZXI6ICdCaWxsJ1xuICAjICAgICB9KVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmcuXG4gIGFkZFBsdWdpbjogKG5hbWUsIG9wdGlvbnMpIC0+XG4gICAgaWYgQHBsdWdpbnNbbmFtZV1cbiAgICAgIGNvbnNvbGUuZXJyb3IgX3QoXCJZb3UgY2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZiBhbnkgcGx1Z2luLlwiKVxuICAgIGVsc2VcbiAgICAgIGtsYXNzID0gQW5ub3RhdG9yLlBsdWdpbltuYW1lXVxuICAgICAgaWYgdHlwZW9mIGtsYXNzIGlzICdmdW5jdGlvbidcbiAgICAgICAgQHBsdWdpbnNbbmFtZV0gPSBuZXcga2xhc3MoQGVsZW1lbnRbMF0sIG9wdGlvbnMpXG4gICAgICAgIEBwbHVnaW5zW25hbWVdLmFubm90YXRvciA9IHRoaXNcbiAgICAgICAgQHBsdWdpbnNbbmFtZV0ucGx1Z2luSW5pdD8oKVxuICAgICAgZWxzZVxuICAgICAgICBjb25zb2xlLmVycm9yIF90KFwiQ291bGQgbm90IGxvYWQgXCIpICsgbmFtZSArIF90KFwiIHBsdWdpbi4gSGF2ZSB5b3UgaW5jbHVkZWQgdGhlIGFwcHJvcHJpYXRlIDxzY3JpcHQ+IHRhZz9cIilcbiAgICB0aGlzICMgYWxsb3cgY2hhaW5pbmdcblxuICAjIFB1YmxpYzogV2FpdHMgZm9yIHRoZSBAZWRpdG9yIHRvIHN1Ym1pdCBvciBoaWRlLCByZXR1cm5pbmcgYSBwcm9taXNlIHRoYXRcbiAgIyBpcyByZXNvbHZlZCBvciByZWplY3RlZCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgYW5ub3RhdGlvbiB3YXMgc2F2ZWQgb3JcbiAgIyBjYW5jZWxsZWQuXG4gIGVkaXRBbm5vdGF0aW9uOiAoYW5ub3RhdGlvbiwgcG9zaXRpb24pIC0+XG4gICAgZGZkID0gJC5EZWZlcnJlZCgpXG4gICAgcmVzb2x2ZSA9IGRmZC5yZXNvbHZlLmJpbmQoZGZkLCBhbm5vdGF0aW9uKVxuICAgIHJlamVjdCA9IGRmZC5yZWplY3QuYmluZChkZmQsIGFubm90YXRpb24pXG5cbiAgICB0aGlzLnNob3dFZGl0b3IoYW5ub3RhdGlvbiwgcG9zaXRpb24pXG4gICAgdGhpcy5zdWJzY3JpYmUoJ2Fubm90YXRpb25FZGl0b3JTdWJtaXQnLCByZXNvbHZlKVxuICAgIHRoaXMub25jZSAnYW5ub3RhdGlvbkVkaXRvckhpZGRlbicsID0+XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKCdhbm5vdGF0aW9uRWRpdG9yU3VibWl0JywgcmVzb2x2ZSlcbiAgICAgIHJlamVjdCgpIGlmIGRmZC5zdGF0ZSgpIGlzICdwZW5kaW5nJ1xuXG4gICAgZGZkLnByb21pc2UoKVxuXG4gICMgUHVibGljOiBMb2FkcyB0aGUgQGVkaXRvciB3aXRoIHRoZSBwcm92aWRlZCBhbm5vdGF0aW9uIGFuZCB1cGRhdGVzIGl0c1xuICAjIHBvc2l0aW9uIGluIHRoZSB3aW5kb3cuXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiB0byBsb2FkIGludG8gdGhlIGVkaXRvci5cbiAgIyBsb2NhdGlvbiAgIC0gUG9zaXRpb24gdG8gc2V0IHRoZSBFZGl0b3IgaW4gdGhlIGZvcm0ge3RvcDogeSwgbGVmdDogeH1cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGFubm90YXRvci5zaG93RWRpdG9yKHt0ZXh0OiBcIm15IGNvbW1lbnRcIn0sIHt0b3A6IDM0LCBsZWZ0OiAyMzR9KVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmcuXG4gIHNob3dFZGl0b3I6IChhbm5vdGF0aW9uLCBsb2NhdGlvbikgPT5cbiAgICBAZWRpdG9yLmVsZW1lbnQuY3NzKGxvY2F0aW9uKVxuICAgIEBlZGl0b3IubG9hZChhbm5vdGF0aW9uKVxuICAgIHRoaXMucHVibGlzaCgnYW5ub3RhdGlvbkVkaXRvclNob3duJywgW0BlZGl0b3IsIGFubm90YXRpb25dKVxuICAgIHRoaXNcblxuICAjIENhbGxiYWNrIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgQGVkaXRvciBmaXJlcyB0aGUgXCJoaWRlXCIgZXZlbnQuIEl0c2VsZlxuICAjIHB1Ymxpc2hlcyB0aGUgJ2Fubm90YXRpb25FZGl0b3JIaWRkZW4nIGV2ZW50IGFuZCByZXNldHMgdGhlIEBpZ25vcmVNb3VzZXVwXG4gICMgcHJvcGVydHkgdG8gYWxsb3cgbGlzdGVuaW5nIHRvIG1vdXNlIGV2ZW50cy5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgb25FZGl0b3JIaWRlOiA9PlxuICAgIHRoaXMucHVibGlzaCgnYW5ub3RhdGlvbkVkaXRvckhpZGRlbicsIFtAZWRpdG9yXSlcbiAgICBAaWdub3JlTW91c2V1cCA9IGZhbHNlXG5cbiAgIyBDYWxsYmFjayBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIEBlZGl0b3IgZmlyZXMgdGhlIFwic2F2ZVwiIGV2ZW50LiBJdHNlbGZcbiAgIyBwdWJsaXNoZXMgdGhlICdhbm5vdGF0aW9uRWRpdG9yU3VibWl0JyBldmVudCBhbmQgY3JlYXRlcy91cGRhdGVzIHRoZVxuICAjIGVkaXRlZCBhbm5vdGF0aW9uLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBvbkVkaXRvclN1Ym1pdDogKGFubm90YXRpb24pID0+XG4gICAgdGhpcy5wdWJsaXNoKCdhbm5vdGF0aW9uRWRpdG9yU3VibWl0JywgW0BlZGl0b3IsIGFubm90YXRpb25dKVxuXG4gICMgUHVibGljOiBMb2FkcyB0aGUgQHZpZXdlciB3aXRoIGFuIEFycmF5IG9mIGFubm90YXRpb25zIGFuZCBwb3NpdGlvbnMgaXRcbiAgIyBhdCB0aGUgbG9jYXRpb24gcHJvdmlkZWQuIENhbGxzIHRoZSAnYW5ub3RhdGlvblZpZXdlclNob3duJyBldmVudC5cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBBcnJheSBvZiBhbm5vdGF0aW9ucyB0byBsb2FkIGludG8gdGhlIHZpZXdlci5cbiAgIyBsb2NhdGlvbiAgIC0gUG9zaXRpb24gdG8gc2V0IHRoZSBWaWV3ZXIgaW4gdGhlIGZvcm0ge3RvcDogeSwgbGVmdDogeH1cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGFubm90YXRvci5zaG93Vmlld2VyKFxuICAjICAgIFt7dGV4dDogXCJteSBjb21tZW50XCJ9LCB7dGV4dDogXCJteSBvdGhlciBjb21tZW50XCJ9XSxcbiAgIyAgICB7dG9wOiAzNCwgbGVmdDogMjM0fSlcbiAgIyAgIClcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nLlxuICBzaG93Vmlld2VyOiAoYW5ub3RhdGlvbnMsIGxvY2F0aW9uKSA9PlxuICAgIEB2aWV3ZXIuZWxlbWVudC5jc3MobG9jYXRpb24pXG4gICAgQHZpZXdlci5sb2FkKGFubm90YXRpb25zKVxuXG4gICAgdGhpcy5wdWJsaXNoKCdhbm5vdGF0aW9uVmlld2VyU2hvd24nLCBbQHZpZXdlciwgYW5ub3RhdGlvbnNdKVxuXG4gICMgQW5ub3RhdG9yI2VsZW1lbnQgZXZlbnQgY2FsbGJhY2suIEFsbG93cyAyNTBtcyBmb3IgbW91c2UgcG9pbnRlciB0byBnZXQgZnJvbVxuICAjIGFubm90YXRpb24gaGlnaGxpZ2h0IHRvIEB2aWV3ZXIgdG8gbWFuaXB1bGF0ZSBhbm5vdGF0aW9ucy4gSWYgdGltZXIgZXhwaXJlc1xuICAjIHRoZSBAdmlld2VyIGlzIGhpZGRlbi5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgc3RhcnRWaWV3ZXJIaWRlVGltZXI6ID0+XG4gICAgIyBEb24ndCBkbyB0aGlzIGlmIHRpbWVyIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IGFub3RoZXIgYW5ub3RhdGlvbi5cbiAgICBpZiBub3QgQHZpZXdlckhpZGVUaW1lclxuICAgICAgQHZpZXdlckhpZGVUaW1lciA9IHNldFRpbWVvdXQgQHZpZXdlci5oaWRlLCAyNTBcblxuICAjIFZpZXdlciNlbGVtZW50IGV2ZW50IGNhbGxiYWNrLiBDbGVhcnMgdGhlIHRpbWVyIHNldCBieVxuICAjIEFubm90YXRvciNzdGFydFZpZXdlckhpZGVUaW1lcigpIHdoZW4gdGhlIEB2aWV3ZXIgaXMgbW91c2VkIG92ZXIuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIGNsZWFyVmlld2VySGlkZVRpbWVyOiAoKSA9PlxuICAgIGNsZWFyVGltZW91dChAdmlld2VySGlkZVRpbWVyKVxuICAgIEB2aWV3ZXJIaWRlVGltZXIgPSBmYWxzZVxuXG4gICMgQW5ub3RhdG9yI2VsZW1lbnQgY2FsbGJhY2suIFNldHMgdGhlIEBtb3VzZUlzRG93biBwcm9wZXJ0eSB1c2VkIHRvXG4gICMgZGV0ZXJtaW5lIGlmIGEgc2VsZWN0aW9uIG1heSBoYXZlIHN0YXJ0ZWQgdG8gdHJ1ZS4gQWxzbyBjYWxsc1xuICAjIEFubm90YXRvciNzdGFydFZpZXdlckhpZGVUaW1lcigpIHRvIGhpZGUgdGhlIEFubm90YXRvciN2aWV3ZXIuXG4gICNcbiAgIyBldmVudCAtIEEgbW91c2Vkb3duIEV2ZW50IG9iamVjdC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgY2hlY2tGb3JTdGFydFNlbGVjdGlvbjogKGV2ZW50KSA9PlxuICAgIHVubGVzcyBldmVudCBhbmQgdGhpcy5pc0Fubm90YXRvcihldmVudC50YXJnZXQpXG4gICAgICB0aGlzLnN0YXJ0Vmlld2VySGlkZVRpbWVyKClcbiAgICBAbW91c2VJc0Rvd24gPSB0cnVlXG5cbiAgIyBBbm5vdGF0b3IjZWxlbWVudCBjYWxsYmFjay4gQ2hlY2tzIHRvIHNlZSBpZiBhIHNlbGVjdGlvbiBoYXMgYmVlbiBtYWRlXG4gICMgb24gbW91c2V1cCBhbmQgaWYgc28gZGlzcGxheXMgdGhlIEFubm90YXRvciNhZGRlci4gSWYgQGlnbm9yZU1vdXNldXAgaXNcbiAgIyBzZXQgd2lsbCBkbyBub3RoaW5nLiBBbHNvIHJlc2V0cyB0aGUgQG1vdXNlSXNEb3duIHByb3BlcnR5LlxuICAjXG4gICMgZXZlbnQgLSBBIG1vdXNldXAgRXZlbnQgb2JqZWN0LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBjaGVja0ZvckVuZFNlbGVjdGlvbjogKGV2ZW50KSA9PlxuICAgIEBtb3VzZUlzRG93biA9IGZhbHNlXG5cbiAgICAjIFRoaXMgcHJldmVudHMgdGhlIG5vdGUgaW1hZ2UgZnJvbSBqdW1waW5nIGF3YXkgb24gdGhlIG1vdXNldXBcbiAgICAjIG9mIGEgY2xpY2sgb24gaWNvbi5cbiAgICBpZiBAaWdub3JlTW91c2V1cFxuICAgICAgcmV0dXJuXG5cbiAgICAjIEdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJhbmdlcy5cbiAgICBAc2VsZWN0ZWRSYW5nZXMgPSB0aGlzLmdldFNlbGVjdGVkUmFuZ2VzKClcblxuICAgIGZvciByYW5nZSBpbiBAc2VsZWN0ZWRSYW5nZXNcbiAgICAgIGNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yXG4gICAgICBpZiAkKGNvbnRhaW5lcikuaGFzQ2xhc3MoJ2Fubm90YXRvci1obCcpXG4gICAgICAgIGNvbnRhaW5lciA9ICQoY29udGFpbmVyKS5wYXJlbnRzKCdbY2xhc3MhPWFubm90YXRvci1obF0nKVswXVxuICAgICAgcmV0dXJuIGlmIHRoaXMuaXNBbm5vdGF0b3IoY29udGFpbmVyKVxuXG4gICAgaWYgZXZlbnQgYW5kIEBzZWxlY3RlZFJhbmdlcy5sZW5ndGhcbiAgICAgIEBhZGRlclxuICAgICAgICAuY3NzKFV0aWwubW91c2VQb3NpdGlvbihldmVudCwgQHdyYXBwZXJbMF0pKVxuICAgICAgICAuc2hvdygpXG4gICAgZWxzZVxuICAgICAgQGFkZGVyLmhpZGUoKVxuXG4gICMgUHVibGljOiBEZXRlcm1pbmVzIGlmIHRoZSBwcm92aWRlZCBlbGVtZW50IGlzIHBhcnQgb2YgdGhlIGFubm90YXRvciBwbHVnaW4uXG4gICMgVXNlZnVsIGZvciBpZ25vcmluZyBtb3VzZSBhY3Rpb25zIG9uIHRoZSBhbm5vdGF0b3IgZWxlbWVudHMuXG4gICMgTk9URTogVGhlIEB3cmFwcGVyIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGNoZWNrLlxuICAjXG4gICMgZWxlbWVudCAtIEFuIEVsZW1lbnQgb3IgVGV4dE5vZGUgdG8gY2hlY2suXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXG4gICMgICBhbm5vdGF0b3IuaXNBbm5vdGF0b3Ioc3BhbikgIyA9PiBSZXR1cm5zIGZhbHNlXG4gICNcbiAgIyAgIGFubm90YXRvci5pc0Fubm90YXRvcihhbm5vdGF0b3Iudmlld2VyLmVsZW1lbnQpICMgPT4gUmV0dXJucyB0cnVlXG4gICNcbiAgIyBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgYSBjaGlsZCBvZiBhbiBhbm5vdGF0b3IgZWxlbWVudC5cbiAgaXNBbm5vdGF0b3I6IChlbGVtZW50KSAtPlxuICAgICEhJChlbGVtZW50KS5wYXJlbnRzKCkuYWRkQmFjaygpLmZpbHRlcignW2NsYXNzXj1hbm5vdGF0b3ItXScpLm5vdChAd3JhcHBlcikubGVuZ3RoXG5cbiAgY29uZmlndXJlOiAoQHJlZ2lzdHJ5KSAtPlxuICAgIHJlZ2lzdHJ5LmluY2x1ZGUoQW5ub3RhdGlvblByb3ZpZGVyKVxuXG4gIHJ1bjogKEByZWdpc3RyeSkgLT5cbiAgICAjIFNldCB1cCB0aGUgY29yZSBpbnRlcmZhY2UgY29tcG9uZW50c1xuICAgIHRoaXMuX3NldHVwRG9jdW1lbnRFdmVudHMoKSB1bmxlc3MgQG9wdGlvbnMucmVhZE9ubHlcbiAgICB0aGlzLl9zZXR1cFdyYXBwZXIoKS5fc2V0dXBWaWV3ZXIoKS5fc2V0dXBFZGl0b3IoKVxuICAgIHRoaXMuX3NldHVwRHluYW1pY1N0eWxlKClcblxuICAgICMgQ3JlYXRlIGFkZGVyXG4gICAgdGhpcy5hZGRlciA9ICQodGhpcy5odG1sLmFkZGVyKS5hcHBlbmRUbyhAd3JhcHBlcikuaGlkZSgpXG5cbiAgICAjIERvIGluaXRpYWwgbG9hZFxuICAgIGlmIEBvcHRpb25zLmxvYWRRdWVyeSB0aGVuIHRoaXMubG9hZChAb3B0aW9ucy5sb2FkUXVlcnkpXG5cbiAgIyBBbm5vdGF0b3IjZWxlbWVudCBjYWxsYmFjay4gRGlzcGxheXMgdmlld2VyIHdpdGggYWxsIGFubm90YXRpb25zXG4gICMgYXNzb2NpYXRlZCB3aXRoIGhpZ2hsaWdodCBFbGVtZW50cyB1bmRlciB0aGUgY3Vyc29yLlxuICAjXG4gICMgZXZlbnQgLSBBIG1vdXNlb3ZlciBFdmVudCBvYmplY3QuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIG9uSGlnaGxpZ2h0TW91c2VvdmVyOiAoZXZlbnQpID0+XG4gICAgIyBDYW5jZWwgYW55IHBlbmRpbmcgaGlkaW5nIG9mIHRoZSB2aWV3ZXIuXG4gICAgdGhpcy5jbGVhclZpZXdlckhpZGVUaW1lcigpXG5cbiAgICAjIERvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIG1ha2luZyBhIHNlbGVjdGlvbiBvclxuICAgICMgYWxyZWFkeSBkaXNwbGF5aW5nIHRoZSB2aWV3ZXJcbiAgICByZXR1cm4gZmFsc2UgaWYgQG1vdXNlSXNEb3duIG9yIEB2aWV3ZXIuaXNTaG93bigpXG5cbiAgICBhbm5vdGF0aW9ucyA9ICQoZXZlbnQudGFyZ2V0KVxuICAgICAgLnBhcmVudHMoJy5hbm5vdGF0b3ItaGwnKVxuICAgICAgLmFkZEJhY2soKVxuICAgICAgLm1hcCAtPiByZXR1cm4gJCh0aGlzKS5kYXRhKFwiYW5ub3RhdGlvblwiKVxuXG4gICAgdGhpcy5zaG93Vmlld2VyKCQubWFrZUFycmF5KGFubm90YXRpb25zKSwgVXRpbC5tb3VzZVBvc2l0aW9uKGV2ZW50LCBAd3JhcHBlclswXSkpXG5cbiAgIyBBbm5vdGF0b3IjZWxlbWVudCBjYWxsYmFjay4gU2V0cyBAaWdub3JlTW91c2V1cCB0byB0cnVlIHRvIHByZXZlbnRcbiAgIyB0aGUgYW5ub3RhdGlvbiBzZWxlY3Rpb24gZXZlbnRzIGZpcmluZyB3aGVuIHRoZSBhZGRlciBpcyBjbGlja2VkLlxuICAjXG4gICMgZXZlbnQgLSBBIG1vdXNlZG93biBFdmVudCBvYmplY3RcbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgb25BZGRlck1vdXNlZG93bjogKGV2ZW50KSA9PlxuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpXG4gICAgQGlnbm9yZU1vdXNldXAgPSB0cnVlXG5cbiAgIyBBbm5vdGF0b3IjZWxlbWVudCBjYWxsYmFjay4gRGlzcGxheXMgdGhlIEBlZGl0b3IgaW4gcGxhY2Ugb2YgdGhlIEBhZGRlciBhbmRcbiAgIyBsb2FkcyBpbiBhIG5ld2x5IGNyZWF0ZWQgYW5ub3RhdGlvbiBPYmplY3QuIFRoZSBjbGljayBldmVudCBpcyB1c2VkIGFzIHdlbGxcbiAgIyBhcyB0aGUgbW91c2Vkb3duIHNvIHRoYXQgd2UgZ2V0IHRoZSA6YWN0aXZlIHN0YXRlIG9uIHRoZSBAYWRkZXIgd2hlbiBjbGlja2VkXG4gICNcbiAgIyBldmVudCAtIEEgbW91c2Vkb3duIEV2ZW50IG9iamVjdFxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBvbkFkZGVyQ2xpY2s6IChldmVudCkgPT5cbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKVxuXG4gICAgIyBIaWRlIHRoZSBhZGRlclxuICAgIHBvc2l0aW9uID0gQGFkZGVyLnBvc2l0aW9uKClcbiAgICBAYWRkZXIuaGlkZSgpXG4gICAgYW5ub3RhdGlvbiA9IHtyYW5nZXM6IEBzZWxlY3RlZFJhbmdlc31cblxuICAgICQud2hlbihhbm5vdGF0aW9uKVxuXG4gICAgICAuZG9uZSAoYW5ub3RhdGlvbikgPT5cbiAgICAgICAgdGhpcy5wdWJsaXNoKCdiZWZvcmVBbm5vdGF0aW9uQ3JlYXRlZCcsIFthbm5vdGF0aW9uXSlcblxuICAgICAgIyBTZXQgdXAgdGhlIGFubm90YXRpb25cbiAgICAgIC50aGVuIChhbm5vdGF0aW9uKSA9PlxuICAgICAgICB0aGlzLnNldHVwQW5ub3RhdGlvbihhbm5vdGF0aW9uKVxuXG4gICAgICAjIFNob3cgYSB0ZW1wb3JhcnkgaGlnaGxpZ2h0IHNvIHRoZSB1c2VyIGNhbiBzZWUgd2hhdCB0aGV5IHNlbGVjdGVkXG4gICAgICAuZG9uZSAoYW5ub3RhdGlvbikgPT5cbiAgICAgICAgJChhbm5vdGF0aW9uLl9sb2NhbC5oaWdobGlnaHRzKS5hZGRDbGFzcygnYW5ub3RhdG9yLWhsLXRlbXBvcmFyeScpXG5cbiAgICAgICMgRWRpdCB0aGUgYW5ub3RhdGlvblxuICAgICAgLnRoZW4gKGFubm90YXRpb24pID0+XG4gICAgICAgIHRoaXMuZWRpdEFubm90YXRpb24oYW5ub3RhdGlvbiwgcG9zaXRpb24pXG4gICAgICAudGhlbiAoYW5ub3RhdGlvbikgPT5cbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5jcmVhdGUoYW5ub3RhdGlvbilcbiAgICAgICAgICAjIEhhbmRsZSBzdG9yYWdlIGVycm9yc1xuICAgICAgICAgIC5mYWlsKGhhbmRsZUVycm9yKVxuXG4gICAgICAjIENsZWFuIHVwIHRoZSBoaWdobGlnaHRzXG4gICAgICAuZG9uZSAoYW5ub3RhdGlvbikgPT5cbiAgICAgICAgJChhbm5vdGF0aW9uLl9sb2NhbC5oaWdobGlnaHRzKS5yZW1vdmVDbGFzcygnYW5ub3RhdG9yLWhsLXRlbXBvcmFyeScpXG5cbiAgICAgIC5kb25lIChhbm5vdGF0aW9uKSA9PlxuICAgICAgICB0aGlzLnB1Ymxpc2goJ2Fubm90YXRpb25DcmVhdGVkJywgW2Fubm90YXRpb25dKVxuXG4gICAgICAjIENsZWFuIHVwIChpZiwgZm9yIGV4YW1wbGUsIGVkaXRpbmcgd2FzIGNhbmNlbGxlZCwgb3Igc3RvcmFnZSBmYWlsZWQpXG4gICAgICAuZmFpbCh0aGlzLmNsZWFudXBBbm5vdGF0aW9uKVxuXG4gICMgQW5ub3RhdG9yI3ZpZXdlciBjYWxsYmFjayBmdW5jdGlvbi4gRGlzcGxheXMgdGhlIEFubm90YXRvciNlZGl0b3IgaW4gdGhlXG4gICMgcG9zaXRpb25zIG9mIHRoZSBBbm5vdGF0b3Ijdmlld2VyIGFuZCBsb2FkcyB0aGUgcGFzc2VkIGFubm90YXRpb24gZm9yXG4gICMgZWRpdGluZy5cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdCBmb3IgZWRpdGluZy5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgb25FZGl0QW5ub3RhdGlvbjogKGFubm90YXRpb24pID0+XG4gICAgcG9zaXRpb24gPSBAdmlld2VyLmVsZW1lbnQucG9zaXRpb24oKVxuICAgIEB2aWV3ZXIuaGlkZSgpXG5cbiAgICAkLndoZW4oYW5ub3RhdGlvbilcblxuICAgICAgLmRvbmUgKGFubm90YXRpb24pID0+XG4gICAgICAgIHRoaXMucHVibGlzaCgnYmVmb3JlQW5ub3RhdGlvblVwZGF0ZWQnLCBbYW5ub3RhdGlvbl0pXG5cbiAgICAgIC50aGVuIChhbm5vdGF0aW9uKSA9PlxuICAgICAgICB0aGlzLmVkaXRBbm5vdGF0aW9uKGFubm90YXRpb24sIHBvc2l0aW9uKVxuICAgICAgLnRoZW4gKGFubm90YXRpb24pID0+XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnMudXBkYXRlKGFubm90YXRpb24pXG4gICAgICAgICAgIyBIYW5kbGUgc3RvcmFnZSBlcnJvcnNcbiAgICAgICAgICAuZmFpbChoYW5kbGVFcnJvcilcblxuICAgICAgLmRvbmUgKGFubm90YXRpb24pID0+XG4gICAgICAgIHRoaXMucHVibGlzaCgnYW5ub3RhdGlvblVwZGF0ZWQnLCBbYW5ub3RhdGlvbl0pXG5cbiMgQ3JlYXRlIG5hbWVzcGFjZSBmb3IgQW5ub3RhdG9yIHBsdWdpbnNcbmNsYXNzIEFubm90YXRvci5QbHVnaW4gZXh0ZW5kcyBEZWxlZ2F0b3JcbiAgY29uc3RydWN0b3I6IChlbGVtZW50LCBvcHRpb25zKSAtPlxuICAgIHN1cGVyXG5cbiAgcGx1Z2luSW5pdDogLT5cblxuICBkZXN0cm95OiAtPlxuICAgIHRoaXMucmVtb3ZlRXZlbnRzKClcblxuIyBTbmlmZiB0aGUgYnJvd3NlciBlbnZpcm9ubWVudCBhbmQgYXR0ZW1wdCB0byBhZGQgbWlzc2luZyBmdW5jdGlvbmFsaXR5LlxuZyA9IFV0aWwuZ2V0R2xvYmFsKClcblxuaWYgbm90IGcuZG9jdW1lbnQ/LmV2YWx1YXRlP1xuICAkLmdldFNjcmlwdCgnaHR0cDovL2Fzc2V0cy5hbm5vdGF0ZWl0Lm9yZy92ZW5kb3IveHBhdGgubWluLmpzJylcblxuaWYgbm90IGcuZ2V0U2VsZWN0aW9uP1xuICAkLmdldFNjcmlwdCgnaHR0cDovL2Fzc2V0cy5hbm5vdGF0ZWl0Lm9yZy92ZW5kb3IvaWVyYW5nZS5taW4uanMnKVxuXG5pZiBub3QgZy5KU09OP1xuICAkLmdldFNjcmlwdCgnaHR0cDovL2Fzc2V0cy5hbm5vdGF0ZWl0Lm9yZy92ZW5kb3IvanNvbjIubWluLmpzJylcblxuIyBFbnN1cmUgdGhlIE5vZGUgY29uc3RhbnRzIGFyZSBkZWZpbmVkXG5pZiBub3QgZy5Ob2RlP1xuICBnLk5vZGUgPVxuICAgIEVMRU1FTlRfTk9ERSAgICAgICAgICAgICAgICA6ICAxXG4gICAgQVRUUklCVVRFX05PREUgICAgICAgICAgICAgIDogIDJcbiAgICBURVhUX05PREUgICAgICAgICAgICAgICAgICAgOiAgM1xuICAgIENEQVRBX1NFQ1RJT05fTk9ERSAgICAgICAgICA6ICA0XG4gICAgRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICAgIDogIDVcbiAgICBFTlRJVFlfTk9ERSAgICAgICAgICAgICAgICAgOiAgNlxuICAgIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6ICA3XG4gICAgQ09NTUVOVF9OT0RFICAgICAgICAgICAgICAgIDogIDhcbiAgICBET0NVTUVOVF9OT0RFICAgICAgICAgICAgICAgOiAgOVxuICAgIERPQ1VNRU5UX1RZUEVfTk9ERSAgICAgICAgICA6IDEwXG4gICAgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAgICAgIDogMTFcbiAgICBOT1RBVElPTl9OT0RFICAgICAgICAgICAgICAgOiAxMlxuXG5cbiMgRXhwb3J0IG90aGVyIG1vZHVsZXMgZm9yIHVzZSBpbiBwbHVnaW5zLlxuQW5ub3RhdG9yLkRlbGVnYXRvciA9IERlbGVnYXRvclxuQW5ub3RhdG9yLlJhbmdlID0gUmFuZ2VcbkFubm90YXRvci5VdGlsID0gVXRpbFxuQW5ub3RhdG9yLldpZGdldCA9IFdpZGdldFxuQW5ub3RhdG9yLlZpZXdlciA9IFZpZXdlclxuQW5ub3RhdG9yLkVkaXRvciA9IEVkaXRvclxuQW5ub3RhdG9yLk5vdGlmaWNhdGlvbiA9IE5vdGlmaWNhdGlvblxuXG4jIEF0dGFjaCBub3RpZmljYXRpb24gbWV0aG9kcyB0byB0aGUgQW5ub3RhdGlvbiBvYmplY3Rcbm5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb25cbkFubm90YXRvci5zaG93Tm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uLnNob3dcbkFubm90YXRvci5oaWRlTm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uLmhpZGVcblxuIyBFeHBvc2UgYSBnbG9iYWwgaW5zdGFuY2UgcmVnaXN0cnlcbkFubm90YXRvci5faW5zdGFuY2VzID0gW11cblxuIyBCaW5kIGdldHRleHQgaGVscGVyIHNvIHBsdWdpbnMgY2FuIHVzZSBsb2NhbGlzYXRpb24uXG5Bbm5vdGF0b3IuX3QgPSBfdFxuXG4jIFJldHVybnMgdHJ1ZSBpZiB0aGUgQW5ub3RhdG9yIGNhbiBiZSB1c2VkIGluIHRoZSBjdXJyZW50IGJyb3dzZXIuXG5Bbm5vdGF0b3Iuc3VwcG9ydGVkID0gLT4gKC0+ICEhdGhpcy5nZXRTZWxlY3Rpb24pKClcblxuIyBSZXN0b3JlcyB0aGUgQW5ub3RhdG9yIHByb3BlcnR5IG9uIHRoZSBnbG9iYWwgb2JqZWN0IHRvIGl0J3NcbiMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgdGhlIEFubm90YXRvci5cbkFubm90YXRvci5ub0NvbmZsaWN0ID0gLT5cbiAgVXRpbC5nZXRHbG9iYWwoKS5Bbm5vdGF0b3IgPSBfQW5ub3RhdG9yXG4gIHRoaXNcblxuIyBDcmVhdGUgZ2xvYmFsIGFjY2VzcyBmb3IgQW5ub3RhdG9yXG4kLmZuLmFubm90YXRvciA9IChvcHRpb25zKSAtPlxuICBhcmdzID0gQXJyYXk6OnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKVxuICB0aGlzLmVhY2ggLT5cbiAgICAjIGNoZWNrIHRoZSBkYXRhKCkgY2FjaGUsIGlmIGl0J3MgdGhlcmUgd2UnbGwgY2FsbCB0aGUgbWV0aG9kIHJlcXVlc3RlZFxuICAgIGluc3RhbmNlID0gJC5kYXRhKHRoaXMsICdhbm5vdGF0b3InKVxuICAgIGlmIGluc3RhbmNlXG4gICAgICBvcHRpb25zICYmIGluc3RhbmNlW29wdGlvbnNdLmFwcGx5KGluc3RhbmNlLCBhcmdzKVxuICAgIGVsc2VcbiAgICAgIGluc3RhbmNlID0gbmV3IEFubm90YXRvcih0aGlzLCBvcHRpb25zKVxuICAgICAgJC5kYXRhKHRoaXMsICdhbm5vdGF0b3InLCBpbnN0YW5jZSlcblxuXG4jIEV4cG9ydCBBbm5vdGF0b3Igb2JqZWN0LlxubW9kdWxlLmV4cG9ydHMgPSBBbm5vdGF0b3JcbiIsIlV0aWwgPSByZXF1aXJlICcuL3V0aWwnXG5cblxuIyBQdWJsaWM6IERlbGVnYXRvciBpcyB0aGUgYmFzZSBjbGFzcyB0aGF0IGFsbCBvZiBBbm5vdGF0b3JzIG9iamVjdHMgaW5oZXJpdFxuIyBmcm9tLiBJdCBwcm92aWRlcyBiYXNpYyBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgaW5zdGFuY2Ugb3B0aW9ucywgZXZlbnRcbiMgZGVsZWdhdGlvbiBhbmQgcHViL3N1YiBtZXRob2RzLlxuY2xhc3MgRGVsZWdhdG9yXG4gICMgUHVibGljOiBFdmVudHMgb2JqZWN0LiBUaGlzIGNvbnRhaW5zIGEga2V5L3BhaXIgaGFzaCBvZiBldmVudHMvbWV0aG9kcyB0aGF0XG4gICMgc2hvdWxkIGJlIGJvdW5kLiBTZWUgRGVsZWdhdG9yI2FkZEV2ZW50cygpIGZvciB1c2FnZS5cbiAgZXZlbnRzOiB7fVxuXG4gICMgUHVibGljOiBPcHRpb25zIG9iamVjdC4gRXh0ZW5kZWQgb24gaW5pdGlhbGlzYXRpb24uXG4gIG9wdGlvbnM6IHt9XG5cbiAgIyBBIGpRdWVyeSBvYmplY3Qgd3JhcHBpbmcgdGhlIERPTSBFbGVtZW50IHByb3ZpZGVkIG9uIGluaXRpYWxpc2F0aW9uLlxuICBlbGVtZW50OiBudWxsXG5cbiAgIyBQdWJsaWM6IENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgaW5zdGFuY2UuIEJpbmRzIHRoZSBAZXZlbnRzXG4gICMgaGFzaCBhbmQgZXh0ZW5kcyB0aGUgQG9wdGlvbnMgb2JqZWN0LlxuICAjXG4gICMgZWxlbWVudCAtIFRoZSBET00gZWxlbWVudCB0aGF0IHRoaXMgaW50YW5jZSByZXByZXNlbnRzLlxuICAjIG9wdGlvbnMgLSBBbiBPYmplY3QgbGl0ZXJhbCBvZiBvcHRpb25zLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgZWxlbWVudCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXktZWxlbWVudCcpXG4gICMgICBpbnN0YW5jZSA9IG5ldyBEZWxlZ2F0b3IoZWxlbWVudCwge1xuICAjICAgICBvcHRpb246ICdteS1vcHRpb24nXG4gICMgICB9KVxuICAjXG4gICMgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBEZWxlZ2F0b3IuXG4gIGNvbnN0cnVjdG9yOiAoZWxlbWVudCwgb3B0aW9ucykgLT5cbiAgICBAb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBAb3B0aW9ucywgb3B0aW9ucylcbiAgICBAZWxlbWVudCA9ICQoZWxlbWVudClcblxuICAgICMgRGVsZWdhdG9yIGNyZWF0ZXMgY2xvc3VyZXMgZm9yIGVhY2ggZXZlbnQgaXQgYmluZHMuIFRoaXMgaXMgYSBwcml2YXRlXG4gICAgIyByZWdpc3RyeSBvZiBjcmVhdGVkIGNsb3N1cmVzLCB1c2VkIHRvIGVuYWJsZSBldmVudCB1bmJpbmRpbmcuXG4gICAgQF9jbG9zdXJlcyA9IHt9XG5cbiAgICB0aGlzLmFkZEV2ZW50cygpXG5cbiAgIyBQdWJsaWM6IGJpbmRzIHRoZSBmdW5jdGlvbiBuYW1lcyBpbiB0aGUgQGV2ZW50cyBPYmplY3QgdG8gdGhlaXIgZXZlbnRzLlxuICAjXG4gICMgVGhlIEBldmVudHMgT2JqZWN0IHNob3VsZCBiZSBhIHNldCBvZiBrZXkvdmFsdWUgcGFpcnMgd2hlcmUgdGhlIGtleSBpcyB0aGVcbiAgIyBldmVudCBuYW1lIHdpdGggb3B0aW9uYWwgQ1NTIHNlbGVjdG9yLiBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgU3RyaW5nIG1ldGhvZFxuICAjIG5hbWUgb24gdGhlIGN1cnJlbnQgY2xhc3MuXG4gICNcbiAgIyBUaGlzIGlzIGNhbGxlZCBieSB0aGUgZGVmYXVsdCBEZWxlZ2F0b3IgY29uc3RydWN0b3IgYW5kIHNvIHNob3VsZG4ndCB1c3VhbGx5XG4gICMgbmVlZCB0byBiZSBjYWxsZWQgYnkgdGhlIHVzZXIuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIFRoaXMgd2lsbCBiaW5kIHRoZSBjbGlja2VkRWxlbWVudCgpIG1ldGhvZCB0byB0aGUgY2xpY2sgZXZlbnQgb24gQGVsZW1lbnQuXG4gICMgICBAb3B0aW9ucyA9IHtcImNsaWNrXCI6IFwiY2xpY2tlZEVsZW1lbnRcIn1cbiAgI1xuICAjICAgIyBUaGlzIHdpbGwgZGVsZWdhdGUgdGhlIHN1Ym1pdEZvcm0oKSBtZXRob2QgdG8gdGhlIHN1Ym1pdCBldmVudCBvbiB0aGVcbiAgIyAgICMgZm9ybSB3aXRoaW4gdGhlIEBlbGVtZW50LlxuICAjICAgQG9wdGlvbnMgPSB7XCJmb3JtIHN1Ym1pdFwiOiBcInN1Ym1pdEZvcm1cIn1cbiAgI1xuICAjICAgIyBUaGlzIHdpbGwgYmluZCB0aGUgdXBkYXRlQW5ub3RhdGlvblN0b3JlKCkgbWV0aG9kIHRvIHRoZSBjdXN0b21cbiAgIyAgICMgYW5ub3RhdGlvbjpzYXZlIGV2ZW50LiBOT1RFOiBCZWNhdXNlIHRoaXMgaXMgYSBjdXN0b20gZXZlbnQgdGhlXG4gICMgICAjIERlbGVnYXRvciNzdWJzY3JpYmUoKSBtZXRob2Qgd2lsbCBiZSB1c2VkIGFuZCB1cGRhdGVBbm5vdGF0aW9uU3RvcmUoKVxuICAjICAgIyB3aWxsIG5vdCByZWNpZXZlIGFuIGV2ZW50IHBhcmFtZXRlciBsaWtlIHRoZSBwcmV2aW91cyB0d28gZXhhbXBsZXMuXG4gICMgICBAb3B0aW9ucyA9IHtcImFubm90YXRpb246c2F2ZVwiOiBcInVwZGF0ZUFubm90YXRpb25TdG9yZVwifVxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBhZGRFdmVudHM6IC0+XG4gICAgZm9yIGV2ZW50IGluIERlbGVnYXRvci5fcGFyc2VFdmVudHMoQGV2ZW50cylcbiAgICAgIHRoaXMuX2FkZEV2ZW50KGV2ZW50LnNlbGVjdG9yLCBldmVudC5ldmVudCwgZXZlbnQuZnVuY3Rpb25OYW1lKVxuXG4gICMgUHVibGljOiB1bmJpbmRzIGZ1bmN0aW9ucyBwcmV2aW91c2x5IGJvdW5kIHRvIGV2ZW50cyBieSBhZGRFdmVudHMoKS5cbiAgI1xuICAjIFRoZSBAZXZlbnRzIE9iamVjdCBzaG91bGQgYmUgYSBzZXQgb2Yga2V5L3ZhbHVlIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlXG4gICMgZXZlbnQgbmFtZSB3aXRoIG9wdGlvbmFsIENTUyBzZWxlY3Rvci4gVGhlIHZhbHVlIHNob3VsZCBiZSBhIFN0cmluZyBtZXRob2RcbiAgIyBuYW1lIG9uIHRoZSBjdXJyZW50IGNsYXNzLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICByZW1vdmVFdmVudHM6IC0+XG4gICAgZm9yIGV2ZW50IGluIERlbGVnYXRvci5fcGFyc2VFdmVudHMoQGV2ZW50cylcbiAgICAgIHRoaXMuX3JlbW92ZUV2ZW50KGV2ZW50LnNlbGVjdG9yLCBldmVudC5ldmVudCwgZXZlbnQuZnVuY3Rpb25OYW1lKVxuXG4gICMgQmluZHMgYW4gZXZlbnQgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiByZXByZXNlbnRlZCBieSBhIFN0cmluZy4gQSBzZWxlY3RvclxuICAjIGNhbiBiZSBwcm92aWRlZCBpbiBvcmRlciB0byB3YXRjaCBmb3IgZXZlbnRzIG9uIGEgY2hpbGQgZWxlbWVudC5cbiAgI1xuICAjIFRoZSBldmVudCBjYW4gYmUgYW55IHN0YW5kYXJkIGV2ZW50IHN1cHBvcnRlZCBieSBqUXVlcnkgb3IgYSBjdXN0b20gU3RyaW5nLlxuICAjIElmIGEgY3VzdG9tIHN0cmluZyBpcyB1c2VkIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIG5vdCByZWNlaXZlIGFuIGV2ZW50XG4gICMgb2JqZWN0IGFzIGl0cyBmaXJzdCBwYXJhbWV0ZXIuXG4gICNcbiAgIyBzZWxlY3RvciAgICAgLSBTZWxlY3RvciBTdHJpbmcgbWF0Y2hpbmcgY2hpbGQgZWxlbWVudHMuIChkZWZhdWx0OiAnJylcbiAgIyBldmVudCAgICAgICAgLSBUaGUgZXZlbnQgdG8gbGlzdGVuIGZvci5cbiAgIyBmdW5jdGlvbk5hbWUgLSBBIFN0cmluZyBmdW5jdGlvbiBuYW1lIHRvIGJpbmQgdG8gdGhlIGV2ZW50LlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBMaXN0ZW5zIGZvciBhbGwgY2xpY2sgZXZlbnRzIG9uIGluc3RhbmNlLmVsZW1lbnQuXG4gICMgICBpbnN0YW5jZS5fYWRkRXZlbnQoJycsICdjbGljaycsICdvbkNsaWNrJylcbiAgI1xuICAjICAgIyBEZWxlZ2F0ZXMgdGhlIGluc3RhbmNlLm9uSW5wdXRGb2N1cygpIG1ldGhvZCB0byBmb2N1cyBldmVudHMgb24gYWxsXG4gICMgICAjIGZvcm0gaW5wdXRzIHdpdGhpbiBpbnN0YW5jZS5lbGVtZW50LlxuICAjICAgaW5zdGFuY2UuX2FkZEV2ZW50KCdmb3JtIDppbnB1dCcsICdmb2N1cycsICdvbklucHV0Rm9jdXMnKVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYuXG4gIF9hZGRFdmVudDogKHNlbGVjdG9yLCBldmVudCwgZnVuY3Rpb25OYW1lKSAtPlxuICAgIGNsb3N1cmUgPSA9PiB0aGlzW2Z1bmN0aW9uTmFtZV0uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG4gICAgaWYgc2VsZWN0b3IgPT0gJycgYW5kIERlbGVnYXRvci5faXNDdXN0b21FdmVudChldmVudClcbiAgICAgIHRoaXMuc3Vic2NyaWJlKGV2ZW50LCBjbG9zdXJlKVxuICAgIGVsc2VcbiAgICAgIEBlbGVtZW50LmRlbGVnYXRlKHNlbGVjdG9yLCBldmVudCwgY2xvc3VyZSlcblxuICAgIEBfY2xvc3VyZXNbXCIje3NlbGVjdG9yfS8je2V2ZW50fS8je2Z1bmN0aW9uTmFtZX1cIl0gPSBjbG9zdXJlXG5cbiAgICB0aGlzXG5cbiAgIyBVbmJpbmRzIGEgZnVuY3Rpb24gcHJldmlvdXNseSBib3VuZCB0byBhbiBldmVudCBieSB0aGUgX2FkZEV2ZW50IG1ldGhvZC5cbiAgI1xuICAjIFRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBfYWRkRXZlbnQoKSwgYW5kIGFuIGV2ZW50IHdpbGwgb25seSBiZVxuICAjIHN1Y2Nlc3NmdWxseSB1bmJvdW5kIGlmIHRoZSBhcmd1bWVudHMgdG8gcmVtb3ZlRXZlbnQoKSBhcmUgZXhhY3RseSB0aGUgc2FtZVxuICAjIGFzIHRoZSBvcmlnaW5hbCBhcmd1bWVudHMgdG8gX2FkZEV2ZW50KCkuIFRoaXMgd291bGQgdXN1YWxseSBiZSBjYWxsZWQgYnlcbiAgIyBfcmVtb3ZlRXZlbnRzKCkuXG4gICNcbiAgIyBzZWxlY3RvciAgICAgLSBTZWxlY3RvciBTdHJpbmcgbWF0Y2hpbmcgY2hpbGQgZWxlbWVudHMuIChkZWZhdWx0OiAnJylcbiAgIyBldmVudCAgICAgICAgLSBUaGUgZXZlbnQgdG8gbGlzdGVuIGZvci5cbiAgIyBmdW5jdGlvbk5hbWUgLSBBIFN0cmluZyBmdW5jdGlvbiBuYW1lIHRvIGJpbmQgdG8gdGhlIGV2ZW50LlxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYuXG4gIF9yZW1vdmVFdmVudDogKHNlbGVjdG9yLCBldmVudCwgZnVuY3Rpb25OYW1lKSAtPlxuICAgIGNsb3N1cmUgPSBAX2Nsb3N1cmVzW1wiI3tzZWxlY3Rvcn0vI3tldmVudH0vI3tmdW5jdGlvbk5hbWV9XCJdXG5cbiAgICBpZiBzZWxlY3RvciA9PSAnJyBhbmQgRGVsZWdhdG9yLl9pc0N1c3RvbUV2ZW50KGV2ZW50KVxuICAgICAgdGhpcy51bnN1YnNjcmliZShldmVudCwgY2xvc3VyZSlcbiAgICBlbHNlXG4gICAgICBAZWxlbWVudC51bmRlbGVnYXRlKHNlbGVjdG9yLCBldmVudCwgY2xvc3VyZSlcblxuICAgIGRlbGV0ZSBAX2Nsb3N1cmVzW1wiI3tzZWxlY3Rvcn0vI3tldmVudH0vI3tmdW5jdGlvbk5hbWV9XCJdXG5cbiAgICB0aGlzXG5cbiAgIyBQdWJsaWM6IEZpcmVzIGFuIGV2ZW50IGFuZCBjYWxscyBhbGwgc3Vic2NyaWJlZCBjYWxsYmFja3Mgd2l0aCBwYXJhbWV0ZXJzXG4gICMgcHJvdmlkZWQuIFRoaXMgaXMgZXNzZW50aWFsbHkgYW4gYWxpYXMgdG8gQmFja2JvbmUuRXZlbnRzIC50cmlnZ2VyKClcbiAgIyBleGNlcHQgdGhhdCB0aGUgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gYW4gQXJyYXkgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAgIyByYXRoZXIgdGhhbiB1c2luZyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuXG4gIHB1Ymxpc2g6IChuYW1lLCBhcmdzPVtdKSAtPlxuICAgIHRoaXMudHJpZ2dlci5hcHBseSh0aGlzLCBbbmFtZSwgYXJncy4uLl0pXG5cbiAgIyBQdWJsaWM6IEFuIGFsaWFzIGZvciAub24oKSBmcm9tIEJhY2tib25lLkV2ZW50c1xuICBzdWJzY3JpYmU6IChldmVudCwgY2FsbGJhY2ssIGNvbnRleHQ9dGhpcykgLT5cbiAgICB0aGlzLm9uKGV2ZW50LCBjYWxsYmFjaywgY29udGV4dClcblxuICAjIFB1YmxpYzogQW4gYWxpYXMgZm9yIC5vZmYoKSBmcm9tIEJhY2tib25lLkV2ZW50c1xuICB1bnN1YnNjcmliZTogKGV2ZW50LCBjYWxsYmFjaywgY29udGV4dD10aGlzKSAtPlxuICAgIHRoaXMub2ZmKGV2ZW50LCBjYWxsYmFjaywgY29udGV4dClcblxuXG4jIFBhcnNlIHRoZSBAZXZlbnRzIG9iamVjdCBvZiBhIERlbGVnYXRvciBpbnRvIGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZ1xuIyBzdHJpbmctdmFsdWVkIFwic2VsZWN0b3JcIiwgXCJldmVudFwiLCBhbmQgXCJmdW5jXCIga2V5cy5cbkRlbGVnYXRvci5fcGFyc2VFdmVudHMgPSAoZXZlbnRzT2JqKSAtPlxuICAgIGV2ZW50cyA9IFtdXG4gICAgZm9yIHNlbCwgZnVuY3Rpb25OYW1lIG9mIGV2ZW50c09ialxuICAgICAgW3NlbGVjdG9yLi4uLCBldmVudF0gPSBzZWwuc3BsaXQgJyAnXG4gICAgICBldmVudHMucHVzaCh7XG4gICAgICAgIHNlbGVjdG9yOiBzZWxlY3Rvci5qb2luKCcgJyksXG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWVcbiAgICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50c1xuXG5cbiMgTmF0aXZlIGpRdWVyeSBldmVudHMgdGhhdCBzaG91bGQgcmVjaWV2ZSBhbiBldmVudCBvYmplY3QuIFBsdWdpbnMgY2FuXG4jIGFkZCB0aGVpciBvd24gbWV0aG9kcyB0byB0aGlzIGlmIHJlcXVpcmVkLlxuRGVsZWdhdG9yLm5hdGl2ZXMgPSBkbyAtPlxuICBzcGVjaWFscyA9IChrZXkgZm9yIG93biBrZXksIHZhbCBvZiAkLmV2ZW50LnNwZWNpYWwpXG4gIFwiXCJcIlxuICBibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGlja1xuICBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZVxuICBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yXG4gIFwiXCJcIi5zcGxpdCgvW15hLXpdKy8pLmNvbmNhdChzcGVjaWFscylcblxuXG4jIENoZWNrcyB0byBzZWUgaWYgdGhlIHByb3ZpZGVkIGV2ZW50IGlzIGEgRE9NIGV2ZW50IHN1cHBvcnRlZCBieSBqUXVlcnkgb3JcbiMgYSBjdXN0b20gdXNlciBldmVudC5cbiNcbiMgZXZlbnQgLSBTdHJpbmcgZXZlbnQgbmFtZS5cbiNcbiMgRXhhbXBsZXNcbiNcbiMgICBEZWxlZ2F0b3IuX2lzQ3VzdG9tRXZlbnQoJ2NsaWNrJykgICAgICAgICAgICAgICMgPT4gZmFsc2VcbiMgICBEZWxlZ2F0b3IuX2lzQ3VzdG9tRXZlbnQoJ21vdXNlZG93bicpICAgICAgICAgICMgPT4gZmFsc2VcbiMgICBEZWxlZ2F0b3IuX2lzQ3VzdG9tRXZlbnQoJ2Fubm90YXRpb246Y3JlYXRlZCcpICMgPT4gdHJ1ZVxuI1xuIyBSZXR1cm5zIHRydWUgaWYgZXZlbnQgaXMgYSBjdXN0b20gdXNlciBldmVudC5cbkRlbGVnYXRvci5faXNDdXN0b21FdmVudCA9IChldmVudCkgLT5cbiAgW2V2ZW50XSA9IGV2ZW50LnNwbGl0KCcuJylcbiAgJC5pbkFycmF5KGV2ZW50LCBEZWxlZ2F0b3IubmF0aXZlcykgPT0gLTFcblxuXG4jIE1peCBpbiBiYWNrYm9uZSBldmVudHNcbkJhY2tib25lRXZlbnRzID0gcmVxdWlyZSAnYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmUnXG5CYWNrYm9uZUV2ZW50cy5taXhpbihEZWxlZ2F0b3I6OilcblxuIyBFeHBvcnQgRGVsZWdhdG9yIG9iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBEZWxlZ2F0b3JcbiIsIlV0aWwgPSByZXF1aXJlICcuL3V0aWwnXG5XaWRnZXQgPSByZXF1aXJlICcuL3dpZGdldCdcblxuXG5fdCA9IFV0aWwuVHJhbnNsYXRpb25TdHJpbmdcblxuXG4jIFB1YmxpYzogQ3JlYXRlcyBhbiBlbGVtZW50IGZvciBlZGl0aW5nIGFubm90YXRpb25zLlxuY2xhc3MgRWRpdG9yIGV4dGVuZHMgV2lkZ2V0XG5cbiAgIyBFdmVudHMgdG8gYmUgYm91bmQgdG8gQGVsZW1lbnQuXG4gIGV2ZW50czpcbiAgICBcImZvcm0gc3VibWl0XCI6ICAgICAgICAgICAgICAgICBcInN1Ym1pdFwiXG4gICAgXCIuYW5ub3RhdG9yLXNhdmUgY2xpY2tcIjogICAgICAgXCJzdWJtaXRcIlxuICAgIFwiLmFubm90YXRvci1jYW5jZWwgY2xpY2tcIjogICAgIFwiaGlkZVwiXG4gICAgXCIuYW5ub3RhdG9yLWNhbmNlbCBtb3VzZW92ZXJcIjogXCJvbkNhbmNlbEJ1dHRvbk1vdXNlb3ZlclwiXG4gICAgXCJ0ZXh0YXJlYSBrZXlkb3duXCI6ICAgICAgICAgICAgXCJwcm9jZXNzS2V5cHJlc3NcIlxuXG4gICMgQ2xhc3NlcyB0byB0b2dnbGUgc3RhdGUuXG4gIGNsYXNzZXM6XG4gICAgaGlkZTogICdhbm5vdGF0b3ItaGlkZSdcbiAgICBmb2N1czogJ2Fubm90YXRvci1mb2N1cydcblxuICAjIEhUTUwgdGVtcGxhdGUgZm9yIEBlbGVtZW50LlxuICBodG1sOiBcIlwiXCJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFubm90YXRvci1vdXRlciBhbm5vdGF0b3ItZWRpdG9yXCI+XG4gICAgICAgICAgPGZvcm0gY2xhc3M9XCJhbm5vdGF0b3Itd2lkZ2V0XCI+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJhbm5vdGF0b3ItbGlzdGluZ1wiPjwvdWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5ub3RhdG9yLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgIDxhIGhyZWY9XCIjY2FuY2VsXCIgY2xhc3M9XCJhbm5vdGF0b3ItY2FuY2VsXCI+XCJcIlwiICsgX3QoJ0NhbmNlbCcpICsgXCJcIlwiPC9hPlxuICAgICAgICAgICAgICA8YSBocmVmPVwiI3NhdmVcIiBjbGFzcz1cImFubm90YXRvci1zYXZlIGFubm90YXRvci1mb2N1c1wiPlwiXCJcIiArIF90KCdTYXZlJykgKyBcIlwiXCI8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcIlwiXCJcblxuICBvcHRpb25zOiB7fSAjIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuXG4gICMgUHVibGljOiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBFZGl0b3Igb2JqZWN0LiBUaGlzIHdpbGwgY3JlYXRlIHRoZVxuICAjIEBlbGVtZW50IGZyb20gdGhlIEBodG1sIHN0cmluZyBhbmQgc2V0IHVwIGFsbCBldmVudHMuXG4gICNcbiAgIyBvcHRpb25zIC0gQW4gT2JqZWN0IGxpdGVyYWwgY29udGFpbmluZyBvcHRpb25zLiBUaGVyZSBhcmUgY3VycmVudGx5IG5vXG4gICMgICAgICAgICAgIG9wdGlvbnMgaW1wbGVtZW50ZWQuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIENyZWF0ZXMgYSBuZXcgZWRpdG9yLCBhZGRzIGEgY3VzdG9tIGZpZWxkIGFuZFxuICAjICAgIyBsb2FkcyBhbiBhbm5vdGF0aW9uIGZvciBlZGl0aW5nLlxuICAjICAgZWRpdG9yID0gbmV3IEFubm90YXRvci5FZGl0b3JcbiAgIyAgIGVkaXRvci5hZGRGaWVsZCh7XG4gICMgICAgIGxhYmVsOiAnTXkgY3VzdG9tIGlucHV0IGZpZWxkJyxcbiAgIyAgICAgdHlwZTogICd0ZXh0YXJlYSdcbiAgIyAgICAgbG9hZDogIHNvbWVMb2FkQ2FsbGJhY2tcbiAgIyAgICAgc2F2ZTogIHNvbWVTYXZlQ2FsbGJhY2tcbiAgIyAgIH0pXG4gICMgICBlZGl0b3IubG9hZChhbm5vdGF0aW9uKVxuICAjXG4gICMgUmV0dXJucyBhIG5ldyBFZGl0b3IgaW5zdGFuY2UuXG4gIGNvbnN0cnVjdG9yOiAob3B0aW9ucykgLT5cbiAgICBzdXBlciAkKEBodG1sKVswXSwgb3B0aW9uc1xuXG4gICAgQGZpZWxkcyA9IFtdXG4gICAgQGFubm90YXRpb24gPSB7fVxuXG4gICMgUHVibGljOiBEaXNwbGF5cyB0aGUgRWRpdG9yIGFuZCBmaXJlcyBhIFwic2hvd1wiIGV2ZW50LlxuICAjIENhbiBiZSB1c2VkIGFzIGFuIGV2ZW50IGNhbGxiYWNrIGFuZCB3aWxsIGNhbGwgRXZlbnQjcHJldmVudERlZmF1bHQoKVxuICAjIG9uIHRoZSBzdXBwbGllZCBldmVudC5cbiAgI1xuICAjIGV2ZW50IC0gRXZlbnQgb2JqZWN0IHByb3ZpZGVkIGlmIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnRcbiAgIyAgICAgICAgIGxpc3RlbmVyIChkZWZhdWx0OnVuZGVmaW5lZClcbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgRGlzcGxheXMgdGhlIGVkaXRvci5cbiAgIyAgIGVkaXRvci5zaG93KClcbiAgI1xuICAjICAgIyBEaXNwbGF5cyB0aGUgZWRpdG9yIG9uIGNsaWNrIChwcmV2ZW50cyBkZWZhdWx0IGFjdGlvbikuXG4gICMgICAkKCdhLnNob3ctZWRpdG9yJykuYmluZCgnY2xpY2snLCBlZGl0b3Iuc2hvdylcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmLlxuICBzaG93OiAoZXZlbnQpID0+XG4gICAgVXRpbC5wcmV2ZW50RXZlbnREZWZhdWx0IGV2ZW50XG5cbiAgICBAZWxlbWVudC5yZW1vdmVDbGFzcyhAY2xhc3Nlcy5oaWRlKVxuICAgIEBlbGVtZW50LmZpbmQoJy5hbm5vdGF0b3Itc2F2ZScpLmFkZENsYXNzKEBjbGFzc2VzLmZvY3VzKVxuXG4gICAgIyBpbnZlcnQgaWYgbmVjZXNzYXJ5XG4gICAgdGhpcy5jaGVja09yaWVudGF0aW9uKClcblxuICAgICMgZ2l2ZSBtYWluIHRleHRhcmVhIGZvY3VzXG4gICAgQGVsZW1lbnQuZmluZChcIjppbnB1dDpmaXJzdFwiKS5mb2N1cygpXG5cbiAgICB0aGlzLnNldHVwRHJhZ2dhYmxlcygpXG5cbiAgICB0aGlzLnB1Ymxpc2goJ3Nob3cnKVxuXG5cbiAgIyBQdWJsaWM6IEhpZGVzIHRoZSBFZGl0b3IgYW5kIGZpcmVzIGEgXCJoaWRlXCIgZXZlbnQuIENhbiBiZSB1c2VkIGFzIGFuIGV2ZW50XG4gICMgY2FsbGJhY2sgYW5kIHdpbGwgY2FsbCBFdmVudCNwcmV2ZW50RGVmYXVsdCgpIG9uIHRoZSBzdXBwbGllZCBldmVudC5cbiAgI1xuICAjIGV2ZW50IC0gRXZlbnQgb2JqZWN0IHByb3ZpZGVkIGlmIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnRcbiAgIyAgICAgICAgIGxpc3RlbmVyIChkZWZhdWx0OnVuZGVmaW5lZClcbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgSGlkZXMgdGhlIGVkaXRvci5cbiAgIyAgIGVkaXRvci5oaWRlKClcbiAgI1xuICAjICAgIyBIaWRlIHRoZSBlZGl0b3Igb24gY2xpY2sgKHByZXZlbnRzIGRlZmF1bHQgYWN0aW9uKS5cbiAgIyAgICQoJ2EuaGlkZS1lZGl0b3InKS5iaW5kKCdjbGljaycsIGVkaXRvci5oaWRlKVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYuXG4gIGhpZGU6IChldmVudCkgPT5cbiAgICBVdGlsLnByZXZlbnRFdmVudERlZmF1bHQgZXZlbnRcblxuICAgIEBlbGVtZW50LmFkZENsYXNzKEBjbGFzc2VzLmhpZGUpXG4gICAgdGhpcy5wdWJsaXNoKCdoaWRlJylcblxuICAjIFB1YmxpYzogTG9hZHMgYW4gYW5ub3RhdGlvbiBpbnRvIHRoZSBFZGl0b3IgYW5kIGRpc3BsYXlzIGl0IHNldHRpbmdcbiAgIyBFZGl0b3IjYW5ub3RhdGlvbiB0byB0aGUgcHJvdmlkZWQgYW5ub3RhdGlvbi4gSXQgZmlyZXMgdGhlIFwibG9hZFwiIGV2ZW50XG4gICMgcHJvdmlkaW5nIHRoZSBjdXJyZW50IGFubm90YXRpb24gc3Vic2NyaWJlcnMgY2FuIG1vZGlmeSB0aGUgYW5ub3RhdGlvblxuICAjIGJlZm9yZSBpdCB1cGRhdGVzIHRoZSBlZGl0b3IgZmllbGRzLlxuICAjXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gT2JqZWN0IHRvIGRpc3BsYXkgZm9yIGVkaXRpbmcuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIERpcGxheXMgdGhlIGVkaXRvciB3aXRoIHRoZSBhbm5vdGF0aW9uIGxvYWRlZC5cbiAgIyAgIGVkaXRvci5sb2FkKHt0ZXh0OiAnTXkgQW5ub3RhdGlvbid9KVxuICAjXG4gICMgICBlZGl0b3Iub24oJ2xvYWQnLCAoYW5ub3RhdGlvbikgLT5cbiAgIyAgICAgY29uc29sZS5sb2cgYW5ub3RhdGlvbi50ZXh0XG4gICMgICApLmxvYWQoe3RleHQ6ICdNeSBBbm5vdGF0aW9uJ30pXG4gICMgICAjID0+IE91dHB1dHMgXCJNeSBBbm5vdGF0aW9uXCJcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmLlxuICBsb2FkOiAoYW5ub3RhdGlvbikgPT5cbiAgICBAYW5ub3RhdGlvbiA9IGFubm90YXRpb25cblxuICAgIHRoaXMucHVibGlzaCgnbG9hZCcsIFtAYW5ub3RhdGlvbl0pXG5cbiAgICBmb3IgZmllbGQgaW4gQGZpZWxkc1xuICAgICAgZmllbGQubG9hZChmaWVsZC5lbGVtZW50LCBAYW5ub3RhdGlvbilcblxuICAgIHRoaXMuc2hvdygpXG5cbiAgIyBQdWJsaWM6IEhpZGVzIHRoZSBFZGl0b3IgYW5kIHBhc3NlcyB0aGUgYW5ub3RhdGlvbiB0byBhbGwgcmVnaXN0ZXJlZCBmaWVsZHNcbiAgIyBzbyB0aGV5IGNhbiB1cGRhdGUgaXRzIHN0YXRlLiBJdCB0aGVuIGZpcmVzIHRoZSBcInNhdmVcIiBldmVudCBzbyB0aGF0IG90aGVyXG4gICMgcGFydGllcyBjYW4gZnVydGhlciBtb2RpZnkgdGhlIGFubm90YXRpb24uXG4gICMgQ2FuIGJlIHVzZWQgYXMgYW4gZXZlbnQgY2FsbGJhY2sgYW5kIHdpbGwgY2FsbCBFdmVudCNwcmV2ZW50RGVmYXVsdCgpIG9uIHRoZVxuICAjIHN1cHBsaWVkIGV2ZW50LlxuICAjXG4gICMgZXZlbnQgLSBFdmVudCBvYmplY3QgcHJvdmlkZWQgaWYgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudFxuICAjICAgICAgICAgbGlzdGVuZXIgKGRlZmF1bHQ6dW5kZWZpbmVkKVxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBTdWJtaXRzIHRoZSBlZGl0b3IuXG4gICMgICBlZGl0b3Iuc3VibWl0KClcbiAgI1xuICAjICAgIyBTdWJtaXRzIHRoZSBlZGl0b3Igb24gY2xpY2sgKHByZXZlbnRzIGRlZmF1bHQgYWN0aW9uKS5cbiAgIyAgICQoJ2J1dHRvbi5zdWJtaXQtZWRpdG9yJykuYmluZCgnY2xpY2snLCBlZGl0b3Iuc3VibWl0KVxuICAjXG4gICMgICAjIEFwcGVuZHMgXCJDb21tZW50OiBcIiB0byB0aGUgYW5ub3RhdGlvbiBjb21tZW50IHRleHQuXG4gICMgICBlZGl0b3Iub24oJ3NhdmUnLCAoYW5ub3RhdGlvbikgLT5cbiAgIyAgICAgYW5ub3RhdGlvbi50ZXh0ID0gXCJDb21tZW50OiBcIiArIGFubm90YXRpb24udGV4dFxuICAjICAgKS5zdWJtaXQoKVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYuXG4gIHN1Ym1pdDogKGV2ZW50KSA9PlxuICAgIFV0aWwucHJldmVudEV2ZW50RGVmYXVsdCBldmVudFxuXG4gICAgZm9yIGZpZWxkIGluIEBmaWVsZHNcbiAgICAgIGZpZWxkLnN1Ym1pdChmaWVsZC5lbGVtZW50LCBAYW5ub3RhdGlvbilcblxuICAgIHRoaXMucHVibGlzaCgnc2F2ZScsIFtAYW5ub3RhdGlvbl0pXG5cbiAgICB0aGlzLmhpZGUoKVxuXG4gICMgUHVibGljOiBBZGRzIGFuIGFkZGlvbmFsIGZvcm0gZmllbGQgdG8gdGhlIGVkaXRvci4gQ2FsbGJhY2tzIGNhbiBiZSBwcm92aWRlZFxuICAjIHRvIHVwZGF0ZSB0aGUgdmlldyBhbmQgYW5vdGF0aW9ucyBvbiBsb2FkIGFuZCBzdWJtaXNzaW9uLlxuICAjXG4gICMgb3B0aW9ucyAtIEFuIG9wdGlvbnMgT2JqZWN0LiBPcHRpb25zIGFyZSBhcyBmb2xsb3dzOlxuICAjICAgICAgICAgICBpZCAgICAgLSBBIHVuaXF1ZSBpZCBmb3IgdGhlIGZvcm0gZWxlbWVudCB3aWxsIGFsc28gYmUgc2V0IGFzIHRoZVxuICAjICAgICAgICAgICAgICAgICAgICBcImZvclwiIGF0dHJ1YnV0ZSBvZiBhIGxhYmVsIGlmIHRoZXJlIGlzIG9uZS4gRGVmYXVsdHMgdG9cbiAgIyAgICAgICAgICAgICAgICAgICAgYSB0aW1lc3RhbXAuIChkZWZhdWx0OiBcImFubm90YXRvci1maWVsZC17dGltZXN0YW1wfVwiKVxuICAjICAgICAgICAgICB0eXBlICAgLSBJbnB1dCB0eXBlIFN0cmluZy4gT25lIG9mIFwiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLFxuICAjICAgICAgICAgICAgICAgICAgICBcImNoZWNrYm94XCIsIFwic2VsZWN0XCIgKGRlZmF1bHQ6IFwiaW5wdXRcIilcbiAgIyAgICAgICAgICAgbGFiZWwgIC0gTGFiZWwgdG8gZGlzcGxheSBlaXRoZXIgaW4gYSBsYWJlbCBFbGVtZW50IG9yIGFzIHBsYWNlLVxuICAjICAgICAgICAgICAgICAgICAgICBob2xkZXIgdGV4dCBkZXBlbmRpbmcgb24gdGhlIHR5cGUuIChkZWZhdWx0OiBcIlwiKVxuICAjICAgICAgICAgICBsb2FkICAgLSBDYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgZWRpdG9yIGlzIGxvYWRlZCB3aXRoIGFcbiAgIyAgICAgICAgICAgICAgICAgICAgbmV3IGFubm90YXRpb24uIFJlY2lldmVzIHRoZSBmaWVsZCA8bGk+IGVsZW1lbnQgYW5kIHRoZVxuICAjICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uIHRvIGJlIGxvYWRlZC5cbiAgIyAgICAgICAgICAgc3VibWl0IC0gQ2FsbGJhY2sgRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBzdWJtaXR0ZWQuXG4gICMgICAgICAgICAgICAgICAgICAgIFJlY2lldmVzIHRoZSBmaWVsZCA8bGk+IGVsZW1lbnQgYW5kIHRoZSBhbm5vdGF0aW9uIHRvIGJlXG4gICMgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIEFkZCBhIG5ldyBpbnB1dCBlbGVtZW50LlxuICAjICAgZWRpdG9yLmFkZEZpZWxkKHtcbiAgIyAgICAgbGFiZWw6IFwiVGFnc1wiLFxuICAjXG4gICMgICAgICMgVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgZWRpdG9yIGlzIGxvYWRlZCB1c2UgaXQgdG8gdXBkYXRlIHlvdXIgaW5wdXQuXG4gICMgICAgIGxvYWQ6IChmaWVsZCwgYW5ub3RhdGlvbikgLT5cbiAgIyAgICAgICAjIERvIHNvbWV0aGluZyB3aXRoIHRoZSBhbm5vdGF0aW9uLlxuICAjICAgICAgIHZhbHVlID0gZ2V0VGFnU3RyaW5nKGFubm90YXRpb24udGFncylcbiAgIyAgICAgICAkKGZpZWxkKS5maW5kKCdpbnB1dCcpLnZhbCh2YWx1ZSlcbiAgI1xuICAjICAgICAjIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBzdWJtaXR0ZWQgdXNlIGl0IHRvIHJldHJpZXZlIGRhdGFcbiAgIyAgICAgIyBmcm9tIHlvdXIgaW5wdXQgYW5kIHNhdmUgaXQgdG8gdGhlIGFubm90YXRpb24uXG4gICMgICAgIHN1Ym1pdDogKGZpZWxkLCBhbm5vdGF0aW9uKSAtPlxuICAjICAgICAgIHZhbHVlID0gJChmaWVsZCkuZmluZCgnaW5wdXQnKS52YWwoKVxuICAjICAgICAgIGFubm90YXRpb24udGFncyA9IGdldFRhZ3NGcm9tU3RyaW5nKHZhbHVlKVxuICAjICAgfSlcbiAgI1xuICAjICAgIyBBZGQgYSBuZXcgY2hlY2tib3ggZWxlbWVudC5cbiAgIyAgIGVkaXRvci5hZGRGaWVsZCh7XG4gICMgICAgIHR5cGU6ICdjaGVja2JveCcsXG4gICMgICAgIGlkOiAnYW5ub3RhdG9yLWZpZWxkLW15LWNoZWNrYm94JyxcbiAgIyAgICAgbGFiZWw6ICdBbGxvdyBhbnlvbmUgdG8gc2VlIHRoaXMgYW5ub3RhdGlvbicsXG4gICMgICAgIGxvYWQ6IChmaWVsZCwgYW5ub3RhdGlvbikgLT5cbiAgIyAgICAgICAjIENoZWNrIHdoYXQgc3RhdGUgb2YgaW5wdXQgc2hvdWxkIGJlLlxuICAjICAgICAgIGlmIGNoZWNrZWRcbiAgIyAgICAgICAgICQoZmllbGQpLmZpbmQoJ2lucHV0JykuYXR0cignY2hlY2tlZCcsICdjaGVja2VkJylcbiAgIyAgICAgICBlbHNlXG4gICMgICAgICAgICAkKGZpZWxkKS5maW5kKCdpbnB1dCcpLnJlbW92ZUF0dHIoJ2NoZWNrZWQnKVxuXG4gICMgICAgIHN1Ym1pdDogKGZpZWxkLCBhbm5vdGF0aW9uKSAtPlxuICAjICAgICAgIGNoZWNrZWQgPSAkKGZpZWxkKS5maW5kKCdpbnB1dCcpLmlzKCc6Y2hlY2tlZCcpXG4gICMgICAgICAgIyBEbyBzb21ldGhpbmcuXG4gICMgICB9KVxuICAjXG4gICMgUmV0dXJucyB0aGUgY3JlYXRlZCA8bGk+IEVsZW1lbnQuXG4gIGFkZEZpZWxkOiAob3B0aW9ucykgLT5cbiAgICBmaWVsZCA9ICQuZXh0ZW5kKHtcbiAgICAgIGlkOiAgICAgJ2Fubm90YXRvci1maWVsZC0nICsgVXRpbC51dWlkKClcbiAgICAgIHR5cGU6ICAgJ2lucHV0J1xuICAgICAgbGFiZWw6ICAnJ1xuICAgICAgbG9hZDogICAtPlxuICAgICAgc3VibWl0OiAtPlxuICAgIH0sIG9wdGlvbnMpXG5cbiAgICBpbnB1dCA9IG51bGxcbiAgICBlbGVtZW50ID0gJCgnPGxpIGNsYXNzPVwiYW5ub3RhdG9yLWl0ZW1cIiAvPicpXG4gICAgZmllbGQuZWxlbWVudCA9IGVsZW1lbnRbMF1cblxuICAgIHN3aXRjaCAoZmllbGQudHlwZSlcbiAgICAgIHdoZW4gJ3RleHRhcmVhJyAgICAgICAgICB0aGVuIGlucHV0ID0gJCgnPHRleHRhcmVhIC8+JylcbiAgICAgIHdoZW4gJ2lucHV0JywgJ2NoZWNrYm94JyB0aGVuIGlucHV0ID0gJCgnPGlucHV0IC8+JylcbiAgICAgIHdoZW4gJ3NlbGVjdCcgdGhlbiBpbnB1dCA9ICQoJzxzZWxlY3QgLz4nKVxuXG4gICAgZWxlbWVudC5hcHBlbmQoaW5wdXQpXG5cbiAgICBpbnB1dC5hdHRyKHtcbiAgICAgIGlkOiBmaWVsZC5pZFxuICAgICAgcGxhY2Vob2xkZXI6IGZpZWxkLmxhYmVsXG4gICAgfSlcblxuICAgIGlmIGZpZWxkLnR5cGUgPT0gJ2NoZWNrYm94J1xuICAgICAgaW5wdXRbMF0udHlwZSA9ICdjaGVja2JveCdcbiAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoJ2Fubm90YXRvci1jaGVja2JveCcpXG4gICAgICBlbGVtZW50LmFwcGVuZCgkKCc8bGFiZWwgLz4nLCB7Zm9yOiBmaWVsZC5pZCwgaHRtbDogZmllbGQubGFiZWx9KSlcblxuICAgIEBlbGVtZW50LmZpbmQoJ3VsOmZpcnN0JykuYXBwZW5kKGVsZW1lbnQpXG5cbiAgICBAZmllbGRzLnB1c2ggZmllbGRcblxuICAgIGZpZWxkLmVsZW1lbnRcblxuICBjaGVja09yaWVudGF0aW9uOiAtPlxuICAgIHN1cGVyXG5cbiAgICBsaXN0ID0gQGVsZW1lbnQuZmluZCgndWwnKVxuICAgIGNvbnRyb2xzID0gQGVsZW1lbnQuZmluZCgnLmFubm90YXRvci1jb250cm9scycpXG5cbiAgICBpZiBAZWxlbWVudC5oYXNDbGFzcyhAY2xhc3Nlcy5pbnZlcnQueSlcbiAgICAgIGNvbnRyb2xzLmluc2VydEJlZm9yZShsaXN0KVxuICAgIGVsc2UgaWYgY29udHJvbHMuaXMoJzpmaXJzdC1jaGlsZCcpXG4gICAgICBjb250cm9scy5pbnNlcnRBZnRlcihsaXN0KVxuXG4gICAgdGhpc1xuXG4gICMgRXZlbnQgY2FsbGJhY2suIExpc3RlbnMgZm9yIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBrZXlwcmVzc2VzLlxuICAjIC0gZXNjYXBlOiBIaWRlcyB0aGUgZWRpdG9yXG4gICMgLSBlbnRlcjogIFN1Ym1pdHMgdGhlIGVkaXRvclxuICAjXG4gICMgZXZlbnQgLSBBIGtleWRvd24gRXZlbnQgb2JqZWN0LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nXG4gIHByb2Nlc3NLZXlwcmVzczogKGV2ZW50KSA9PlxuICAgIGlmIGV2ZW50LmtleUNvZGUgaXMgMjcgIyBcIkVzY2FwZVwiIGtleSA9PiBhYm9ydC5cbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgZWxzZSBpZiBldmVudC5rZXlDb2RlIGlzIDEzIGFuZCAhZXZlbnQuc2hpZnRLZXlcbiAgICAgICMgSWYgXCJyZXR1cm5cIiB3YXMgcHJlc3NlZCB3aXRob3V0IHRoZSBzaGlmdCBrZXksIHdlJ3JlIGRvbmUuXG4gICAgICB0aGlzLnN1Ym1pdCgpXG5cbiAgIyBFdmVudCBjYWxsYmFjay4gUmVtb3ZlcyB0aGUgZm9jdXMgY2xhc3MgZnJvbSB0aGUgc3VibWl0IGJ1dHRvbiB3aGVuIHRoZVxuICAjIGNhbmNlbCBidXR0b24gaXMgaG92ZXJlZC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZ1xuICBvbkNhbmNlbEJ1dHRvbk1vdXNlb3ZlcjogPT5cbiAgICBAZWxlbWVudC5maW5kKCcuJyArIEBjbGFzc2VzLmZvY3VzKS5yZW1vdmVDbGFzcyhAY2xhc3Nlcy5mb2N1cylcblxuICAjIFNldHMgdXAgbW91c2UgZXZlbnRzIGZvciByZXNpemluZyBhbmQgZHJhZ2dpbmcgdGhlIGVkaXRvciB3aW5kb3cuXG4gICMgd2luZG93IGV2ZW50cyBhcmUgYm91bmQgb25seSB3aGVuIG5lZWRlZCBhbmQgdGhyb3R0bGVkIHRvIG9ubHkgdXBkYXRlXG4gICMgdGhlIHBvc2l0aW9ucyBhdCBtb3N0IDYwIHRpbWVzIGEgc2Vjb25kLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBzZXR1cERyYWdnYWJsZXM6ICgpIC0+XG4gICAgQGVsZW1lbnQuZmluZCgnLmFubm90YXRvci1yZXNpemUnKS5yZW1vdmUoKVxuXG4gICAgIyBGaW5kIHRoZSBmaXJzdC9sYXN0IGl0ZW0gZWxlbWVudCBkZXBlbmRpbmcgb24gb3JpZW50YXRpb25cbiAgICBpZiBAZWxlbWVudC5oYXNDbGFzcyhAY2xhc3Nlcy5pbnZlcnQueSlcbiAgICAgIGNvcm5lckl0ZW0gPSBAZWxlbWVudC5maW5kKCcuYW5ub3RhdG9yLWl0ZW06bGFzdCcpXG4gICAgZWxzZVxuICAgICAgY29ybmVySXRlbSA9IEBlbGVtZW50LmZpbmQoJy5hbm5vdGF0b3ItaXRlbTpmaXJzdCcpXG5cbiAgICBpZiBjb3JuZXJJdGVtXG4gICAgICAkKCc8c3BhbiBjbGFzcz1cImFubm90YXRvci1yZXNpemVcIj48L3NwYW4+JykuYXBwZW5kVG8oY29ybmVySXRlbSlcblxuICAgIG1vdXNlZG93biA9IG51bGxcbiAgICBjbGFzc2VzICAgPSBAY2xhc3Nlc1xuICAgIGVkaXRvciAgICA9IEBlbGVtZW50XG4gICAgdGV4dGFyZWEgID0gbnVsbFxuICAgIHJlc2l6ZSAgICA9IGVkaXRvci5maW5kKCcuYW5ub3RhdG9yLXJlc2l6ZScpXG4gICAgY29udHJvbHMgID0gZWRpdG9yLmZpbmQoJy5hbm5vdGF0b3ItY29udHJvbHMnKVxuICAgIHRocm90dGxlICA9IGZhbHNlXG5cbiAgICBvbk1vdXNlZG93biA9IChldmVudCkgLT5cbiAgICAgIGlmIGV2ZW50LnRhcmdldCA9PSB0aGlzXG4gICAgICAgIG1vdXNlZG93biA9IHtcbiAgICAgICAgICBlbGVtZW50OiB0aGlzXG4gICAgICAgICAgdG9wOiAgICAgZXZlbnQucGFnZVlcbiAgICAgICAgICBsZWZ0OiAgICBldmVudC5wYWdlWFxuICAgICAgICB9XG5cbiAgICAgICAgIyBGaW5kIHRoZSBmaXJzdCB0ZXh0IGFyZWEgaWYgdGhlcmUgaXMgb25lLlxuICAgICAgICB0ZXh0YXJlYSA9IGVkaXRvci5maW5kKCd0ZXh0YXJlYTpmaXJzdCcpXG5cbiAgICAgICAgJCh3aW5kb3cpLmJpbmQoe1xuICAgICAgICAgICdtb3VzZXVwLmFubm90YXRvci1lZGl0b3ItcmVzaXplJzogICBvbk1vdXNldXBcbiAgICAgICAgICAnbW91c2Vtb3ZlLmFubm90YXRvci1lZGl0b3ItcmVzaXplJzogb25Nb3VzZW1vdmVcbiAgICAgICAgfSlcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgb25Nb3VzZXVwID0gLT5cbiAgICAgIG1vdXNlZG93biA9IG51bGxcbiAgICAgICQod2luZG93KS51bmJpbmQgJy5hbm5vdGF0b3ItZWRpdG9yLXJlc2l6ZSdcblxuICAgIG9uTW91c2Vtb3ZlID0gKGV2ZW50KSA9PlxuICAgICAgaWYgbW91c2Vkb3duIGFuZCB0aHJvdHRsZSA9PSBmYWxzZVxuICAgICAgICBkaWZmID0ge1xuICAgICAgICAgIHRvcDogIGV2ZW50LnBhZ2VZIC0gbW91c2Vkb3duLnRvcFxuICAgICAgICAgIGxlZnQ6IGV2ZW50LnBhZ2VYIC0gbW91c2Vkb3duLmxlZnRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIG1vdXNlZG93bi5lbGVtZW50ID09IHJlc2l6ZVswXVxuICAgICAgICAgIGhlaWdodCA9IHRleHRhcmVhLm91dGVySGVpZ2h0KClcbiAgICAgICAgICB3aWR0aCAgPSB0ZXh0YXJlYS5vdXRlcldpZHRoKClcblxuICAgICAgICAgIGRpcmVjdGlvblggPSBpZiBlZGl0b3IuaGFzQ2xhc3MoY2xhc3Nlcy5pbnZlcnQueCkgdGhlbiAtMSBlbHNlICAxXG4gICAgICAgICAgZGlyZWN0aW9uWSA9IGlmIGVkaXRvci5oYXNDbGFzcyhjbGFzc2VzLmludmVydC55KSB0aGVuICAxIGVsc2UgLTFcblxuICAgICAgICAgIHRleHRhcmVhLmhlaWdodCBoZWlnaHQgKyAoZGlmZi50b3AgICogZGlyZWN0aW9uWSlcbiAgICAgICAgICB0ZXh0YXJlYS53aWR0aCAgd2lkdGggICsgKGRpZmYubGVmdCAqIGRpcmVjdGlvblgpXG5cbiAgICAgICAgICAjIE9ubHkgdXBkYXRlIHRoZSBtb3VzZWRvd24gb2JqZWN0IGlmIHRoZSBkaW1lbnNpb25zXG4gICAgICAgICAgIyBoYXZlIGNoYW5nZWQsIG90aGVyd2lzZSB0aGV5IGhhdmUgcmVhY2hlZCB0aGVpciBtaW5pbXVtXG4gICAgICAgICAgIyB2YWx1ZXMuXG4gICAgICAgICAgbW91c2Vkb3duLnRvcCAgPSBldmVudC5wYWdlWSB1bmxlc3MgdGV4dGFyZWEub3V0ZXJIZWlnaHQoKSA9PSBoZWlnaHRcbiAgICAgICAgICBtb3VzZWRvd24ubGVmdCA9IGV2ZW50LnBhZ2VYIHVubGVzcyB0ZXh0YXJlYS5vdXRlcldpZHRoKCkgID09IHdpZHRoXG5cbiAgICAgICAgZWxzZSBpZiBtb3VzZWRvd24uZWxlbWVudCA9PSBjb250cm9sc1swXVxuICAgICAgICAgIGVkaXRvci5jc3Moe1xuICAgICAgICAgICAgdG9wOiAgcGFyc2VJbnQoZWRpdG9yLmNzcygndG9wJyksIDEwKSAgKyBkaWZmLnRvcFxuICAgICAgICAgICAgbGVmdDogcGFyc2VJbnQoZWRpdG9yLmNzcygnbGVmdCcpLCAxMCkgKyBkaWZmLmxlZnRcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgbW91c2Vkb3duLnRvcCAgPSBldmVudC5wYWdlWVxuICAgICAgICAgIG1vdXNlZG93bi5sZWZ0ID0gZXZlbnQucGFnZVhcblxuICAgICAgICB0aHJvdHRsZSA9IHRydWU7XG4gICAgICAgIHNldFRpbWVvdXQoLT5cbiAgICAgICAgICB0aHJvdHRsZSA9IGZhbHNlXG4gICAgICAgICwgMTAwMC82MClcblxuICAgIHJlc2l6ZS5iaW5kICAgJ21vdXNlZG93bicsIG9uTW91c2Vkb3duXG4gICAgY29udHJvbHMuYmluZCAnbW91c2Vkb3duJywgb25Nb3VzZWRvd25cblxuXG4jIEV4cG9ydCB0aGUgRWRpdG9yIG9iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBFZGl0b3JcbiIsIkRlbGVnYXRvciA9IHJlcXVpcmUgJy4vY2xhc3MnXG5VdGlsID0gcmVxdWlyZSAnLi91dGlsJ1xuXG5cbiMgUHVibGljOiBBIHNpbXBsZSBub3RpZmljYXRpb24gc3lzdGVtIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBpbmZvcm1hdGlvbixcbiMgd2FybmluZ3MgYW5kIGVycm9ycyB0byB0aGUgdXNlci4gRGlzcGxheSBvZiBub3RpZmljYXRpb25zIGFyZSBjb250cm9sbGVkXG4jIGNtcGxldGVseSBieSBDU1MgYnkgYWRkaW5nL3JlbW92aW5nIHRoZSBAb3B0aW9ucy5jbGFzc2VzLnNob3cgY2xhc3MuIFRoaXNcbiMgYWxsb3dzIHN0eWxpbmcvYW5pbWF0aW9uIHVzaW5nIENTUyByYXRoZXIgdGhhbiBoYXJkY29kaW5nIHN0eWxlcy5cbmNsYXNzIE5vdGlmaWNhdGlvbiBleHRlbmRzIERlbGVnYXRvclxuXG4gICMgU2V0cyBldmVudHMgdG8gYmUgYm91bmQgdG8gdGhlIEBlbGVtZW50LlxuICBldmVudHM6XG4gICAgXCJjbGlja1wiOiBcImhpZGVcIlxuXG4gICMgRGVmYXVsdCBvcHRpb25zLlxuICBvcHRpb25zOlxuICAgIGh0bWw6IFwiPGRpdiBjbGFzcz0nYW5ub3RhdG9yLW5vdGljZSc+PC9kaXY+XCJcbiAgICBjbGFzc2VzOlxuICAgICAgc2hvdzogICAgXCJhbm5vdGF0b3Itbm90aWNlLXNob3dcIlxuICAgICAgaW5mbzogICAgXCJhbm5vdGF0b3Itbm90aWNlLWluZm9cIlxuICAgICAgc3VjY2VzczogXCJhbm5vdGF0b3Itbm90aWNlLXN1Y2Nlc3NcIlxuICAgICAgZXJyb3I6ICAgXCJhbm5vdGF0b3Itbm90aWNlLWVycm9yXCJcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiAgTm90aWZpY2F0aW9uIGFuZCBhcHBlbmRzIGl0IHRvIHRoZVxuICAjIGRvY3VtZW50IGJvZHkuXG4gICNcbiAgIyBvcHRpb25zIC0gVGhlIGZvbGxvd2luZyBvcHRpb25zIGNhbiBiZSBwcm92aWRlZC5cbiAgIyAgICAgICAgICAgY2xhc3NlcyAtIEEgT2JqZWN0IGxpdGVyYWwgb2YgY2xhc3NlcyB1c2VkIHRvIGRldGVybWluZSBzdGF0ZS5cbiAgIyAgICAgICAgICAgaHRtbCAgICAtIEFuIEhUTUwgc3RyaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBub3RpZmljYXRpb24uXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIERpc3BsYXlzIGEgbm90aWZpY2F0aW9uIHdpdGggdGhlIHRleHQgXCJIZWxsbyBXb3JsZFwiXG4gICMgICBub3RpZmljYXRpb24gPSBuZXcgQW5ub3RhdG9yLk5vdGlmaWNhdGlvblxuICAjICAgbm90aWZpY2F0aW9uLnNob3coXCJIZWxsbyBXb3JsZFwiKVxuICAjXG4gICMgUmV0dXJuc1xuICBjb25zdHJ1Y3RvcjogKG9wdGlvbnMpIC0+XG4gICAgc3VwZXIgJChAb3B0aW9ucy5odG1sKVswXSwgb3B0aW9uc1xuXG4gICMgUHVibGljOiBEaXNwbGF5cyB0aGUgYW5ub3RhdGlvbiB3aXRoIG1lc3NhZ2UgYW5kIG9wdGlvbmFsIHN0YXR1cy4gVGhlXG4gICMgbWVzc2FnZSB3aWxsIGhpZGUgaXRzZWxmIGFmdGVyIDUgc2Vjb25kcyBvciBpZiB0aGUgdXNlciBjbGlja3Mgb24gaXQuXG4gICNcbiAgIyBtZXNzYWdlIC0gQSBtZXNzYWdlIFN0cmluZyB0byBkaXNwbGF5IChIVE1MIHdpbGwgYmUgZXNjYXBlZCkuXG4gICMgc3RhdHVzICAtIEEgc3RhdHVzIGNvbnN0YW50LiBUaGlzIHdpbGwgYXBwbHkgYSBjbGFzcyB0byB0aGUgZWxlbWVudCBmb3JcbiAgIyAgICAgICAgICAgc3R5bGluZy4gKGRlZmF1bHQ6IEFubm90YXRvci5Ob3RpZmljYXRpb24uSU5GTylcbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgRGlzcGxheXMgYSBub3RpZmljYXRpb24gd2l0aCB0aGUgdGV4dCBcIkhlbGxvIFdvcmxkXCJcbiAgIyAgIG5vdGlmaWNhdGlvbi5zaG93KFwiSGVsbG8gV29ybGRcIilcbiAgI1xuICAjICAgIyBEaXNwbGF5cyBhIG5vdGlmaWNhdGlvbiB3aXRoIHRoZSB0ZXh0IFwiQW4gZXJyb3IgaGFzIG9jY3VycmVkXCJcbiAgIyAgIG5vdGlmaWNhdGlvbi5zaG93KFwiQW4gZXJyb3IgaGFzIG9jY3VycmVkXCIsIEFubm90YXRvci5Ob3RpZmljYXRpb24uRVJST1IpXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZi5cbiAgc2hvdzogKG1lc3NhZ2UsIHN0YXR1cz1Ob3RpZmljYXRpb24uSU5GTykgPT5cbiAgICBAY3VycmVudFN0YXR1cyA9IHN0YXR1c1xuICAgIHRoaXMuX2FwcGVuZEVsZW1lbnQoKVxuXG4gICAgJChAZWxlbWVudClcbiAgICAgIC5hZGRDbGFzcyhAb3B0aW9ucy5jbGFzc2VzLnNob3cpXG4gICAgICAuYWRkQ2xhc3MoQG9wdGlvbnMuY2xhc3Nlc1tAY3VycmVudFN0YXR1c10pXG4gICAgICAuaHRtbChVdGlsLmVzY2FwZShtZXNzYWdlIHx8IFwiXCIpKVxuXG4gICAgc2V0VGltZW91dCB0aGlzLmhpZGUsIDUwMDBcbiAgICB0aGlzXG5cbiAgIyBQdWJsaWM6IEhpZGVzIHRoZSBub3RpZmljYXRpb24uXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIEhpZGVzIHRoZSBub3RpZmljYXRpb24uXG4gICMgICBub3RpZmljYXRpb24uaGlkZSgpXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZi5cbiAgaGlkZTogPT5cbiAgICBAY3VycmVudFN0YXR1cyA/PSBBbm5vdGF0b3IuTm90aWZpY2F0aW9uLklORk9cbiAgICAkKEBlbGVtZW50KVxuICAgICAgLnJlbW92ZUNsYXNzKEBvcHRpb25zLmNsYXNzZXMuc2hvdylcbiAgICAgIC5yZW1vdmVDbGFzcyhAb3B0aW9ucy5jbGFzc2VzW0BjdXJyZW50U3RhdHVzXSlcbiAgICB0aGlzXG5cbiAgIyBQcml2YXRlOiBFbnN1cmVzIHRoZSBub3RpZmljYXRpb24gZWxlbWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZG9jdW1lbnRcbiAgIyB3aGVuIGl0IGlzIG5lZWRlZC5cbiAgX2FwcGVuZEVsZW1lbnQ6IC0+XG4gICAgaWYgbm90IEBlbGVtZW50LnBhcmVudE5vZGU/XG4gICAgICAkKEBlbGVtZW50KS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KVxuXG4jIENvbnN0YW50cyBmb3IgY29udHJvbGxpbmcgdGhlIGRpc3BsYXkgb2YgdGhlIG5vdGlmaWNhdGlvbi4gRWFjaCBjb25zdGFudFxuIyBhZGRzIGEgZGlmZmVyZW50IGNsYXNzIHRvIHRoZSBOb3RpZmljYXRpb24jZWxlbWVudC5cbk5vdGlmaWNhdGlvbi5JTkZPICAgID0gJ2luZm8nXG5Ob3RpZmljYXRpb24uU1VDQ0VTUyA9ICdzdWNjZXNzJ1xuTm90aWZpY2F0aW9uLkVSUk9SICAgPSAnZXJyb3InXG5cbiMgRXhwb3J0IE5vdGlmaWNhdGlvbiBvYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gTm90aWZpY2F0aW9uXG4iLCJBbm5vdGF0b3IgPSByZXF1aXJlKCdhbm5vdGF0b3InKVxuXG5cbiMgUHVibGljOiBDcmVhdGVzIGEgRGF0ZSBvYmplY3QgZnJvbSBhbiBJU084NjAxIGZvcm1hdHRlZCBkYXRlIFN0cmluZy5cbiNcbiMgc3RyaW5nIC0gSVNPODYwMSBmb3JtYXR0ZWQgZGF0ZSBTdHJpbmcuXG4jXG4jIFJldHVybnMgRGF0ZSBpbnN0YW5jZS5cbmNyZWF0ZURhdGVGcm9tSVNPODYwMSA9IChzdHJpbmcpIC0+XG4gIHJlZ2V4cCA9IChcbiAgICBcIihbMC05XXs0fSkoLShbMC05XXsyfSkoLShbMC05XXsyfSlcIiArXG4gICAgXCIoVChbMC05XXsyfSk6KFswLTldezJ9KSg6KFswLTldezJ9KShcXFxcLihbMC05XSspKT8pP1wiICtcbiAgICBcIihafCgoWy0rXSkoWzAtOV17Mn0pOihbMC05XXsyfSkpKT8pPyk/KT9cIlxuICApXG5cbiAgZCA9IHN0cmluZy5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4cCkpXG5cbiAgb2Zmc2V0ID0gMFxuICBkYXRlID0gbmV3IERhdGUoZFsxXSwgMCwgMSlcblxuICBkYXRlLnNldE1vbnRoKGRbM10gLSAxKSBpZiBkWzNdXG4gIGRhdGUuc2V0RGF0ZShkWzVdKSBpZiBkWzVdXG4gIGRhdGUuc2V0SG91cnMoZFs3XSkgaWYgZFs3XVxuICBkYXRlLnNldE1pbnV0ZXMoZFs4XSkgaWYgZFs4XVxuICBkYXRlLnNldFNlY29uZHMoZFsxMF0pIGlmIGRbMTBdXG4gIGRhdGUuc2V0TWlsbGlzZWNvbmRzKE51bWJlcihcIjAuXCIgKyBkWzEyXSkgKiAxMDAwKSBpZiBkWzEyXVxuXG4gIGlmIGRbMTRdXG4gICAgb2Zmc2V0ID0gKE51bWJlcihkWzE2XSkgKiA2MCkgKyBOdW1iZXIoZFsxN10pXG4gICAgb2Zmc2V0ICo9ICgoZFsxNV0gPT0gJy0nKSA/IDEgOiAtMSlcblxuICBvZmZzZXQgLT0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpXG4gIHRpbWUgPSAoTnVtYmVyKGRhdGUpICsgKG9mZnNldCAqIDYwICogMTAwMCkpXG5cbiAgZGF0ZS5zZXRUaW1lKE51bWJlcih0aW1lKSlcbiAgZGF0ZVxuXG5iYXNlNjREZWNvZGUgPSAoZGF0YSkgLT5cbiAgaWYgYXRvYj9cbiAgICAjIEdlY2tvIGFuZCBXZWJraXQgcHJvdmlkZSBuYXRpdmUgY29kZSBmb3IgdGhpc1xuICAgIGF0b2IoZGF0YSlcbiAgZWxzZVxuICAgICMgQWRhcHRlZCBmcm9tIE1JVC9CU0QgbGljZW5zZWQgY29kZSBhdCBodHRwOi8vcGhwanMub3JnL2Z1bmN0aW9ucy9iYXNlNjRfZGVjb2RlXG4gICAgIyB2ZXJzaW9uIDExMDkuMjAxNVxuICAgIGI2NCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIlxuICAgIGkgPSAwXG4gICAgYWMgPSAwXG4gICAgZGVjID0gXCJcIlxuICAgIHRtcF9hcnIgPSBbXVxuXG4gICAgaWYgbm90IGRhdGFcbiAgICAgIHJldHVybiBkYXRhXG5cbiAgICBkYXRhICs9ICcnXG5cbiAgICB3aGlsZSBpIDwgZGF0YS5sZW5ndGhcbiAgICAgICMgdW5wYWNrIGZvdXIgaGV4ZXRzIGludG8gdGhyZWUgb2N0ZXRzIHVzaW5nIGluZGV4IHBvaW50cyBpbiBiNjRcbiAgICAgIGgxID0gYjY0LmluZGV4T2YoZGF0YS5jaGFyQXQoaSsrKSlcbiAgICAgIGgyID0gYjY0LmluZGV4T2YoZGF0YS5jaGFyQXQoaSsrKSlcbiAgICAgIGgzID0gYjY0LmluZGV4T2YoZGF0YS5jaGFyQXQoaSsrKSlcbiAgICAgIGg0ID0gYjY0LmluZGV4T2YoZGF0YS5jaGFyQXQoaSsrKSlcblxuICAgICAgYml0cyA9IGgxIDw8IDE4IHwgaDIgPDwgMTIgfCBoMyA8PCA2IHwgaDRcblxuICAgICAgbzEgPSBiaXRzID4+IDE2ICYgMHhmZlxuICAgICAgbzIgPSBiaXRzID4+IDggJiAweGZmXG4gICAgICBvMyA9IGJpdHMgJiAweGZmXG5cbiAgICAgIGlmIGgzID09IDY0XG4gICAgICAgIHRtcF9hcnJbYWMrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG8xKVxuICAgICAgZWxzZSBpZiBoNCA9PSA2NFxuICAgICAgICB0bXBfYXJyW2FjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZShvMSwgbzIpXG4gICAgICBlbHNlXG4gICAgICAgIHRtcF9hcnJbYWMrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG8xLCBvMiwgbzMpXG5cbiAgICB0bXBfYXJyLmpvaW4oJycpXG5cbmJhc2U2NFVybERlY29kZSA9IChkYXRhKSAtPlxuICBtID0gZGF0YS5sZW5ndGggJSA0XG4gIGlmIG0gIT0gMFxuICAgIGZvciBpIGluIFswLi4uNCAtIG1dXG4gICAgICBkYXRhICs9ICc9J1xuICBkYXRhID0gZGF0YS5yZXBsYWNlKC8tL2csICcrJylcbiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvXy9nLCAnLycpXG4gIGJhc2U2NERlY29kZShkYXRhKVxuXG5wYXJzZVRva2VuID0gKHRva2VuKSAtPlxuICBbaGVhZCwgcGF5bG9hZCwgc2lnXSA9IHRva2VuLnNwbGl0KCcuJylcbiAgSlNPTi5wYXJzZShiYXNlNjRVcmxEZWNvZGUocGF5bG9hZCkpXG5cbiMgUHVibGljOiBTdXBwb3J0cyB0aGUgU3RvcmUgcGx1Z2luIGJ5IHByb3ZpZGluZyBBdXRoZW50aWNhdGlvbiBoZWFkZXJzLlxuY2xhc3MgQW5ub3RhdG9yLlBsdWdpbi5BdXRoIGV4dGVuZHMgQW5ub3RhdG9yLlBsdWdpblxuICAjIFVzZXIgb3B0aW9ucyB0aGF0IGNhbiBiZSBwcm92aWRlZC5cbiAgb3B0aW9uczpcblxuICAgICMgQW4gYXV0aGVudGljYXRpb24gdG9rZW4uIFVzZWQgdG8gc2tpcCB0aGUgcmVxdWVzdCB0byB0aGUgc2VydmVyIGZvciBhXG4gICAgIyBhIHRva2VuLlxuICAgIHRva2VuOiBudWxsXG5cbiAgICAjIFRoZSBVUkwgb24gdGhlIGxvY2FsIHNlcnZlciB0byByZXF1ZXN0IGFuIGF1dGhlbnRpY2F0aW9uIHRva2VuLlxuICAgIHRva2VuVXJsOiAnL2F1dGgvdG9rZW4nXG5cbiAgICAjIElmIHRydWUgd2lsbCB0cnkgYW5kIGZldGNoIGEgdG9rZW4gd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpc2VkLlxuICAgIGF1dG9GZXRjaDogdHJ1ZVxuICAgIFxuICAgICMgSFRUUCBtZXRob2QgdG8gdXNlIGZvciBmZXRjaGluZyB0aGUgdG9rZW5cbiAgICByZXF1ZXN0TWV0aG9kOiAnR0VUJ1xuICAgIFxuICAgICMgZGF0YSB0byBzZW5kIHdoZW4gZmV0Y2hpbmcgdGhlIHRva2VuXG4gICAgcmVxdWVzdERhdGE6IG51bGxcbiAgICBcbiAgICAjIGNhbGxiYWNrIHdoZW4gbG9naW4gcmVxdWlyZWRcbiAgICB1bmF1dGhvcml6ZWRDYWxsYmFjazogbnVsbFxuXG4gICMgUHVibGljOiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEF1dGggcGx1Z2luLlxuICAjXG4gICMgZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGJpbmQgYWxsIGV2ZW50cyB0by4gVXN1YWxseSB0aGUgQW5ub3RhdG9yI2VsZW1lbnQuXG4gICMgb3B0aW9ucyAtIEFuIE9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcgdXNlciBvcHRpb25zLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgcGx1Z2luID0gbmV3IEFubm90YXRvci5QbHVnaW4uQXV0aChhbm5vdGF0b3IuZWxlbWVudCwge1xuICAjICAgICB0b2tlblVybDogJy9teS9jdXN0b20vcGF0aCdcbiAgIyAgIH0pXG4gICNcbiAgIyBSZXR1cm5zIGluc3RhbmNlIG9mIEF1dGguXG4gIGNvbnN0cnVjdG9yOiAoZWxlbWVudCwgb3B0aW9ucykgLT5cbiAgICBzdXBlclxuXG4gICAgIyBMaXN0IG9mIGZ1bmN0aW9ucyB0byBiZSBleGVjdXRlZCB3aGVuIHdlIGhhdmUgYSB2YWxpZCB0b2tlbi5cbiAgICBAd2FpdGluZ0ZvclRva2VuID0gW11cblxuICAgIGlmIEBvcHRpb25zLnRva2VuXG4gICAgICB0aGlzLnNldFRva2VuKEBvcHRpb25zLnRva2VuKVxuICAgIGVsc2VcbiAgICAgIHRoaXMucmVxdWVzdFRva2VuKClcblxuICAjIFB1YmxpYzogTWFrZXMgYSByZXF1ZXN0IHRvIHRoZSBsb2NhbCBzZXJ2ZXIgZm9yIGFuIGF1dGhlbnRpY2F0aW9uIHRva2VuLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgYXV0aC5yZXF1ZXN0VG9rZW4oKVxuICAjXG4gICMgUmV0dXJucyBqcVhIUiBvYmplY3QuXG4gIHJlcXVlc3RUb2tlbjogLT5cbiAgICBAcmVxdWVzdEluUHJvZ3Jlc3MgPSB0cnVlXG5cbiAgICAkLmFqYXhcbiAgICAgIHVybDogQG9wdGlvbnMudG9rZW5VcmxcbiAgICAgIGRhdGFUeXBlOiAndGV4dCdcbiAgICAgIGRhdGE6IEBvcHRpb25zLnJlcXVlc3REYXRhXG4gICAgICB0eXBlOiBAb3B0aW9ucy5yZXF1ZXN0TWV0aG9kXG4gICAgICB4aHJGaWVsZHM6XG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSAjIFNlbmQgYW55IGF1dGggY29va2llcyB0byB0aGUgYmFja2VuZFxuXG4gICAgIyBvbiBzdWNjZXNzLCBzZXQgdGhlIGF1dGggdG9rZW5cbiAgICAuZG9uZSAoZGF0YSwgc3RhdHVzLCB4aHIpID0+XG4gICAgICB0aGlzLnNldFRva2VuKGRhdGEpXG5cbiAgICAjIG9uIGZhaWx1cmUsIHJlbGF5IGFueSBtZXNzYWdlIGdpdmVuIGJ5IHRoZSBzZXJ2ZXIgdG8gdGhlIHVzZXIgd2l0aCBhIG5vdGlmaWNhdGlvblxuICAgIC5mYWlsICh4aHIsIHN0YXR1cywgZXJyKSA9PlxuICAgICAgaWYgeGhyLnN0YXR1cyA9PSA0MDFcbiAgICAgICAgY2FsbGJhY2sgPSBAb3B0aW9ucy51bmF1dGhvcml6ZWRDYWxsYmFjayBcbiAgICAgICAgaWYgY2FsbGJhY2s/IGFuZCBjYWxsYmFjayh0aGlzKVxuICAgICAgICAgICMgdHJ5IGFnYWluIGluIDFzIGlmIGNhbGxiYWNrIHJldHVybnMgdHJ1ZVxuICAgICAgICAgIEByZXRyeVRpbWVvdXQgPSBzZXRUaW1lb3V0ICgoKSA9PiB0aGlzLnJlcXVlc3RUb2tlbigpKSwgMTAwMFxuICAgICAgICAgIHJldHVyblxuICAgICAgICAgIFxuICAgICAgbXNnID0gQW5ub3RhdG9yLl90KFwiQ291bGRuJ3QgZ2V0IGF1dGggdG9rZW46XCIpXG4gICAgICBjb25zb2xlLmVycm9yIFwiI3ttc2d9ICN7ZXJyfVwiLCB4aHJcbiAgICAgIEFubm90YXRvci5zaG93Tm90aWZpY2F0aW9uKFwiI3ttc2d9ICN7eGhyLnJlc3BvbnNlVGV4dH1cIiwgQW5ub3RhdG9yLk5vdGlmaWNhdGlvbi5FUlJPUilcblxuICAgICMgYWx3YXlzIHJlc2V0IHRoZSByZXF1ZXN0SW5Qcm9ncmVzcyBpbmRpY2F0b3JcbiAgICAuYWx3YXlzID0+XG4gICAgICBAcmVxdWVzdEluUHJvZ3Jlc3MgPSBmYWxzZVxuXG4gICMgUHVibGljOiBTZXRzIHRoZSBAdG9rZW4gYW5kIGNoZWNrcyBpdCdzIHZhbGlkaXR5LiBJZiB0aGUgdG9rZW4gaXMgaW52YWxpZFxuICAjIHJlcXVlc3RzIGEgbmV3IG9uZSBmcm9tIHRoZSBzZXJ2ZXIuXG4gICNcbiAgIyB0b2tlbiAtIEEgdG9rZW4gc3RyaW5nLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgYXV0aC5zZXRUb2tlbignZXlKaC4uLjlqUTNJJylcbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgc2V0VG9rZW46ICh0b2tlbikgLT5cbiAgICBAdG9rZW4gPSB0b2tlblxuICAgICMgUGFyc2UgdGhlIHRva2VuIHdpdGhvdXQgdmVyaWZ5aW5nIGl0cyBhdXRoZW50aWNpdHk6XG4gICAgQF91bnNhZmVUb2tlbiA9IHBhcnNlVG9rZW4odG9rZW4pXG5cbiAgICBpZiB0aGlzLmhhdmVWYWxpZFRva2VuKClcbiAgICAgIGlmIEBvcHRpb25zLmF1dG9GZXRjaFxuICAgICAgICAjIFNldCB0aW1lb3V0IHRvIGZldGNoIG5ldyB0b2tlbiAyIHNlY29uZHMgYmVmb3JlIGN1cnJlbnQgdG9rZW4gZXhwaXJ5XG4gICAgICAgIEByZWZyZXNoVGltZW91dCA9IHNldFRpbWVvdXQgKCgpID0+IHRoaXMucmVxdWVzdFRva2VuKCkpLCAodGhpcy50aW1lVG9FeHBpcnkoKSAtIDIpICogMTAwMFxuXG4gICAgICAjIFNldCBoZWFkZXJzIGZpZWxkIG9uIHRoaXMuZWxlbWVudFxuICAgICAgdGhpcy51cGRhdGVIZWFkZXJzKClcblxuICAgICAgIyBSdW4gY2FsbGJhY2tzIHdhaXRpbmcgZm9yIHRva2VuXG4gICAgICB3aGlsZSBAd2FpdGluZ0ZvclRva2VuLmxlbmd0aCA+IDBcbiAgICAgICAgQHdhaXRpbmdGb3JUb2tlbi5wb3AoKShAX3Vuc2FmZVRva2VuKVxuXG4gICAgZWxzZVxuICAgICAgY29uc29sZS53YXJuIEFubm90YXRvci5fdChcIkRpZG4ndCBnZXQgYSB2YWxpZCB0b2tlbi5cIilcbiAgICAgIGlmIEBvcHRpb25zLmF1dG9GZXRjaFxuICAgICAgICBjb25zb2xlLndhcm4gQW5ub3RhdG9yLl90KFwiR2V0dGluZyBhIG5ldyB0b2tlbiBpbiAxMHMuXCIpXG4gICAgICAgIHNldFRpbWVvdXQgKCgpID0+IHRoaXMucmVxdWVzdFRva2VuKCkpLCAxMCAqIDEwMDBcblxuICAjIFB1YmxpYzogQ2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGUgY3VycmVudCB0b2tlbi4gTm90ZSB0aGF0IHRoaXMgKmRvZXNcbiAgIyBub3QqIGNoZWNrIHRoZSBhdXRoZW50aWNpdHkgb2YgdGhlIHRva2VuLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgYXV0aC5oYXZlVmFsaWRUb2tlbigpICMgPT4gUmV0dXJucyB0cnVlIGlmIHZhbGlkLlxuICAjXG4gICMgUmV0dXJucyB0cnVlIGlmIHRoZSB0b2tlbiBpcyB2YWxpZC5cbiAgaGF2ZVZhbGlkVG9rZW46ICgpIC0+XG4gICAgYWxsRmllbGRzID0gKFxuICAgICAgQF91bnNhZmVUb2tlbiBhbmRcbiAgICAgIEBfdW5zYWZlVG9rZW4uaXNzdWVkQXQgYW5kXG4gICAgICBAX3Vuc2FmZVRva2VuLnR0bCBhbmRcbiAgICAgIEBfdW5zYWZlVG9rZW4uY29uc3VtZXJLZXlcbiAgICApXG5cbiAgICBpZiBhbGxGaWVsZHMgJiYgdGhpcy50aW1lVG9FeHBpcnkoKSA+IDBcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgIyBQdWJsaWM6IENhbGN1bGF0ZXMgdGhlIHRpbWUgaW4gc2Vjb25kcyB1bnRpbCB0aGUgY3VycmVudCB0b2tlbiBleHBpcmVzLlxuICAjXG4gICMgUmV0dXJucyBOdW1iZXIgb2Ygc2Vjb25kcyB1bnRpbCB0b2tlbiBleHBpcmVzLlxuICB0aW1lVG9FeHBpcnk6IC0+XG4gICAgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwXG4gICAgaXNzdWUgPSBjcmVhdGVEYXRlRnJvbUlTTzg2MDEoQF91bnNhZmVUb2tlbi5pc3N1ZWRBdCkuZ2V0VGltZSgpIC8gMTAwMFxuXG4gICAgZXhwaXJ5ID0gaXNzdWUgKyBAX3Vuc2FmZVRva2VuLnR0bFxuICAgIHRpbWVUb0V4cGlyeSA9IGV4cGlyeSAtIG5vd1xuXG4gICAgaWYgKHRpbWVUb0V4cGlyeSA+IDApIHRoZW4gdGltZVRvRXhwaXJ5IGVsc2UgMFxuXG4gICMgUHVibGljOiBVcGRhdGVzIHRoZSBoZWFkZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUgU3RvcmUgcmVxdWVzdHMuIFRoaXMgaXNcbiAgIyBhY2hpZXZlZCBieSB1cGRhdGluZyB0aGUgJ2Fubm90YXRvcjpoZWFkZXJzJyBrZXkgaW4gdGhlIEBlbGVtZW50LmRhdGEoKVxuICAjIHN0b3JlLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICB1cGRhdGVIZWFkZXJzOiAtPlxuICAgIGN1cnJlbnQgPSBAZWxlbWVudC5kYXRhKCdhbm5vdGF0b3I6aGVhZGVycycpXG4gICAgQGVsZW1lbnQuZGF0YSgnYW5ub3RhdG9yOmhlYWRlcnMnLCAkLmV4dGVuZChjdXJyZW50LCB7XG4gICAgICAneC1hbm5vdGF0b3ItYXV0aC10b2tlbic6IEB0b2tlbixcbiAgICB9KSlcblxuICAjIFJ1bnMgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGlmIGEgdmFsaWQgdG9rZW4gaXMgYXZhaWxhYmxlLiBPdGhlcndpc2UgcmVxdWVzdHNcbiAgIyBhIHRva2VuIHVudGlsIGl0IHJlY2lldmVzIGEgdmFsaWQgb25lLlxuICAjXG4gICMgY2FsbGJhY2sgLSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSBhIHZhbGlkIHRva2VuIGlzIG9idGFpbmVkLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgYXV0aC53aXRoVG9rZW4gLT5cbiAgIyAgICAgc3RvcmUubG9hZEFubm90YXRpb25zKClcbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgd2l0aFRva2VuOiAoY2FsbGJhY2spIC0+XG4gICAgaWYgbm90IGNhbGxiYWNrP1xuICAgICAgcmV0dXJuXG5cbiAgICBpZiB0aGlzLmhhdmVWYWxpZFRva2VuKClcbiAgICAgIGNhbGxiYWNrKEBfdW5zYWZlVG9rZW4pXG4gICAgZWxzZVxuICAgICAgdGhpcy53YWl0aW5nRm9yVG9rZW4ucHVzaChjYWxsYmFjaylcbiAgICAgIGlmIG5vdCBAcmVxdWVzdEluUHJvZ3Jlc3NcbiAgICAgICAgdGhpcy5yZXF1ZXN0VG9rZW4oKVxuXG5cbm1vZHVsZS5leHBvcnRzID0gQW5ub3RhdG9yLlBsdWdpbi5BdXRoXG4iLCJBbm5vdGF0b3IgPSByZXF1aXJlKCdhbm5vdGF0b3InKVxuXG5cbmNsYXNzIEFubm90YXRvci5QbHVnaW4uRmlsdGVyIGV4dGVuZHMgQW5ub3RhdG9yLlBsdWdpblxuICAjIEV2ZW50cyBhbmQgY2FsbGJhY2tzIHRvIGJpbmQgdG8gdGhlIEZpbHRlciNlbGVtZW50LlxuICBldmVudHM6XG4gICAgXCIuYW5ub3RhdG9yLWZpbHRlci1wcm9wZXJ0eSBpbnB1dCBmb2N1c1wiOiBcIl9vbkZpbHRlckZvY3VzXCJcbiAgICBcIi5hbm5vdGF0b3ItZmlsdGVyLXByb3BlcnR5IGlucHV0IGJsdXJcIjogIFwiX29uRmlsdGVyQmx1clwiXG4gICAgXCIuYW5ub3RhdG9yLWZpbHRlci1wcm9wZXJ0eSBpbnB1dCBrZXl1cFwiOiBcIl9vbkZpbHRlcktleXVwXCJcbiAgICBcIi5hbm5vdGF0b3ItZmlsdGVyLXByZXZpb3VzIGNsaWNrXCI6ICAgICAgIFwiX29uUHJldmlvdXNDbGlja1wiXG4gICAgXCIuYW5ub3RhdG9yLWZpbHRlci1uZXh0IGNsaWNrXCI6ICAgICAgICAgICBcIl9vbk5leHRDbGlja1wiXG4gICAgXCIuYW5ub3RhdG9yLWZpbHRlci1jbGVhciBjbGlja1wiOiAgICAgICAgICBcIl9vbkNsZWFyQ2xpY2tcIlxuXG4gICMgQ29tbW9uIGNsYXNzZXMgdXNlZCB0byBjaGFuZ2UgcGx1Z2luIHN0YXRlLlxuICBjbGFzc2VzOlxuICAgIGFjdGl2ZTogICAnYW5ub3RhdG9yLWZpbHRlci1hY3RpdmUnXG4gICAgaGw6XG4gICAgICBoaWRlOiAgICdhbm5vdGF0b3ItaGwtZmlsdGVyZWQnXG4gICAgICBhY3RpdmU6ICdhbm5vdGF0b3ItaGwtYWN0aXZlJ1xuXG4gICMgSFRNTCB0ZW1wbGF0ZXMgZm9yIHRoZSBwbHVnaW4gVUkuXG4gIGh0bWw6XG4gICAgZWxlbWVudDogXCJcIlwiXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFubm90YXRvci1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgIDxzdHJvbmc+XCJcIlwiICsgQW5ub3RhdG9yLl90KCdOYXZpZ2F0ZTonKSArIFwiXCJcIjwvc3Ryb25nPlxuICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhbm5vdGF0b3ItZmlsdGVyLW5hdmlnYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhbm5vdGF0b3ItZmlsdGVyLXByZXZpb3VzXCI+XCJcIlwiICsgQW5ub3RhdG9yLl90KCdQcmV2aW91cycpICsgXCJcIlwiPC9idXR0b24+XG4gICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYW5ub3RhdG9yLWZpbHRlci1uZXh0XCI+XCJcIlwiICsgQW5ub3RhdG9yLl90KCdOZXh0JykgKyBcIlwiXCI8L2J1dHRvbj5cbiAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgIDxzdHJvbmc+XCJcIlwiICsgQW5ub3RhdG9yLl90KCdGaWx0ZXIgYnk6JykgKyBcIlwiXCI8L3N0cm9uZz5cbiAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICBcIlwiXCJcbiAgICBmaWx0ZXI6ICBcIlwiXCJcbiAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFubm90YXRvci1maWx0ZXItcHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgIDxsYWJlbD48L2xhYmVsPlxuICAgICAgICAgICAgICAgPGlucHV0Lz5cbiAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYW5ub3RhdG9yLWZpbHRlci1jbGVhclwiPlwiXCJcIiArIEFubm90YXRvci5fdCgnQ2xlYXInKSArIFwiXCJcIjwvYnV0dG9uPlxuICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICBcIlwiXCJcblxuICAjIERlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIHBsdWdpbi5cbiAgb3B0aW9uczpcbiAgICAjIEEgQ1NTIHNlbGVjdG9yIG9yIEVsZW1lbnQgdG8gYXBwZW5kIHRoZSBwbHVnaW4gdG9vbGJhciB0by5cbiAgICBhcHBlbmRUbzogJ2JvZHknXG5cbiAgICAjIEFuIGFycmF5IG9mIGZpbHRlcnMgY2FuIGJlIHByb3ZpZGVkIG9uIGluaXRpYWxpc2F0aW9uLlxuICAgIGZpbHRlcnM6IFtdXG5cbiAgICAjIEFkZHMgYSBkZWZhdWx0IGZpbHRlciBvbiBhbm5vdGF0aW9ucy5cbiAgICBhZGRBbm5vdGF0aW9uRmlsdGVyOiB0cnVlXG5cbiAgICAjIFB1YmxpYzogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvcGVydHkgaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgcHJvdmlkZWRcbiAgICAjIGFubm90YXRpb24gcHJvcGVydHkuIERlZmF1bHQgaXMgdG8gc3BsaXQgdGhlIHN0cmluZyBvbiBzcGFjZXMgYW5kIG9ubHlcbiAgICAjIHJldHVybiB0cnVlIGlmIGFsbCBrZXl3b3JkcyBhcmUgY29udGFpbmVkIGluIHRoZSBzdHJpbmcuIFRoaXMgbWV0aG9kXG4gICAgIyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgdXNlciB3aGVuIGluaXRpYWxpc2luZyB0aGUgcGx1Z2luLlxuICAgICNcbiAgICAjIHN0cmluZyAgIC0gQW4gaW5wdXQgU3RyaW5nIGZyb20gdGhlIGZpdGxlci5cbiAgICAjIHByb3BlcnR5IC0gVGhlIGFubm90YXRpb24gcHJvcGVyeSB0byBxdWVyeS5cbiAgICAjXG4gICAgIyBFeGFtcGxlc1xuICAgICNcbiAgICAjICAgcGx1Z2luLm9wdGlvbi5nZXRLZXl3b3JkcygnaGVsbG8nLCAnaGVsbG8gd29ybGQgaG93IGFyZSB5b3U/JylcbiAgICAjICAgIyA9PiBSZXR1cm5zIHRydWVcbiAgICAjXG4gICAgIyAgIHBsdWdpbi5vcHRpb24uZ2V0S2V5d29yZHMoJ2hlbGxvIGJpbGwnLCAnaGVsbG8gd29ybGQgaG93IGFyZSB5b3U/JylcbiAgICAjICAgIyA9PiBSZXR1cm5zIGZhbHNlXG4gICAgI1xuICAgICMgUmV0dXJucyBhbiBBcnJheSBvZiBrZXl3b3JkIFN0cmluZ3MuXG4gICAgaXNGaWx0ZXJlZDogKGlucHV0LCBwcm9wZXJ0eSkgLT5cbiAgICAgIHJldHVybiBmYWxzZSB1bmxlc3MgaW5wdXQgYW5kIHByb3BlcnR5XG5cbiAgICAgIGZvciBrZXl3b3JkIGluIChpbnB1dC5zcGxpdCAvXFxzKy8pXG4gICAgICAgIHJldHVybiBmYWxzZSBpZiBwcm9wZXJ0eS5pbmRleE9mKGtleXdvcmQpID09IC0xXG5cbiAgICAgIHJldHVybiB0cnVlXG5cbiAgIyBQdWJsaWM6IENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEZpbHRlciBwbHVnaW4uXG4gICNcbiAgIyBlbGVtZW50IC0gVGhlIEFubm90YXRvciBlbGVtZW50ICh0aGlzIGlzIGlnbm9yZWQgYnkgdGhlIHBsdWdpbikuXG4gICMgb3B0aW9ucyAtIEFuIE9iamVjdCBsaXRlcmFsIG9mIG9wdGlvbnMuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBmaWx0ZXIgPSBuZXcgQW5ub3RhdG9yLlBsdWdpbi5GaWx0ZXIoYW5ub3RhdG9yLmVsZW1lbnQpXG4gICNcbiAgIyBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBGaWx0ZXIgcGx1Z2luLlxuICBjb25zdHJ1Y3RvcjogKGVsZW1lbnQsIG9wdGlvbnMpIC0+XG4gICAgIyBBcyBtb3N0IGV2ZW50cyBmb3IgdGhpcyBwbHVnaW4gYXJlIHJlbGF0aXZlIHRvIHRoZSB0b29sYmFyIHdoaWNoIGlzXG4gICAgIyBub3QgaW5zaWRlIHRoZSBBbm5vdGF0b3IjRWxlbWVudCB3ZSBvdmVycmlkZSB0aGUgZWxlbWVudCBwcm9wZXJ0eS5cbiAgICAjIEFubm90YXRvciNFbGVtZW50IGNhbiBzdGlsbCBiZSBhY2Nlc3NlZCB2aWEgQGFubm90YXRvci5lbGVtZW50LlxuICAgIGVsZW1lbnQgPSAkKEBodG1sLmVsZW1lbnQpLmFwcGVuZFRvKG9wdGlvbnM/LmFwcGVuZFRvIG9yIEBvcHRpb25zLmFwcGVuZFRvKVxuXG4gICAgc3VwZXIgZWxlbWVudCwgb3B0aW9uc1xuXG4gICAgQG9wdGlvbnMuZmlsdGVycyBvcj0gW11cblxuICAgIEBmaWx0ZXIgID0gJChAaHRtbC5maWx0ZXIpXG4gICAgQGZpbHRlcnMgPSBbXVxuICAgIEBjdXJyZW50ICA9IDBcblxuICAjIFB1YmxpYzogQWRkcyBuZXcgZmlsdGVycy4gVXBkYXRlcyB0aGUgQGhpZ2hsaWdodHMgY2FjaGUgYW5kIGNyZWF0ZXMgZXZlbnRcbiAgIyBsaXN0ZW5lcnMgb24gdGhlIGFubm90YXRvciBvYmplY3QuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHBsdWdpbkluaXQ6IC0+XG4gICAgZm9yIGZpbHRlciBpbiBAb3B0aW9ucy5maWx0ZXJzXG4gICAgICB0aGlzLmFkZEZpbHRlcihmaWx0ZXIpXG5cbiAgICB0aGlzLnVwZGF0ZUhpZ2hsaWdodHMoKVxuICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKCkuX2luc2VydFNwYWNlcigpXG5cbiAgICBpZiBAb3B0aW9ucy5hZGRBbm5vdGF0aW9uRmlsdGVyID09IHRydWVcbiAgICAgIHRoaXMuYWRkRmlsdGVyIHtsYWJlbDogQW5ub3RhdG9yLl90KCdBbm5vdGF0aW9uJyksIHByb3BlcnR5OiAndGV4dCd9XG5cbiAgIyBQdWJsaWM6IHJlbW92ZSB0aGUgZmlsdGVyIHBsdWdpbiBpbnN0YW5jZSBhbmQgdW5iaW5kIGV2ZW50cy5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgZGVzdHJveTogLT5cbiAgICBzdXBlclxuICAgIGh0bWwgPSAkKCdodG1sJylcbiAgICBjdXJyZW50TWFyZ2luID0gcGFyc2VJbnQoaHRtbC5jc3MoJ3BhZGRpbmctdG9wJyksIDEwKSB8fCAwXG4gICAgaHRtbC5jc3MoJ3BhZGRpbmctdG9wJywgY3VycmVudE1hcmdpbiAtIEBlbGVtZW50Lm91dGVySGVpZ2h0KCkpXG4gICAgQGVsZW1lbnQucmVtb3ZlKClcblxuICAjIEFkZHMgbWFyZ2luIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50IHRvIGVuc3VyZSB0aGF0IHRoZSBhbm5vdGF0aW9uIHRvb2xiYXJcbiAgIyBkb2Vzbid0IGNvdmVyIHRoZSBwYWdlIHdoZW4gbm90IHNjcm9sbGVkLlxuICAjXG4gICMgUmV0dXJucyBpdHNlbGZcbiAgX2luc2VydFNwYWNlcjogLT5cbiAgICBodG1sID0gJCgnaHRtbCcpXG4gICAgY3VycmVudE1hcmdpbiA9IHBhcnNlSW50KGh0bWwuY3NzKCdwYWRkaW5nLXRvcCcpLCAxMCkgfHwgMFxuICAgIGh0bWwuY3NzKCdwYWRkaW5nLXRvcCcsIGN1cnJlbnRNYXJnaW4gKyBAZWxlbWVudC5vdXRlckhlaWdodCgpKVxuICAgIHRoaXNcblxuICAjIExpc3RlbnMgdG8gYW5ub3RhdGlvbiBjaGFuZ2UgZXZlbnRzIG9uIHRoZSBBbm5vdGF0b3IgaW4gb3JkZXIgdG8gcmVmcmVzaFxuICAjIHRoZSBAYW5ub3RhdGlvbnMgY29sbGVjdGlvbi5cbiAgIyBUT0RPOiBNYWtlIHRoaXMgbW9yZSBncmFudWxhciBzbyB0aGUgZW50aXJlIGNvbGxlY3Rpb24gaXNuJ3QgcmVsb2FkZWQgZm9yXG4gICMgZXZlcnkgc2luZ2xlIGNoYW5nZS5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmLlxuICBfc2V0dXBMaXN0ZW5lcnM6IC0+XG4gICAgZXZlbnRzID0gW1xuICAgICAgJ2Fubm90YXRpb25zTG9hZGVkJywgJ2Fubm90YXRpb25DcmVhdGVkJyxcbiAgICAgICdhbm5vdGF0aW9uVXBkYXRlZCcsICdhbm5vdGF0aW9uRGVsZXRlZCdcbiAgICBdXG5cbiAgICBmb3IgZXZlbnQgaW4gZXZlbnRzXG4gICAgICBAYW5ub3RhdG9yLnN1YnNjcmliZSBldmVudCwgdGhpcy51cGRhdGVIaWdobGlnaHRzXG4gICAgdGhpc1xuXG4gICMgUHVibGljOiBBZGRzIGEgZmlsdGVyIHRvIHRoZSB0b29sYmFyLiBUaGUgZmlsdGVyIG11c3QgaGF2ZSBib3RoIGEgbGFiZWxcbiAgIyBhbmQgYSBwcm9wZXJ0eSBvZiBhbiBhbm5vdGF0aW9uIG9iamVjdCB0byBmaWx0ZXIgb24uXG4gICNcbiAgIyBvcHRpb25zIC0gQW4gT2JqZWN0IGxpdGVyYWwgY29udGFpbmluZyB0aGUgZmlsdGVycyBvcHRpb25zLlxuICAjICAgICAgICAgICBsYWJlbCAgICAgIC0gQSBwdWJsaWMgZmFjaW5nIFN0cmluZyB0byByZXByZXNlbnQgdGhlIGZpbHRlci5cbiAgIyAgICAgICAgICAgcHJvcGVydHkgICAtIEFuIGFubm90YXRpb24gcHJvcGVydHkgU3RyaW5nIHRvIGZpbHRlciBvbi5cbiAgIyAgICAgICAgICAgaXNGaWx0ZXJlZCAtIEEgY2FsbGJhY2sgRnVuY3Rpb24gdGhhdCByZWNpZXZlcyB0aGUgZmllbGQgaW5wdXRcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFuZCB0aGUgYW5ub3RhdGlvbiBwcm9wZXJ0eSB2YWx1ZS4gU2VlXG4gICMgICAgICAgICAgICAgICAgICAgICAgICBAb3B0aW9ucy5pc0ZpbHRlcmVkKCkgZm9yIGRldGFpbHMuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIFNldCB1cCBhIGZpbHRlciB0byBmaWx0ZXIgb24gdGhlIGFubm90YXRpb24udXNlciBwcm9wZXJ0eS5cbiAgIyAgIGZpbHRlci5hZGRGaWx0ZXIoe1xuICAjICAgICBsYWJlbDogVXNlcixcbiAgIyAgICAgcHJvcGVydHk6ICd1c2VyJ1xuICAjICAgfSlcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nLlxuICBhZGRGaWx0ZXI6IChvcHRpb25zKSAtPlxuICAgIGZpbHRlciA9ICQuZXh0ZW5kKHtcbiAgICAgIGxhYmVsOiAnJ1xuICAgICAgcHJvcGVydHk6ICcnXG4gICAgICBpc0ZpbHRlcmVkOiBAb3B0aW9ucy5pc0ZpbHRlcmVkXG4gICAgfSwgb3B0aW9ucylcblxuICAgICMgU2tpcCBpZiBhIGZpbHRlciBmb3IgdGhpcyBwcm9wZXJ0eSBoYXMgYmVlbiBsb2FkZWQuXG4gICAgdW5sZXNzIChmIGZvciBmIGluIEBmaWx0ZXJzIHdoZW4gZi5wcm9wZXJ0eSA9PSBmaWx0ZXIucHJvcGVydHkpLmxlbmd0aFxuICAgICAgZmlsdGVyLmlkID0gJ2Fubm90YXRvci1maWx0ZXItJyArIGZpbHRlci5wcm9wZXJ0eVxuICAgICAgZmlsdGVyLmFubm90YXRpb25zID0gW11cbiAgICAgIGZpbHRlci5lbGVtZW50ID0gQGZpbHRlci5jbG9uZSgpLmFwcGVuZFRvKEBlbGVtZW50KVxuICAgICAgZmlsdGVyLmVsZW1lbnQuZmluZCgnbGFiZWwnKVxuICAgICAgICAuaHRtbChmaWx0ZXIubGFiZWwpXG4gICAgICAgIC5hdHRyKCdmb3InLCBmaWx0ZXIuaWQpXG4gICAgICBmaWx0ZXIuZWxlbWVudC5maW5kKCdpbnB1dCcpXG4gICAgICAgIC5hdHRyKHtcbiAgICAgICAgICBpZDogZmlsdGVyLmlkXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IEFubm90YXRvci5fdCgnRmlsdGVyIGJ5ICcpICsgZmlsdGVyLmxhYmVsICsgJ1xcdTIwMjYnXG4gICAgICAgIH0pXG4gICAgICBmaWx0ZXIuZWxlbWVudC5maW5kKCdidXR0b24nKS5oaWRlKClcblxuICAgICAgIyBBZGQgdGhlIGZpbHRlciB0byB0aGUgZWxlbWVudHMgZGF0YSBzdG9yZS5cbiAgICAgIGZpbHRlci5lbGVtZW50LmRhdGEgJ2ZpbHRlcicsIGZpbHRlclxuXG4gICAgICBAZmlsdGVycy5wdXNoIGZpbHRlclxuXG4gICAgdGhpc1xuXG4gICMgUHVibGljOiBVcGRhdGVzIHRoZSBmaWx0ZXIuYW5ub3RhdGlvbnMgcHJvcGVydHkuIFRoZW4gdXBkYXRlcyB0aGUgc3RhdGVcbiAgIyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIERPTS4gQ2FsbHMgdGhlIGZpbHRlci5pc0ZpbHRlcmVkKCkgbWV0aG9kIHRvXG4gICMgZGV0ZXJtaW5lIGlmIHRoZSBhbm5vdGF0aW9uIHNob3VsZCByZW1haW4uXG4gICNcbiAgIyBmaWx0ZXIgLSBBIGZpbHRlciBPYmplY3QgZnJvbSBAZmlsdGVyc1xuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgZmlsdGVyLnVwZGF0ZUZpbHRlcihteUZpbHRlcilcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZ1xuICB1cGRhdGVGaWx0ZXI6IChmaWx0ZXIpIC0+XG4gICAgZmlsdGVyLmFubm90YXRpb25zID0gW11cblxuICAgIHRoaXMudXBkYXRlSGlnaGxpZ2h0cygpXG4gICAgdGhpcy5yZXNldEhpZ2hsaWdodHMoKVxuICAgIGlucHV0ID0gJC50cmltIGZpbHRlci5lbGVtZW50LmZpbmQoJ2lucHV0JykudmFsKClcblxuICAgIGlmIGlucHV0XG4gICAgICBhbm5vdGF0aW9ucyA9IEBoaWdobGlnaHRzLm1hcCAtPiAkKHRoaXMpLmRhdGEoJ2Fubm90YXRpb24nKVxuXG4gICAgICBmb3IgYW5ub3RhdGlvbiBpbiAkLm1ha2VBcnJheShhbm5vdGF0aW9ucylcbiAgICAgICAgcHJvcGVydHkgPSBhbm5vdGF0aW9uW2ZpbHRlci5wcm9wZXJ0eV1cbiAgICAgICAgaWYgZmlsdGVyLmlzRmlsdGVyZWQgaW5wdXQsIHByb3BlcnR5XG4gICAgICAgICAgZmlsdGVyLmFubm90YXRpb25zLnB1c2ggYW5ub3RhdGlvblxuXG4gICAgICB0aGlzLmZpbHRlckhpZ2hsaWdodHMoKVxuXG4gICMgUHVibGljOiBVcGRhdGVzIHRoZSBAaGlnaGxpZ2h0cyBwcm9wZXJ0eSB3aXRoIHRoZSBsYXRlc3QgaGlnaGxpZ2h0XG4gICMgZWxlbWVudHMgaW4gdGhlIERPTS5cbiAgI1xuICAjIFJldHVybnMgYSBqUXVlcnkgY29sbGVjdGlvbiBvZiB0aGUgaGlnaGxpZ2h0IGVsZW1lbnRzLlxuICB1cGRhdGVIaWdobGlnaHRzOiA9PlxuICAgICMgSWdub3JlIGFueSBoaWRkZW4gaGlnaGxpZ2h0cy5cbiAgICBAaGlnaGxpZ2h0cyA9IEBhbm5vdGF0b3IuZWxlbWVudC5maW5kKCcuYW5ub3RhdG9yLWhsOnZpc2libGUnKVxuICAgIEBmaWx0ZXJlZCAgID0gQGhpZ2hsaWdodHMubm90KEBjbGFzc2VzLmhsLmhpZGUpXG5cbiAgIyBQdWJsaWM6IFJ1bnMgdGhyb3VnaCBlYWNoIG9mIHRoZSBmaWx0ZXJzIGFuZCByZW1vdmVzIGFsbCBoaWdobGlnaHRzIG5vdFxuICAjIGN1cnJlbnRseSBpbiBzY29wZS5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgZmlsdGVySGlnaGxpZ2h0czogLT5cbiAgICBhY3RpdmVGaWx0ZXJzID0gJC5ncmVwIEBmaWx0ZXJzLCAoZmlsdGVyKSAtPiAhIWZpbHRlci5hbm5vdGF0aW9ucy5sZW5ndGhcblxuICAgIGZpbHRlcmVkID0gYWN0aXZlRmlsdGVyc1swXT8uYW5ub3RhdGlvbnMgfHwgW11cbiAgICBpZiBhY3RpdmVGaWx0ZXJzLmxlbmd0aCA+IDFcbiAgICAgICMgSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgZmlsdGVyIHRoZW4gb25seSBhbm5vdGF0aW9ucyBtYXRjaGVkIGluIGV2ZXJ5XG4gICAgICAjIGZpbHRlciBzaG91bGQgcmVtYWluLlxuICAgICAgYW5ub3RhdGlvbnMgPSBbXVxuICAgICAgJC5lYWNoIGFjdGl2ZUZpbHRlcnMsIC0+XG4gICAgICAgICQubWVyZ2UoYW5ub3RhdGlvbnMsIHRoaXMuYW5ub3RhdGlvbnMpXG5cbiAgICAgIHVuaXF1ZXMgID0gW11cbiAgICAgIGZpbHRlcmVkID0gW11cbiAgICAgICQuZWFjaCBhbm5vdGF0aW9ucywgLT5cbiAgICAgICAgaWYgJC5pbkFycmF5KHRoaXMsIHVuaXF1ZXMpID09IC0xXG4gICAgICAgICAgdW5pcXVlcy5wdXNoIHRoaXNcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGZpbHRlcmVkLnB1c2ggdGhpc1xuXG4gICAgaGlnaGxpZ2h0cyA9IEBoaWdobGlnaHRzXG4gICAgZm9yIGFubm90YXRpb24sIGluZGV4IGluIGZpbHRlcmVkXG4gICAgICBoaWdobGlnaHRzID0gaGlnaGxpZ2h0cy5ub3QoYW5ub3RhdGlvbi5oaWdobGlnaHRzKVxuXG4gICAgaGlnaGxpZ2h0cy5hZGRDbGFzcyhAY2xhc3Nlcy5obC5oaWRlKVxuXG4gICAgQGZpbHRlcmVkID0gQGhpZ2hsaWdodHMubm90KEBjbGFzc2VzLmhsLmhpZGUpXG4gICAgdGhpc1xuXG4gICMgUHVibGljOiBSZW1vdmVzIGhpZGRlbiBjbGFzcyBmcm9tIGFsbCBhbm5vdGF0aW9ucy5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgcmVzZXRIaWdobGlnaHRzOiAtPlxuICAgIEBoaWdobGlnaHRzLnJlbW92ZUNsYXNzKEBjbGFzc2VzLmhsLmhpZGUpXG4gICAgQGZpbHRlcmVkID0gQGhpZ2hsaWdodHNcbiAgICB0aGlzXG5cbiAgIyBVcGRhdGVzIHRoZSBmaWx0ZXIgZmllbGQgb24gZm9jdXMuXG4gICNcbiAgIyBldmVudCAtIEEgZm9jdXMgRXZlbnQgb2JqZWN0LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nXG4gIF9vbkZpbHRlckZvY3VzOiAoZXZlbnQpID0+XG4gICAgaW5wdXQgPSAkKGV2ZW50LnRhcmdldClcbiAgICBpbnB1dC5wYXJlbnQoKS5hZGRDbGFzcyhAY2xhc3Nlcy5hY3RpdmUpXG4gICAgaW5wdXQubmV4dCgnYnV0dG9uJykuc2hvdygpXG5cbiAgIyBVcGRhdGVzIHRoZSBmaWx0ZXIgZmllbGQgb24gYmx1ci5cbiAgI1xuICAjIGV2ZW50IC0gQSBibHVyIEV2ZW50IG9iamVjdC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgX29uRmlsdGVyQmx1cjogKGV2ZW50KSA9PlxuICAgIHVubGVzcyBldmVudC50YXJnZXQudmFsdWVcbiAgICAgIGlucHV0ID0gJChldmVudC50YXJnZXQpXG4gICAgICBpbnB1dC5wYXJlbnQoKS5yZW1vdmVDbGFzcyhAY2xhc3Nlcy5hY3RpdmUpXG4gICAgICBpbnB1dC5uZXh0KCdidXR0b24nKS5oaWRlKClcblxuICAjIFVwZGF0ZXMgdGhlIGZpbHRlciBiYXNlZCBvbiB0aGUgaWQgb2YgdGhlIGZpbHRlciBlbGVtZW50LlxuICAjXG4gICMgZXZlbnQgLSBBIGtleXVwIEV2ZW50XG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIF9vbkZpbHRlcktleXVwOiAoZXZlbnQpID0+XG4gICAgZmlsdGVyID0gJChldmVudC50YXJnZXQpLnBhcmVudCgpLmRhdGEoJ2ZpbHRlcicpXG4gICAgdGhpcy51cGRhdGVGaWx0ZXIgZmlsdGVyIGlmIGZpbHRlclxuXG4gICMgTG9jYXRlcyB0aGUgbmV4dC9wcmV2aW91cyBoaWdobGlnaHRlZCBlbGVtZW50IGluIEBoaWdobGlnaHRzIGZyb20gdGhlXG4gICMgY3VycmVudCBvbmUgb3IgZ29lcyB0byB0aGUgdmVyeSBmaXJzdC9sYXN0IGVsZW1lbnQgcmVzcGVjdGl2ZWx5LlxuICAjXG4gICMgcHJldmlvdXMgLSBJZiB0cnVlIGZpbmRzIHRoZSBwcmV2aW91c2x5IGhpZ2hsaWdodGVkIGVsZW1lbnQuXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZi5cbiAgX2ZpbmROZXh0SGlnaGxpZ2h0OiAocHJldmlvdXMpIC0+XG4gICAgcmV0dXJuIHRoaXMgdW5sZXNzIEBoaWdobGlnaHRzLmxlbmd0aFxuXG4gICAgb2Zmc2V0ICAgICAgPSBpZiBwcmV2aW91cyB0aGVuIDAgICAgZWxzZSAtMVxuICAgIHJlc2V0T2Zmc2V0ID0gaWYgcHJldmlvdXMgdGhlbiAtMSAgIGVsc2UgMFxuICAgIG9wZXJhdG9yICAgID0gaWYgcHJldmlvdXMgdGhlbiAnbHQnIGVsc2UgJ2d0J1xuXG4gICAgYWN0aXZlICA9IEBoaWdobGlnaHRzLm5vdCgnLicgKyBAY2xhc3Nlcy5obC5oaWRlKVxuICAgIGN1cnJlbnQgPSBhY3RpdmUuZmlsdGVyKCcuJyArIEBjbGFzc2VzLmhsLmFjdGl2ZSlcbiAgICBjdXJyZW50ID0gYWN0aXZlLmVxKG9mZnNldCkgdW5sZXNzIGN1cnJlbnQubGVuZ3RoXG5cbiAgICBhbm5vdGF0aW9uID0gY3VycmVudC5kYXRhICdhbm5vdGF0aW9uJ1xuXG4gICAgaW5kZXggPSBhY3RpdmUuaW5kZXggY3VycmVudFswXVxuICAgIG5leHQgID0gYWN0aXZlLmZpbHRlcihcIjoje29wZXJhdG9yfSgje2luZGV4fSlcIikubm90KGFubm90YXRpb24uaGlnaGxpZ2h0cykuZXEocmVzZXRPZmZzZXQpXG4gICAgbmV4dCAgPSBhY3RpdmUuZXEocmVzZXRPZmZzZXQpIHVubGVzcyBuZXh0Lmxlbmd0aFxuXG4gICAgdGhpcy5fc2Nyb2xsVG9IaWdobGlnaHQgbmV4dC5kYXRhKCdhbm5vdGF0aW9uJykuaGlnaGxpZ2h0c1xuXG4gICMgTG9jYXRlcyB0aGUgbmV4dCBoaWdobGlnaHRlZCBlbGVtZW50IGluIEBoaWdobGlnaHRzIGZyb20gdGhlIGN1cnJlbnQgb25lXG4gICMgb3IgZ29lcyB0byB0aGUgdmVyeSBmaXJzdCBlbGVtZW50LlxuICAjXG4gICMgZXZlbnQgLSBBIGNsaWNrIEV2ZW50LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nXG4gIF9vbk5leHRDbGljazogKGV2ZW50KSA9PlxuICAgIHRoaXMuX2ZpbmROZXh0SGlnaGxpZ2h0KClcblxuICAjIExvY2F0ZXMgdGhlIHByZXZpb3VzIGhpZ2hsaWdodGVkIGVsZW1lbnQgaW4gQGhpZ2hsaWdodHMgZnJvbSB0aGUgY3VycmVudCBvbmVcbiAgIyBvciBnb2VzIHRvIHRoZSB2ZXJ5IGxhc3QgZWxlbWVudC5cbiAgI1xuICAjIGV2ZW50IC0gQSBjbGljayBFdmVudC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZ1xuICBfb25QcmV2aW91c0NsaWNrOiAoZXZlbnQpID0+XG4gICAgdGhpcy5fZmluZE5leHRIaWdobGlnaHQgdHJ1ZVxuXG4gICMgU2Nyb2xscyB0byB0aGUgaGlnaGxpZ2h0IHByb3ZpZGVkLiBBbiBhZGRzIGFuIGFjdGl2ZSBjbGFzcyB0byBpdC5cbiAgI1xuICAjIGhpZ2hsaWdodCAtIEVpdGhlciBoaWdobGlnaHQgRWxlbWVudCBvciBhbiBBcnJheSBvZiBlbGVtZW50cy4gVGhpcyB2YWx1ZVxuICAjICAgICAgICAgICAgIGlzIHVzdWFsbHkgcmV0cmlldmVkIGZyb20gYW5ub3RhdGlvbi5oaWdobGlnaHRzLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBfc2Nyb2xsVG9IaWdobGlnaHQ6IChoaWdobGlnaHQpIC0+XG4gICAgaGlnaGxpZ2h0ID0gJChoaWdobGlnaHQpXG5cbiAgICBAaGlnaGxpZ2h0cy5yZW1vdmVDbGFzcyhAY2xhc3Nlcy5obC5hY3RpdmUpXG4gICAgaGlnaGxpZ2h0LmFkZENsYXNzKEBjbGFzc2VzLmhsLmFjdGl2ZSlcblxuICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtcbiAgICAgIHNjcm9sbFRvcDogaGlnaGxpZ2h0Lm9mZnNldCgpLnRvcCAtIChAZWxlbWVudC5oZWlnaHQoKSArIDIwKVxuICAgIH0sIDE1MClcblxuICAjIENsZWFycyB0aGUgcmVsZXZhbnQgaW5wdXQgd2hlbiB0aGUgY2xlYXIgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICNcbiAgIyBldmVudCAtIEEgY2xpY2sgRXZlbnQgb2JqZWN0LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBfb25DbGVhckNsaWNrOiAoZXZlbnQpIC0+XG4gICAgJChldmVudC50YXJnZXQpLnByZXYoJ2lucHV0JykudmFsKCcnKS5rZXl1cCgpLmJsdXIoKVxuXG5cbm1vZHVsZS5leHBvcnRzID0gQW5ub3RhdG9yLlBsdWdpbi5GaWx0ZXJcbiIsIkFubm90YXRvciA9IHJlcXVpcmUoJ2Fubm90YXRvcicpXG5cblxuIyBQbHVnaW4gdGhhdCByZW5kZXJzIGFubm90YXRpb24gY29tbWVudHMgZGlzcGxheWVkIGluIHRoZSBWaWV3ZXIgaW4gTWFya2Rvd24uXG4jIFJlcXVpcmVzIFNob3dkb3duIGxpYnJhcnkgdG8gYmUgcHJlc2VudCBpbiB0aGUgcGFnZSB3aGVuIGluaXRpYWxpc2VkLlxuY2xhc3MgQW5ub3RhdG9yLlBsdWdpbi5NYXJrZG93biBleHRlbmRzIEFubm90YXRvci5QbHVnaW5cbiAgIyBFdmVudHMgdG8gYmUgYm91bmQgdG8gdGhlIEBlbGVtZW50LlxuICBldmVudHM6XG4gICAgJ2Fubm90YXRpb25WaWV3ZXJUZXh0RmllbGQnOiAndXBkYXRlVGV4dEZpZWxkJ1xuXG4gICMgUHVibGljOiBJbml0YWlsaXNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFya2Rvd24gcGx1Z2luLlxuICAjXG4gICMgZWxlbWVudCAtIFRoZSBBbm5vdGF0b3IjZWxlbWVudC5cbiAgIyBvcHRpb25zIC0gQW4gb3B0aW9ucyBPYmplY3QgKHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gb3B0aW9ucykuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBwbHVnaW4gPSBuZXcgQW5ub3RhdG9yLlBsdWdpbi5NYXJrZG93bihhbm5vdGF0b3IuZWxlbWVudClcbiAgI1xuICAjIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgQW5ub3RhdG9yLlBsdWdpbi5NYXJrZG93bi5cbiAgY29uc3RydWN0b3I6IChlbGVtZW50LCBvcHRpb25zKSAtPlxuICAgIGlmIFNob3dkb3duPy5jb252ZXJ0ZXI/XG4gICAgICBzdXBlclxuICAgICAgQGNvbnZlcnRlciA9IG5ldyBTaG93ZG93bi5jb252ZXJ0ZXIoKVxuICAgIGVsc2VcbiAgICAgIGNvbnNvbGUuZXJyb3IgQW5ub3RhdG9yLl90KFwiVG8gdXNlIHRoZSBNYXJrZG93biBwbHVnaW4sIHlvdSBtdXN0IGluY2x1ZGUgU2hvd2Rvd24gaW50byB0aGUgcGFnZSBmaXJzdC5cIilcblxuICAjIEFubm90YXRvciBldmVudCBjYWxsYmFjay4gRGlzcGxheXMgdGhlIGFubm90YXRpb24udGV4dCBhcyBhIE1hcmtkb3duXG4gICMgcmVuZGVyZWQgdmVyc2lvbi5cbiAgI1xuICAjIGZpZWxkICAgICAgLSBUaGUgdmlld2VyIGZpZWxkIEVsZW1lbnQuXG4gICMgYW5ub3RhdGlvbiAtIFRoZSBhbm5vdGF0aW9uIE9iamVjdCBiZWluZyBkaXNwbGF5ZWQuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIE5vcm1hbGx5IGNhbGxlZCBieSBBbm5vdGF0b3Ijdmlld2VyKClcbiAgIyAgIHBsdWdpbi51cGRhdGVUZXh0RmllbGQoZmllbGQsIHt0ZXh0OiAnTXkgX21hcmtkb3duXyBjb21tZW50J30pXG4gICMgICAkKGZpZWxkKS5odG1sKCkgIyA9PiBSZXR1cm5zIFwiTXkgPGVtPm1hcmtkb3duPC9lbT4gY29tbWVudFwiXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmdcbiAgdXBkYXRlVGV4dEZpZWxkOiAoZmllbGQsIGFubm90YXRpb24pID0+XG4gICAgIyBFc2NhcGUgYW55IEhUTUwgaW4gdGhlIHRleHQgdG8gcHJldmVudCBYU1MuXG4gICAgdGV4dCA9IEFubm90YXRvci5VdGlsLmVzY2FwZShhbm5vdGF0aW9uLnRleHQgfHwgJycpXG4gICAgJChmaWVsZCkuaHRtbCh0aGlzLmNvbnZlcnQodGV4dCkpXG5cbiAgIyBDb252ZXJ0cyBwcm92aWRlZCB0ZXh0IGludG8gbWFya2Rvd24uXG4gICNcbiAgIyB0ZXh0IC0gQSBTdHJpbmcgb2YgTWFya2Rvd24gdG8gcmVuZGVyIGFzIEhUTUwuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgcGx1Z2luLmNvbnZlcnQoJ1RoaXMgaXMgX3ZlcnlfIGJhc2ljIFtNYXJrZG93bl0oaHR0cDovL2RhcmluZ2ZpcmViYWxsLmNvbSknKVxuICAjICMgPT4gUmV0dXJucyBcIlRoaXMgaXMgPGVtPnZlcnk8ZW0+IGJhc2ljIDxhIGhyZWY9XCJodHRwOi8vLi4uXCI+TWFya2Rvd248L2E+XCJcbiAgI1xuICAjIFJldHVybnMgSFRNTCBzdHJpbmcuXG4gIGNvbnZlcnQ6ICh0ZXh0KSAtPlxuICAgIEBjb252ZXJ0ZXIubWFrZUh0bWwgdGV4dFxuXG5cbm1vZHVsZS5leHBvcnRzID0gQW5ub3RhdG9yLlBsdWdpbi5NYXJrZG93blxuIiwiQW5ub3RhdG9yID0gcmVxdWlyZSgnYW5ub3RhdG9yJylcblxuXG4jIFB1YmxpYzogUGx1Z2luIGZvciBzZXR0aW5nIHBlcm1pc3Npb25zIG9uIG5ld2x5IGNyZWF0ZWQgYW5ub3RhdGlvbnMgYXMgd2VsbCBhc1xuIyBtYW5hZ2luZyB1c2VyIHBlcm1pc3Npb25zIHN1Y2ggYXMgdmlld2luZy9lZGl0aW5nL2RlbGV0aW5nIGFubm90aW9ucy5cbiNcbiMgZWxlbWVudCAtIEEgRE9NIEVsZW1lbnQgdXBvbiB3aGljaCBldmVudHMgYXJlIGJvdW5kLiBXaGVuIGluaXRpYWxpc2VkIGJ5XG4jICAgICAgICAgICB0aGUgQW5ub3RhdG9yIGl0IGlzIHRoZSBBbm5vdGF0b3IgZWxlbWVudC5cbiMgb3B0aW9ucyAtIEFuIE9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcgY3VzdG9tIG9wdGlvbnMuXG4jXG4jIEV4YW1wbGVzXG4jXG4jICAgbmV3IEFubm90YXRvci5wbHVnaW4uUGVybWlzc2lvbnMoYW5ub3RhdG9yLmVsZW1lbnQsIHtcbiMgICAgIHVzZXI6ICdBbGljZSdcbiMgICB9KVxuI1xuIyBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQZXJtaXNzaW9ucyBPYmplY3QuXG5jbGFzcyBBbm5vdGF0b3IuUGx1Z2luLlBlcm1pc3Npb25zIGV4dGVuZHMgQW5ub3RhdG9yLlBsdWdpblxuXG4gICMgQSBPYmplY3QgbGl0ZXJhbCBvZiBkZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBjbGFzcy5cbiAgb3B0aW9uczpcblxuICAgICMgRGlzcGxheXMgYW4gXCJBbnlvbmUgY2FuIHZpZXcgdGhpcyBhbm5vdGF0aW9uXCIgY2hlY2tib3ggaW4gdGhlIEVkaXRvci5cbiAgICBzaG93Vmlld1Blcm1pc3Npb25zQ2hlY2tib3g6IHRydWVcblxuICAgICMgRGlzcGxheXMgYW4gXCJBbnlvbmUgY2FuIGVkaXQgdGhpcyBhbm5vdGF0aW9uXCIgY2hlY2tib3ggaW4gdGhlIEVkaXRvci5cbiAgICBzaG93RWRpdFBlcm1pc3Npb25zQ2hlY2tib3g6IHRydWVcblxuICAgICMgUHVibGljOiBVc2VkIGJ5IHRoZSBwbHVnaW4gdG8gZGV0ZXJtaW5lIGEgdW5pcXVlIGlkIGZvciB0aGUgQHVzZXIgcHJvcGVydHkuXG4gICAgIyBCeSBkZWZhdWx0IHRoaXMgYWNjZXB0cyBhbmQgcmV0dXJucyB0aGUgdXNlciBTdHJpbmcgYnV0IGNhbiBiZSBvdmVyLVxuICAgICMgcmlkZGVuIGluIHRoZSBAb3B0aW9ucyBvYmplY3QgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICNcbiAgICAjIHVzZXIgLSBBIFN0cmluZyB1c2VybmFtZSBvciBudWxsIGlmIG5vIHVzZXIgaXMgc2V0LlxuICAgICNcbiAgICAjIFJldHVybnMgdGhlIFN0cmluZyBwcm92aWRlZCBhcyB1c2VyIG9iamVjdC5cbiAgICB1c2VySWQ6ICh1c2VyKSAtPiB1c2VyXG5cbiAgICAjIFB1YmxpYzogVXNlZCBieSB0aGUgcGx1Z2luIHRvIGRldGVybWluZSBhIGRpc3BsYXkgbmFtZSBmb3IgdGhlIEB1c2VyXG4gICAgIyBwcm9wZXJ0eS4gQnkgZGVmYXVsdCB0aGlzIGFjY2VwdHMgYW5kIHJldHVybnMgdGhlIHVzZXIgU3RyaW5nIGJ1dCBjYW4gYmVcbiAgICAjIG92ZXItcmlkZGVuIGluIHRoZSBAb3B0aW9ucyBvYmplY3QgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICNcbiAgICAjIHVzZXIgLSBBIFN0cmluZyB1c2VybmFtZSBvciBudWxsIGlmIG5vIHVzZXIgaXMgc2V0LlxuICAgICNcbiAgICAjIFJldHVybnMgdGhlIFN0cmluZyBwcm92aWRlZCBhcyB1c2VyIG9iamVjdFxuICAgIHVzZXJTdHJpbmc6ICh1c2VyKSAtPiB1c2VyXG5cbiAgICAjIFB1YmxpYzogVXNlZCBieSBQZXJtaXNzaW9ucyNhdXRob3JpemUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSB1c2VyIGNhblxuICAgICMgcGVyZm9ybSBhbiBhY3Rpb24gb24gYW4gYW5ub3RhdGlvbi4gT3ZlcnJpZGluZyB0aGlzIGZ1bmN0aW9uIGFsbG93c1xuICAgICMgYSBmYXIgbW9yZSBjb21wbGV4IHBlcm1pc3Npb25zIHN5c3llbS5cbiAgICAjXG4gICAgIyBCeSBkZWZhdWx0IHRoaXMgYXV0aG9yaXplcyB0aGUgYWN0aW9uIGlmIGFueSBvZiB0aHJlZSBzY2VuYXJpb3MgYXJlIHRydWU6XG4gICAgI1xuICAgICMgICAgIDEpIHRoZSBhbm5vdGF0aW9uIGhhcyBhICdwZXJtaXNzaW9ucycgb2JqZWN0LCBhbmQgZWl0aGVyIHRoZSBmaWVsZCBmb3JcbiAgICAjICAgICAgICB0aGUgc3BlY2lmaWVkIGFjdGlvbiBpcyBtaXNzaW5nLCBlbXB0eSwgb3IgY29udGFpbnMgdGhlIHVzZXJJZCBvZiB0aGVcbiAgICAjICAgICAgICBjdXJyZW50IHVzZXIsIGkuZS4gQG9wdGlvbnMudXNlcklkKEB1c2VyKVxuICAgICNcbiAgICAjICAgICAyKSB0aGUgYW5ub3RhdGlvbiBoYXMgYSAndXNlcicgcHJvcGVydHksIGFuZCBAb3B0aW9ucy51c2VySWQoQHVzZXIpIG1hdGNoZXNcbiAgICAjICAgICAgICAnYW5ub3RhdGlvbi51c2VyJ1xuICAgICNcbiAgICAjICAgICAzKSB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gJ3Blcm1pc3Npb25zJyBvciAndXNlcicgcHJvcGVydGllc1xuICAgICNcbiAgICAjIGFubm90YXRpb24gLSBUaGUgYW5ub3RhdGlvbiBvbiB3aGljaCB0aGUgYWN0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAjIGFjdGlvbiAtIFRoZSBhY3Rpb24gYmVpbmcgcmVxdWVzdGVkOiBlLmcuICd1cGRhdGUnLCAnZGVsZXRlJy5cbiAgICAjIHVzZXIgLSBUaGUgdXNlciBvYmplY3QgKG9yIHN0cmluZykgcmVxdWVzdGluZyB0aGUgYWN0aW9uLiBUaGlzIGlzIHVzdWFsbHlcbiAgICAjICAgICAgICBhdXRvbWF0aWNhbGx5IHBhc3NlZCBieSBQZXJtaXNzaW9ucyNhdXRob3JpemUgYXMgdGhlIGN1cnJlbnQgdXNlciAoQHVzZXIpXG4gICAgI1xuICAgICMgICBwZXJtaXNzaW9ucy5zZXRVc2VyKG51bGwpXG4gICAgIyAgIHBlcm1pc3Npb25zLmF1dGhvcml6ZSgndXBkYXRlJywge30pXG4gICAgIyAgICMgPT4gdHJ1ZVxuICAgICNcbiAgICAjICAgcGVybWlzc2lvbnMuc2V0VXNlcignYWxpY2UnKVxuICAgICMgICBwZXJtaXNzaW9ucy5hdXRob3JpemUoJ3VwZGF0ZScsIHt1c2VyOiAnYWxpY2UnfSlcbiAgICAjICAgIyA9PiB0cnVlXG4gICAgIyAgIHBlcm1pc3Npb25zLmF1dGhvcml6ZSgndXBkYXRlJywge3VzZXI6ICdib2InfSlcbiAgICAjICAgIyA9PiBmYWxzZVxuICAgICNcbiAgICAjICAgcGVybWlzc2lvbnMuc2V0VXNlcignYWxpY2UnKVxuICAgICMgICBwZXJtaXNzaW9ucy5hdXRob3JpemUoJ3VwZGF0ZScsIHtcbiAgICAjICAgICB1c2VyOiAnYm9iJyxcbiAgICAjICAgICBwZXJtaXNzaW9uczogWyd1cGRhdGUnOiBbJ2FsaWNlJywgJ2JvYiddXVxuICAgICMgICB9KVxuICAgICMgICAjID0+IHRydWVcbiAgICAjICAgcGVybWlzc2lvbnMuYXV0aG9yaXplKCdkZXN0cm95Jywge1xuICAgICMgICAgIHVzZXI6ICdib2InLFxuICAgICMgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgIyAgICAgICAndXBkYXRlJzogWydhbGljZScsICdib2InXVxuICAgICMgICAgICAgJ2Rlc3Ryb3knOiBbJ2JvYiddXG4gICAgIyAgICAgXVxuICAgICMgICB9KVxuICAgICMgICAjID0+IGZhbHNlXG4gICAgI1xuICAgICMgUmV0dXJucyBhIEJvb2xlYW4sIHRydWUgaWYgdGhlIHVzZXIgaXMgYXV0aG9yaXNlZCBmb3IgdGhlIHRva2VuIHByb3ZpZGVkLlxuICAgIHVzZXJBdXRob3JpemU6IChhY3Rpb24sIGFubm90YXRpb24sIHVzZXIpIC0+XG4gICAgICAjIEZpbmUtZ3JhaW5lZCBjdXN0b20gYXV0aG9yaXphdGlvblxuICAgICAgaWYgYW5ub3RhdGlvbi5wZXJtaXNzaW9uc1xuICAgICAgICB0b2tlbnMgPSBhbm5vdGF0aW9uLnBlcm1pc3Npb25zW2FjdGlvbl0gfHwgW11cblxuICAgICAgICBpZiB0b2tlbnMubGVuZ3RoID09IDBcbiAgICAgICAgICAjIEVtcHR5IG9yIG1pc3NpbmcgdG9rZW5zIGFycmF5OiBhbnlvbmUgY2FuIHBlcmZvcm0gYWN0aW9uLlxuICAgICAgICAgIHJldHVybiB0cnVlXG5cbiAgICAgICAgZm9yIHRva2VuIGluIHRva2Vuc1xuICAgICAgICAgIGlmIHRoaXMudXNlcklkKHVzZXIpID09IHRva2VuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgICAgICMgTm8gdG9rZW5zIG1hdGNoZWQ6IGFjdGlvbiBzaG91bGQgbm90IGJlIHBlcmZvcm1lZC5cbiAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICAgICMgQ29hcnNlLWdyYWluZWQgYXV0aG9yaXphdGlvblxuICAgICAgZWxzZSBpZiBhbm5vdGF0aW9uLnVzZXJcbiAgICAgICAgaWYgdXNlclxuICAgICAgICAgIHJldHVybiB0aGlzLnVzZXJJZCh1c2VyKSA9PSB0aGlzLnVzZXJJZChhbm5vdGF0aW9uLnVzZXIpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgIyBObyBhdXRob3JpemF0aW9uIGluZm8gb24gYW5ub3RhdGlvbjogZnJlZS1mb3ItYWxsIVxuICAgICAgdHJ1ZVxuXG4gICAgIyBEZWZhdWx0IHVzZXIgb2JqZWN0LlxuICAgIHVzZXI6ICcnXG5cbiAgICAjIERlZmF1bHQgcGVybWlzc2lvbnMgZm9yIGFsbCBhbm5vdGF0aW9ucy4gQW55b25lIGNhbiBkbyBhbnl0aGluZ1xuICAgICMgKGFzc3VtaW5nIGRlZmF1bHQgdXNlckF1dGhvcml6ZSBmdW5jdGlvbikuXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICdyZWFkJzogICBbXVxuICAgICAgJ3VwZGF0ZSc6IFtdXG4gICAgICAnZGVsZXRlJzogW11cbiAgICAgICdhZG1pbic6ICBbXVxuICAgIH1cblxuICAjIFRoZSBjb25zdHJ1Y3RvciBjYWxsZWQgd2hlbiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGVybWlzc2lvbnNcbiAgIyBwbHVnaW4gaXMgY3JlYXRlZC4gU2VlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIHVzYWdlLlxuICAjXG4gICMgZWxlbWVudCAtIEEgRE9NIEVsZW1lbnQgdXBvbiB3aGljaCBldmVudHMgYXJlIGJvdW5kLi5cbiAgIyBvcHRpb25zIC0gQW4gT2JqZWN0IGxpdGVyYWwgY29udGFpbmluZyBjdXN0b20gb3B0aW9ucy5cbiAgI1xuICAjIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBlcm1pc3Npb25zIG9iamVjdC5cbiAgY29uc3RydWN0b3I6IChlbGVtZW50LCBvcHRpb25zKSAtPlxuICAgIHN1cGVyXG5cbiAgICBpZiBAb3B0aW9ucy51c2VyXG4gICAgICB0aGlzLnNldFVzZXIoQG9wdGlvbnMudXNlcilcbiAgICAgIGRlbGV0ZSBAb3B0aW9ucy51c2VyXG5cbiAgIyBQdWJsaWM6IEluaXRpYWxpemVzIHRoZSBwbHVnaW4gYW5kIHJlZ2lzdGVycyBmaWVsZHMgd2l0aCB0aGVcbiAgIyBBbm5vdGF0b3IuRWRpdG9yIGFuZCBBbm5vdGF0b3IuVmlld2VyLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBwbHVnaW5Jbml0OiAtPlxuICAgIHJldHVybiB1bmxlc3MgQW5ub3RhdG9yLnN1cHBvcnRlZCgpXG5cbiAgICBAYW5ub3RhdG9yLnN1YnNjcmliZSgnYmVmb3JlQW5ub3RhdGlvbkNyZWF0ZWQnLCB0aGlzLmFkZEZpZWxkc1RvQW5ub3RhdGlvbilcblxuICAgIHNlbGYgPSB0aGlzXG4gICAgY3JlYXRlQ2FsbGJhY2sgPSAobWV0aG9kLCB0eXBlKSAtPlxuICAgICAgKGZpZWxkLCBhbm5vdGF0aW9uKSAtPiBzZWxmW21ldGhvZF0uY2FsbChzZWxmLCB0eXBlLCBmaWVsZCwgYW5ub3RhdGlvbilcblxuICAgICMgU2V0IHVwIHVzZXIgYW5kIGRlZmF1bHQgcGVybWlzc2lvbnMgZnJvbSBhdXRoIHRva2VuIGlmIG5vbmUgY3VycmVudGx5IGdpdmVuXG4gICAgaWYgIUB1c2VyIGFuZCBAYW5ub3RhdG9yLnBsdWdpbnMuQXV0aFxuICAgICAgQGFubm90YXRvci5wbHVnaW5zLkF1dGgud2l0aFRva2VuKHRoaXMuX3NldEF1dGhGcm9tVG9rZW4pXG5cbiAgICBpZiBAb3B0aW9ucy5zaG93Vmlld1Blcm1pc3Npb25zQ2hlY2tib3ggPT0gdHJ1ZVxuICAgICAgQGFubm90YXRvci5lZGl0b3IuYWRkRmllbGQoe1xuICAgICAgICB0eXBlOiAgICdjaGVja2JveCdcbiAgICAgICAgbGFiZWw6ICBBbm5vdGF0b3IuX3QoJ0FsbG93IGFueW9uZSB0byA8c3Ryb25nPnZpZXc8L3N0cm9uZz4gdGhpcyBhbm5vdGF0aW9uJylcbiAgICAgICAgbG9hZDogICBjcmVhdGVDYWxsYmFjaygndXBkYXRlUGVybWlzc2lvbnNGaWVsZCcsICdyZWFkJylcbiAgICAgICAgc3VibWl0OiBjcmVhdGVDYWxsYmFjaygndXBkYXRlQW5ub3RhdGlvblBlcm1pc3Npb25zJywgJ3JlYWQnKVxuICAgICAgfSlcblxuICAgIGlmIEBvcHRpb25zLnNob3dFZGl0UGVybWlzc2lvbnNDaGVja2JveCA9PSB0cnVlXG4gICAgICBAYW5ub3RhdG9yLmVkaXRvci5hZGRGaWVsZCh7XG4gICAgICAgIHR5cGU6ICAgJ2NoZWNrYm94J1xuICAgICAgICBsYWJlbDogIEFubm90YXRvci5fdCgnQWxsb3cgYW55b25lIHRvIDxzdHJvbmc+ZWRpdDwvc3Ryb25nPiB0aGlzIGFubm90YXRpb24nKVxuICAgICAgICBsb2FkOiAgIGNyZWF0ZUNhbGxiYWNrKCd1cGRhdGVQZXJtaXNzaW9uc0ZpZWxkJywgJ3VwZGF0ZScpXG4gICAgICAgIHN1Ym1pdDogY3JlYXRlQ2FsbGJhY2soJ3VwZGF0ZUFubm90YXRpb25QZXJtaXNzaW9ucycsICd1cGRhdGUnKVxuICAgICAgfSlcblxuICAgICMgU2V0dXAgdGhlIGRpc3BsYXkgb2YgYW5ub3RhdGlvbnMgaW4gdGhlIFZpZXdlci5cbiAgICBAYW5ub3RhdG9yLnZpZXdlci5hZGRGaWVsZCh7XG4gICAgICBsb2FkOiB0aGlzLnVwZGF0ZVZpZXdlclxuICAgIH0pXG5cbiAgICAjIEFkZCBhIGZpbHRlciB0byB0aGUgRmlsdGVyIHBsdWdpbiBpZiBsb2FkZWQuXG4gICAgaWYgQGFubm90YXRvci5wbHVnaW5zLkZpbHRlclxuICAgICAgQGFubm90YXRvci5wbHVnaW5zLkZpbHRlci5hZGRGaWx0ZXIoe1xuICAgICAgICBsYWJlbDogQW5ub3RhdG9yLl90KCdVc2VyJylcbiAgICAgICAgcHJvcGVydHk6ICd1c2VyJ1xuICAgICAgICBpc0ZpbHRlcmVkOiAoaW5wdXQsIHVzZXIpID0+XG4gICAgICAgICAgdXNlciA9IEBvcHRpb25zLnVzZXJTdHJpbmcodXNlcilcblxuICAgICAgICAgIHJldHVybiBmYWxzZSB1bmxlc3MgaW5wdXQgYW5kIHVzZXJcbiAgICAgICAgICBmb3Iga2V5d29yZCBpbiAoaW5wdXQuc3BsaXQgL1xccyovKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlIGlmIHVzZXIuaW5kZXhPZihrZXl3b3JkKSA9PSAtMVxuXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG5cbiAgIyBQdWJsaWM6IFNldHMgdGhlIFBlcm1pc3Npb25zI3VzZXIgcHJvcGVydHkuXG4gICNcbiAgIyB1c2VyIC0gQSBTdHJpbmcgb3IgT2JqZWN0IHRvIHJlcHJlc2VudCB0aGUgY3VycmVudCB1c2VyLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgcGVybWlzc2lvbnMuc2V0VXNlcignQWxpY2UnKVxuICAjXG4gICMgICBwZXJtaXNzaW9ucy5zZXRVc2VyKHtpZDogMzUsIG5hbWU6ICdBbGljZSd9KVxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBzZXRVc2VyOiAodXNlcikgLT5cbiAgICBAdXNlciA9IHVzZXJcblxuICAjIEV2ZW50IGNhbGxiYWNrOiBBcHBlbmRzIHRoZSBAdXNlciBhbmQgQG9wdGlvbnMucGVybWlzc2lvbnMgb2JqZWN0cyB0byB0aGVcbiAgIyBwcm92aWRlZCBhbm5vdGF0aW9uIG9iamVjdC4gT25seSBhcHBlbmRzIHRoZSB1c2VyIGlmIG9uZSBoYXMgYmVlbiBzZXQuXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBvYmplY3QuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBhbm5vdGF0aW9uID0ge3RleHQ6ICdNeSBjb21tZW50J31cbiAgIyAgIHBlcm1pc3Npb25zLmFkZEZpZWxkc1RvQW5ub3RhdGlvbihhbm5vdGF0aW9uKVxuICAjICAgY29uc29sZS5sb2coYW5ub3RhdGlvbilcbiAgIyAgICMgPT4ge3RleHQ6ICdNeSBjb21tZW50JywgcGVybWlzc2lvbnM6IHsuLi59fVxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBhZGRGaWVsZHNUb0Fubm90YXRpb246IChhbm5vdGF0aW9uKSA9PlxuICAgIGlmIGFubm90YXRpb25cbiAgICAgIGFubm90YXRpb24ucGVybWlzc2lvbnMgPSBAb3B0aW9ucy5wZXJtaXNzaW9uc1xuICAgICAgaWYgQHVzZXJcbiAgICAgICAgYW5ub3RhdGlvbi51c2VyID0gQHVzZXJcblxuICAjIFB1YmxpYzogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBhY3Rpb24gY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGVcbiAgIyBhbm5vdGF0aW9uLiBUaGlzIHVzZXMgdGhlIHVzZXItY29uZmlndXJhYmxlICd1c2VyQXV0aG9yaXplJyBtZXRob2QgdG9cbiAgIyBkZXRlcm1pbmUgaWYgYW4gYW5ub3RhdGlvbiBpcyBhbm5vdGF0YWJsZS4gU2VlIHRoZSBkZWZhdWx0IG1ldGhvZCBmb3JcbiAgIyBkb2N1bWVudGF0aW9uIG9uIGl0cyBiZWhhdmlvdXIuXG4gICNcbiAgIyBSZXR1cm5zIGEgQm9vbGVhbiwgdHJ1ZSBpZiB0aGUgYWN0aW9uIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIGFubm90YXRpb24uXG4gIGF1dGhvcml6ZTogKGFjdGlvbiwgYW5ub3RhdGlvbiwgdXNlcikgLT5cbiAgICB1c2VyID0gQHVzZXIgaWYgdXNlciA9PSB1bmRlZmluZWRcblxuICAgIGlmIEBvcHRpb25zLnVzZXJBdXRob3JpemVcbiAgICAgIHJldHVybiBAb3B0aW9ucy51c2VyQXV0aG9yaXplLmNhbGwoQG9wdGlvbnMsIGFjdGlvbiwgYW5ub3RhdGlvbiwgdXNlcilcblxuICAgIGVsc2UgIyB1c2VyQXV0aG9yaXplIG51bGxlZCBvdXQ6IGZyZWUtZm9yLWFsbCFcbiAgICAgIHJldHVybiB0cnVlXG5cbiAgIyBGaWVsZCBjYWxsYmFjazogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIFwiYW55b25lIGNhbuKAplwiIGNoZWNrYm94ZXNcbiAgI1xuICAjIGFjdGlvbiAgICAgLSBUaGUgYWN0aW9uIFN0cmluZywgZWl0aGVyIFwidmlld1wiIG9yIFwidXBkYXRlXCJcbiAgIyBmaWVsZCAgICAgIC0gQSBET00gRWxlbWVudCBjb250YWluaW5nIGEgZm9ybSBpbnB1dC5cbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBPYmplY3QuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHVwZGF0ZVBlcm1pc3Npb25zRmllbGQ6IChhY3Rpb24sIGZpZWxkLCBhbm5vdGF0aW9uKSA9PlxuICAgIGZpZWxkID0gJChmaWVsZCkuc2hvdygpXG4gICAgaW5wdXQgPSBmaWVsZC5maW5kKCdpbnB1dCcpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJylcblxuICAgICMgRG8gbm90IHNob3cgZmllbGQgaWYgY3VycmVudCB1c2VyIGlzIG5vdCBhZG1pbi5cbiAgICBmaWVsZC5oaWRlKCkgdW5sZXNzIHRoaXMuYXV0aG9yaXplKCdhZG1pbicsIGFubm90YXRpb24pXG5cbiAgICAjIFNlZSBpZiB3ZSBjYW4gYXV0aG9yaXNlIHdpdGhvdXQgYSB1c2VyLlxuICAgIGlmIHRoaXMuYXV0aG9yaXplKGFjdGlvbiwgYW5ub3RhdGlvbiB8fCB7fSwgbnVsbClcbiAgICAgIGlucHV0LmF0dHIoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpXG4gICAgZWxzZVxuICAgICAgaW5wdXQucmVtb3ZlQXR0cignY2hlY2tlZCcpXG5cblxuICAjIEZpZWxkIGNhbGxiYWNrOiB1cGRhdGVzIHRoZSBhbm5vdGF0aW9uLnBlcm1pc3Npb25zIG9iamVjdCBiYXNlZCBvbiB0aGUgc3RhdGVcbiAgIyBvZiB0aGUgZmllbGQgY2hlY2tib3guIElmIGl0IGlzIGNoZWNrZWQgdGhlbiBwZXJtaXNzaW9ucyBhcmUgc2V0IHRvIHdvcmxkXG4gICMgd3JpdGFibGUgb3RoZXJ3aXNlIHRoZXkgdXNlIHRoZSBvcmlnaW5hbCBzZXR0aW5ncy5cbiAgI1xuICAjIGFjdGlvbiAgICAgLSBUaGUgYWN0aW9uIFN0cmluZywgZWl0aGVyIFwidmlld1wiIG9yIFwidXBkYXRlXCJcbiAgIyBmaWVsZCAgICAgIC0gQSBET00gRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGFubm90YXRpb24gZWRpdG9yLlxuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgdXBkYXRlQW5ub3RhdGlvblBlcm1pc3Npb25zOiAodHlwZSwgZmllbGQsIGFubm90YXRpb24pID0+XG4gICAgYW5ub3RhdGlvbi5wZXJtaXNzaW9ucyA9IEBvcHRpb25zLnBlcm1pc3Npb25zIHVubGVzcyBhbm5vdGF0aW9uLnBlcm1pc3Npb25zXG5cbiAgICBkYXRhS2V5ID0gdHlwZSArICctcGVybWlzc2lvbnMnXG5cbiAgICBpZiAkKGZpZWxkKS5maW5kKCdpbnB1dCcpLmlzKCc6Y2hlY2tlZCcpXG4gICAgICBhbm5vdGF0aW9uLnBlcm1pc3Npb25zW3R5cGVdID0gW11cbiAgICBlbHNlXG4gICAgICAjIENsZWFybHksIHRoZSBwZXJtaXNzaW9ucyBtb2RlbCBhbGxvd3MgZm9yIG1vcmUgY29tcGxleCBlbnRyaWVzIHRoYW4gdGhpcyxcbiAgICAgICMgYnV0IG91ciBVSSBwcmVzZW50cyBhIGNoZWNrYm94LCBzbyB3ZSBjYW4gb25seSBpbnRlcnByZXQgXCJwcmV2ZW50IG90aGVyc1xuICAgICAgIyBmcm9tIHZpZXdpbmdcIiBhcyBtZWFuaW5nIFwiYWxsb3cgb25seSBtZSB0byB2aWV3XCIuIFRoaXMgbWF5IHdhbnQgY2hhbmdpbmdcbiAgICAgICMgaW4gdGhlIGZ1dHVyZS5cbiAgICAgIGFubm90YXRpb24ucGVybWlzc2lvbnNbdHlwZV0gPSBbQG9wdGlvbnMudXNlcklkKEB1c2VyKV1cblxuICAjIEZpZWxkIGNhbGxiYWNrOiB1cGRhdGVzIHRoZSBhbm5vdGF0aW9uIHZpZXdlciB0byBpbmx1ZGUgdGhlIGRpc3BsYXkgbmFtZVxuICAjIGZvciB0aGUgdXNlciBvYnRhaW5lZCB0aHJvdWdoIFBlcm1pc3Npb25zI29wdGlvbnMudXNlclN0cmluZygpLlxuICAjXG4gICMgZmllbGQgICAgICAtIEEgRElWIEVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBhbm5vdGF0aW9uIGZpZWxkLlxuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdCB0byBkaXNwbGF5LlxuICAjIGNvbnRyb2xzICAgLSBBIGNvbnRyb2wgT2JqZWN0IHRvIHRvZ2dsZSB0aGUgZGlzcGxheSBvZiBhbm5vdGF0aW9uIGNvbnRyb2xzLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICB1cGRhdGVWaWV3ZXI6IChmaWVsZCwgYW5ub3RhdGlvbiwgY29udHJvbHMpID0+XG4gICAgZmllbGQgPSAkKGZpZWxkKVxuXG4gICAgdXNlcm5hbWUgPSBAb3B0aW9ucy51c2VyU3RyaW5nIGFubm90YXRpb24udXNlclxuICAgIGlmIGFubm90YXRpb24udXNlciBhbmQgdXNlcm5hbWUgYW5kIHR5cGVvZiB1c2VybmFtZSA9PSAnc3RyaW5nJ1xuICAgICAgdXNlciA9IEFubm90YXRvci5VdGlsLmVzY2FwZShAb3B0aW9ucy51c2VyU3RyaW5nKGFubm90YXRpb24udXNlcikpXG4gICAgICBmaWVsZC5odG1sKHVzZXIpLmFkZENsYXNzKCdhbm5vdGF0b3ItdXNlcicpXG4gICAgZWxzZVxuICAgICAgZmllbGQucmVtb3ZlKClcblxuICAgIGlmIGNvbnRyb2xzXG4gICAgICBjb250cm9scy5oaWRlRWRpdCgpICAgdW5sZXNzIHRoaXMuYXV0aG9yaXplKCd1cGRhdGUnLCBhbm5vdGF0aW9uKVxuICAgICAgY29udHJvbHMuaGlkZURlbGV0ZSgpIHVubGVzcyB0aGlzLmF1dGhvcml6ZSgnZGVsZXRlJywgYW5ub3RhdGlvbilcblxuICAjIFNldHMgdGhlIFBlcm1pc3Npb25zI3VzZXIgcHJvcGVydHkgb24gdGhlIGJhc2lzIG9mIGEgcmVjZWl2ZWQgYXV0aFRva2VuLlxuICAjXG4gICMgdG9rZW4gLSB0aGUgYXV0aFRva2VuIHJlY2VpdmVkIGJ5IHRoZSBBdXRoIHBsdWdpblxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBfc2V0QXV0aEZyb21Ub2tlbjogKHRva2VuKSA9PlxuICAgIHRoaXMuc2V0VXNlcih0b2tlbi51c2VySWQpXG5cblxubW9kdWxlLmV4cG9ydHMgPSBBbm5vdGF0b3IuUGx1Z2luLlBlcm1pc3Npb25zXG4iLCJBbm5vdGF0b3IgPSByZXF1aXJlKCdhbm5vdGF0b3InKVxuXG5cbiMgUHVibGljOiBUaGUgU3RvcmUgcGx1Z2luIGNhbiBiZSB1c2VkIHRvIHBlcnNpc3QgYW5ub3RhdGlvbnMgdG8gYSBkYXRhYmFzZVxuIyBydW5uaW5nIG9uIHlvdXIgc2VydmVyLiBJdCBoYXMgYSBzaW1wbGUgY3VzdG9taXNhYmxlIGludGVyZmFjZSB0aGF0IGNhbiBiZVxuIyBpbXBsZW1lbnRlZCB3aXRoIGFueSB3ZWIgZnJhbWV3b3JrLiBJdCB3b3JrcyBieSBsaXN0ZW5pbmcgdG8gZXZlbnRzIHB1Ymxpc2hlZFxuIyBieSB0aGUgQW5ub3RhdG9yIGFuZCBtYWtpbmcgYXBwcm9wcmlhdGUgcmVxdWVzdHMgdG8gdGhlIHNlcnZlciBkZXBlbmRpbmcgb25cbiMgdGhlIGV2ZW50LlxuI1xuIyBUaGUgc3RvcmUgaGFuZGxlcyBmaXZlIGRpc3RpbmN0IGFjdGlvbnMgXCJyZWFkXCIsIFwic2VhcmNoXCIsIFwiY3JlYXRlXCIsIFwidXBkYXRlXCJcbiMgYW5kIFwiZGVzdG9yeVwiLiBUaGUgcmVxdWVzdHMgbWFkZSBjYW4gYmUgY3VzdG9taXNlZCB3aXRoIG9wdGlvbnMgd2hlbiB0aGVcbiMgcGx1Z2luIGlzIGFkZGVkIHRvIHRoZSBBbm5vdGF0b3IuIEN1c3RvbSBoZWFkZXJzIGNhbiBhbHNvIGJlIHNlbnQgd2l0aCBldmVyeVxuIyByZXF1ZXN0IGJ5IHNldHRpbmcgYSAkLmRhdGEga2V5IG9uIHRoZSBBbm5vdGF0aW9uI2VsZW1lbnQgY29udGFpbmluZyBoZWFkZXJzXG4jIHRvIHNlbmQuIGUuZzpcbiNcbiMgICBhbm5vdGF0b3IuZWxlbWVudC5kYXRhKCdhbm5vdGF0aW9uOmhlYWRlcnMnLCB7XG4jICAgICAnWC1NeS1DdXN0b20tSGVhZGVyJzogJ015Q3VzdG9tVmFsdWUnXG4jICAgfSlcbiNcbiMgVGhpcyBoZWFkZXIgd2lsbCBub3cgYmUgc2VudCB3aXRoIGV2ZXJ5IHJlcXVlc3QuXG5jbGFzcyBBbm5vdGF0b3IuUGx1Z2luLlN0b3JlXG5cbiAgIyBVc2VyIGN1c3RvbWlzYWJsZSBvcHRpb25zIGF2YWlsYWJsZS5cbiAgb3B0aW9uczpcblxuICAgICMgQ3VzdG9tIG1ldGEgZGF0YSB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gZXZlcnkgYW5ub3RhdGlvbiB0aGF0IGlzIHNlbnRcbiAgICAjIHRvIHRoZSBzZXJ2ZXIuIFRoaXMgX3dpbGxfIG92ZXJyaWRlIHByZXZpb3VzIHZhbHVlcy5cbiAgICBhbm5vdGF0aW9uRGF0YToge31cblxuICAgICMgU2hvdWxkIHRoZSBwbHVnaW4gZW11bGF0ZSBIVFRQIG1ldGhvZHMgbGlrZSBQVVQgYW5kIERFTEVURSBmb3JcbiAgICAjIGludGVyYWN0aW9uIHdpdGggbGVnYWN5IHdlYiBzZXJ2ZXJzPyBTZXR0aW5nIHRoaXMgdG8gYHRydWVgIHdpbGwgZmFrZVxuICAgICMgSFRUUCBgUFVUYCBhbmQgYERFTEVURWAgcmVxdWVzdHMgd2l0aCBhbiBIVFRQIGBQT1NUYCwgYW5kIHdpbGwgc2V0IHRoZVxuICAgICMgcmVxdWVzdCBoZWFkZXIgYFgtSFRUUC1NZXRob2QtT3ZlcnJpZGVgIHdpdGggdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWRcbiAgICAjIG1ldGhvZC5cbiAgICBlbXVsYXRlSFRUUDogZmFsc2VcblxuICAgICMgU2hvdWxkIHRoZSBwbHVnaW4gZW11bGF0ZSBKU09OIFBPU1QvUFVUIHBheWxvYWRzIGJ5IHNlbmRpbmcgaXRzIHJlcXVlc3RzXG4gICAgIyBhcyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgd2l0aCBhIHNpbmdsZSBrZXksIFwianNvblwiXG4gICAgZW11bGF0ZUpTT046IGZhbHNlXG5cbiAgICAjIFRoaXMgaXMgdGhlIEFQSSBlbmRwb2ludC4gSWYgdGhlIHNlcnZlciBzdXBwb3J0cyBDcm9zcyBPcmlnaW4gUmVzb3VyY2VcbiAgICAjIFNoYXJpbmcgKENPUlMpIGEgZnVsbCBVUkwgY2FuIGJlIHVzZWQgaGVyZS5cbiAgICBwcmVmaXg6ICcvc3RvcmUnXG5cbiAgICAjIFRoZSBzZXJ2ZXIgVVJMcyBmb3IgZWFjaCBhdmFpbGFibGUgYWN0aW9uLiBUaGVzZSBVUkxzIGNhbiBiZSBhbnl0aGluZyBidXRcbiAgICAjIG11c3QgcmVzcG9uZCB0byB0aGUgYXBwcm9wcmFpdGUgSFRUUCBtZXRob2QuIFRoZSB0b2tlbiBcIjppZFwiIGNhbiBiZSB1c2VkXG4gICAgIyBhbnl3aGVyZSBpbiB0aGUgVVJMIGFuZCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFubm90YXRpb24gaWQuXG4gICAgI1xuICAgICMgcmVhZDogICAgR0VUXG4gICAgIyBjcmVhdGU6ICBQT1NUXG4gICAgIyB1cGRhdGU6ICBQVVRcbiAgICAjIGRlc3Ryb3k6IERFTEVURVxuICAgICMgc2VhcmNoOiAgR0VUXG4gICAgdXJsczpcbiAgICAgIGNyZWF0ZTogICcvYW5ub3RhdGlvbnMnXG4gICAgICByZWFkOiAgICAnL2Fubm90YXRpb25zLzppZCdcbiAgICAgIHVwZGF0ZTogICcvYW5ub3RhdGlvbnMvOmlkJ1xuICAgICAgZGVzdHJveTogJy9hbm5vdGF0aW9ucy86aWQnXG4gICAgICBzZWFyY2g6ICAnL3NlYXJjaCdcblxuICAjIFB1YmxpYzogVGhlIGNvbnRzcnVjdG9yIGluaXRhaWxhc2VzIHRoZSBTdG9yZSBpbnN0YW5jZS4gSXQgcmVxdWlyZXMgdGhlXG4gICMgQW5ub3RhdG9yI2VsZW1lbnQgYW5kIGFuIE9iamVjdCBvZiBvcHRpb25zLlxuICAjXG4gICMgZWxlbWVudCAtIFRoaXMgbXVzdCBiZSB0aGUgQW5ub3RhdG9yI2VsZW1lbnQgaW4gb3JkZXIgdG8gbGlzdGVuIGZvciBldmVudHMuXG4gICMgb3B0aW9ucyAtIEFuIE9iamVjdCBvZiBrZXkvdmFsdWUgdXNlciBvcHRpb25zLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgc3RvcmUgPSBuZXcgQW5ub3RhdG9yLlBsdWdpbi5TdG9yZShBbm5vdGF0b3IuZWxlbWVudCwge1xuICAjICAgICBwcmVmaXg6ICdodHRwOi8vYW5ub3RhdGVpdC5vcmcnLFxuICAjICAgICBhbm5vdGF0aW9uRGF0YToge1xuICAjICAgICAgIHVyaTogd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgIyAgICAgfVxuICAjICAgfSlcbiAgI1xuICAjIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgU3RvcmUuXG4gIGNvbnN0cnVjdG9yOiAob3B0aW9ucykgLT5cbiAgICBAb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBAb3B0aW9ucywgb3B0aW9ucylcblxuICAjIFB1YmxpYzogQ2FsbGJhY2sgbWV0aG9kIGZvciBhbm5vdGF0aW9uQ3JlYXRlZCBldmVudC4gUmVjZWl2ZXMgYW4gYW5ub3RhdGlvblxuICAjIGFuZCBzZW5kcyBhIFBPU1QgcmVxdWVzdCB0byB0aGUgc2V2ZXIgdXNpbmcgdGhlIFVSSSBmb3IgdGhlIFwiY3JlYXRlXCIgYWN0aW9uLlxuICAjXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBzdG9yZS5hbm5vdGF0aW9uQ3JlYXRlZCh7dGV4dDogXCJteSBuZXcgYW5ub3RhdGlvbiBjb21tZW50XCJ9KVxuICAjICAgIyA9PiBSZXN1bHRzIGluIGFuIEhUVFAgUE9TVCByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgY29udGFpbmluZyB0aGVcbiAgIyAgICMgICAgYW5ub3RhdGlvbiBhcyBzZXJpYWxpc2VkIEpTT04uXG4gICNcbiAgIyBSZXR1cm5zIGEganFYSFIgb2JqZWN0LlxuICBjcmVhdGU6IChhbm5vdGF0aW9uKSAtPlxuICAgIHRoaXMuX2FwaVJlcXVlc3QoJ2NyZWF0ZScsIGFubm90YXRpb24pXG5cbiAgIyBQdWJsaWM6IENhbGxiYWNrIG1ldGhvZCBmb3IgYW5ub3RhdGlvblVwZGF0ZWQgZXZlbnQuIFJlY2VpdmVzIGFuIGFubm90YXRpb25cbiAgIyBhbmQgc2VuZHMgYSBQVVQgcmVxdWVzdCB0byB0aGUgc2V2ZXIgdXNpbmcgdGhlIFVSSSBmb3IgdGhlIFwidXBkYXRlXCIgYWN0aW9uLlxuICAjXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gT2JqZWN0IHRoYXQgd2FzIHVwZGF0ZWQuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBzdG9yZS5hbm5vdGF0aW9uVXBkYXRlZCh7aWQ6IFwiYmxhaFwiLCB0ZXh0OiBcInVwZGF0ZWQgYW5ub3RhdGlvbiBjb21tZW50XCJ9KVxuICAjICAgIyA9PiBSZXN1bHRzIGluIGFuIEhUVFAgUFVUIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBjb250YWluaW5nIHRoZVxuICAjICAgIyAgICBhbm5vdGF0aW9uIGFzIHNlcmlhbGlzZWQgSlNPTi5cbiAgI1xuICAjIFJldHVybnMgYSBqcVhIUiBvYmplY3QuXG4gIHVwZGF0ZTogKGFubm90YXRpb24pIC0+XG4gICAgdGhpcy5fYXBpUmVxdWVzdCgndXBkYXRlJywgYW5ub3RhdGlvbilcblxuICAjIFB1YmxpYzogQ2FsbGJhY2sgbWV0aG9kIGZvciBhbm5vdGF0aW9uRGVsZXRlZCBldmVudC4gUmVjZWl2ZXMgYW4gYW5ub3RhdGlvblxuICAjIGFuZCBzZW5kcyBhIERFTEVURSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIFVSSSBmb3IgdGhlIGRlc3Ryb3lcbiAgIyBhY3Rpb24uXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBPYmplY3QgdGhhdCB3YXMgZGVsZXRlZC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHN0b3JlLmFubm90YXRpb25EZWxldGVkKHt0ZXh0OiBcIm15IG5ldyBhbm5vdGF0aW9uIGNvbW1lbnRcIn0pXG4gICMgICAjID0+IFJlc3VsdHMgaW4gYW4gSFRUUCBERUxFVEUgcmVxdWVzdCB0byB0aGUgc2VydmVyLlxuICAjXG4gICMgUmV0dXJucyBhIGpxWEhSIG9iamVjdC5cbiAgZGVsZXRlOiAoYW5ub3RhdGlvbikgLT5cbiAgICB0aGlzLl9hcGlSZXF1ZXN0KCdkZXN0cm95JywgYW5ub3RhdGlvbilcblxuICAjIFB1YmxpYzogU2VhcmNoZXMgZm9yIGFubm90YXRpb25zIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcXVlcnkuXG4gICNcbiAgIyBSZXR1cm5zIGEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdHMgYW5kIHF1ZXJ5IG1ldGFkYXRhLlxuICBxdWVyeTogKHF1ZXJ5T2JqKSAtPlxuICAgIGRmZCA9ICQuRGVmZXJyZWQoKVxuICAgIHRoaXMuX2FwaVJlcXVlc3QoJ3NlYXJjaCcsIHF1ZXJ5T2JqKVxuICAgICAgLmRvbmUgKG9iaikgLT5cbiAgICAgICAgcm93cyA9IG9iai5yb3dzXG4gICAgICAgIGRlbGV0ZSBvYmoucm93c1xuICAgICAgICBkZmQucmVzb2x2ZShyb3dzLCBvYmopXG4gICAgICAuZmFpbCAoKSAtPlxuICAgICAgICBkZmQucmVqZWN0LmFwcGx5KGRmZCwgYXJndW1lbnRzKVxuICAgIHJldHVybiBkZmQucHJvbWlzZSgpXG5cbiAgIyBDYWxsYmFjayBtZXRob2QgZm9yIFN0b3JlI2xvYWRBbm5vdGF0aW9uc0Zyb21TZWFyY2goKS4gUHJvY2Vzc2VzIHRoZSBkYXRhXG4gICMgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIChhIEpTT04gYXJyYXkgb2YgYW5ub3RhdGlvbiBPYmplY3RzKSBhbmQgdXBkYXRlc1xuICAjIHRoZSByZWdpc3RyeSBhcyB3ZWxsIGFzIGxvYWRpbmcgdGhlbSBpbnRvIHRoZSBBbm5vdGF0b3IuXG4gICMgUmV0dXJucyB0aGUgalF1ZXJ5IFhNTEh0dHBSZXF1ZXN0IHdyYXBwZXIgZW5hYmxpbmcgYWRkaXRpb25hbCBjYWxsYmFja3MgdG9cbiAgIyBiZSBhcHBsaWVkIGFzIHdlbGwgYXMgY3VzdG9tIGVycm9yIGhhbmRsaW5nLlxuICAjXG4gICMgYWN0aW9uICAgIC0gVGhlIGFjdGlvbiBTdHJpbmcgZWcuIFwicmVhZFwiLCBcInNlYXJjaFwiLCBcImNyZWF0ZVwiLCBcInVwZGF0ZVwiXG4gICMgICAgICAgICAgICAgb3IgXCJkZXN0b3J5XCIuXG4gICMgb2JqICAgICAgIC0gVGhlIGRhdGEgdG8gYmUgc2VudCwgZWl0aGVyIGFubm90YXRpb24gb2JqZWN0IG9yIHF1ZXJ5IHN0cmluZy5cbiAgIyBvblN1Y2Nlc3MgLSBBIGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGNhbGwgb24gc3VjY2Vzc2Z1bCByZXF1ZXN0LlxuICAjXG4gICMgRXhhbXBsZXM6XG4gICNcbiAgIyAgIHN0b3JlLl9hcGlSZXF1ZXN0KCdyZWFkJywge2lkOiA0fSwgKGRhdGEpIC0+IGNvbnNvbGUubG9nKGRhdGEpKVxuICAjICAgIyA9PiBPdXRwdXRzIHRoZSBhbm5vdGF0aW9uIHJldHVybmVkIGZyb20gdGhlIHNlcnZlci5cbiAgI1xuICAjIFJldHVybnMgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0LlxuICBfYXBpUmVxdWVzdDogKGFjdGlvbiwgb2JqKSAtPlxuICAgIGlkID0gb2JqICYmIG9iai5pZFxuICAgIHVybCA9IHRoaXMuX3VybEZvcihhY3Rpb24sIGlkKVxuICAgIG9wdGlvbnMgPSB0aGlzLl9hcGlSZXF1ZXN0T3B0aW9ucyhhY3Rpb24sIG9iailcblxuICAgIHJlcXVlc3QgPSAkLmFqYXgodXJsLCBvcHRpb25zKVxuXG4gICAgIyBBcHBlbmQgdGhlIGlkIGFuZCBhY3Rpb24gdG8gdGhlIHJlcXVlc3Qgb2JqZWN0XG4gICAgIyBmb3IgdXNlIGluIHRoZSBlcnJvciBjYWxsYmFjay5cbiAgICByZXF1ZXN0Ll9pZCA9IGlkXG4gICAgcmVxdWVzdC5fYWN0aW9uID0gYWN0aW9uXG4gICAgcmVxdWVzdFxuXG4gICMgQnVpbGRzIGFuIG9wdGlvbnMgb2JqZWN0IHN1aXRhYmxlIGZvciB1c2UgaW4gYSBqUXVlcnkuYWpheCgpIGNhbGwuXG4gICNcbiAgIyBhY3Rpb24gICAgLSBUaGUgYWN0aW9uIFN0cmluZyBlZy4gXCJyZWFkXCIsIFwic2VhcmNoXCIsIFwiY3JlYXRlXCIsIFwidXBkYXRlXCJcbiAgIyAgICAgICAgICAgICBvciBcImRlc3Ryb3lcIi5cbiAgIyBvYmogICAgICAgLSBUaGUgZGF0YSB0byBiZSBzZW50LCBlaXRoZXIgYW5ub3RhdGlvbiBvYmplY3Qgb3IgcXVlcnkgc3RyaW5nLlxuICAjXG4gICMgUmV0dXJucyBPYmplY3QgbGl0ZXJhbCBvZiAkLmFqYXgoKSBvcHRpb25zLlxuICBfYXBpUmVxdWVzdE9wdGlvbnM6IChhY3Rpb24sIG9iaikgLT5cbiAgICBtZXRob2QgPSB0aGlzLl9tZXRob2RGb3IoYWN0aW9uKVxuXG4gICAgb3B0cyA9IHtcbiAgICAgIHR5cGU6ICAgICBtZXRob2QsXG4gICAgICBkYXRhVHlwZTogXCJqc29uXCIsXG4gICAgICBlcnJvcjogICAgdGhpcy5fb25FcnJvclxuICAgIH1cblxuICAgICMgSWYgZW11bGF0ZUhUVFAgaXMgZW5hYmxlZCwgd2Ugc2VuZCBhIFBPU1QgYW5kIHB1dCB0aGUgcmVhbCBtZXRob2QgaW4gYW5cbiAgICAjIEhUVFAgcmVxdWVzdCBoZWFkZXIuXG4gICAgaWYgQG9wdGlvbnMuZW11bGF0ZUhUVFAgYW5kIG1ldGhvZCBpbiBbJ1BVVCcsICdERUxFVEUnXVxuICAgICAgb3B0cy5oZWFkZXJzID0gJC5leHRlbmQob3B0cy5oZWFkZXJzLCB7J1gtSFRUUC1NZXRob2QtT3ZlcnJpZGUnOiBtZXRob2R9KVxuICAgICAgb3B0cy50eXBlID0gJ1BPU1QnXG5cbiAgICAjIERvbid0IEpTT05pZnkgb2JqIGlmIG1ha2luZyBzZWFyY2ggcmVxdWVzdC5cbiAgICBpZiBhY3Rpb24gaXMgXCJzZWFyY2hcIlxuICAgICAgb3B0cyA9ICQuZXh0ZW5kKG9wdHMsIGRhdGE6IG9iailcbiAgICAgIHJldHVybiBvcHRzXG4gICAgXG4gICAgIyBST0M6IHRyeSB0byBhZGQgYW5ub3RhdGlvbkRhdGEgIFxuICAgIGlmIGFjdGlvbiBpcyBcImNyZWF0ZVwiIG9yIGFjdGlvbiBpcyBcInVwZGF0ZVwiXG4gICAgICBvYmogPSAkLmV4dGVuZChvYmosIEBvcHRpb25zLmFubm90YXRpb25EYXRhKVxuICAgIFxuICAgIGRhdGEgPSBvYmogJiYgSlNPTi5zdHJpbmdpZnkob2JqKVxuXG4gICAgIyBJZiBlbXVsYXRlSlNPTiBpcyBlbmFibGVkLCB3ZSBzZW5kIGEgZm9ybSByZXF1ZXN0ICh0aGUgY29ycmVjdFxuICAgICMgY29udGVudFR5cGUgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBieSBqUXVlcnkpLCBhbmQgcHV0IHRoZVxuICAgICMgSlNPTi1lbmNvZGVkIHBheWxvYWQgaW4gdGhlIFwianNvblwiIGtleS5cbiAgICBpZiBAb3B0aW9ucy5lbXVsYXRlSlNPTlxuICAgICAgb3B0cy5kYXRhID0ge2pzb246IGRhdGF9XG4gICAgICBpZiBAb3B0aW9ucy5lbXVsYXRlSFRUUFxuICAgICAgICBvcHRzLmRhdGEuX21ldGhvZCA9IG1ldGhvZFxuICAgICAgcmV0dXJuIG9wdHNcblxuICAgIG9wdHMgPSAkLmV4dGVuZChvcHRzLCB7XG4gICAgICBkYXRhOiBkYXRhXG4gICAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCJcbiAgICB9KVxuICAgIHJldHVybiBvcHRzXG5cbiAgIyBCdWlsZHMgdGhlIGFwcHJvcHJpYXRlIFVSTCBmcm9tIHRoZSBvcHRpb25zIGZvciB0aGUgYWN0aW9uIHByb3ZpZGVkLlxuICAjXG4gICMgYWN0aW9uIC0gVGhlIGFjdGlvbiBTdHJpbmcuXG4gICMgaWQgICAgIC0gVGhlIGFubm90YXRpb24gaWQgYXMgYSBTdHJpbmcgb3IgTnVtYmVyLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgc3RvcmUuX3VybEZvcigndXBkYXRlJywgMzQpXG4gICMgICAjID0+IFJldHVybnMgXCIvc3RvcmUvYW5ub3RhdGlvbnMvMzRcIlxuICAjXG4gICMgICBzdG9yZS5fdXJsRm9yKCdzZWFyY2gnKVxuICAjICAgIyA9PiBSZXR1cm5zIFwiL3N0b3JlL3NlYXJjaFwiXG4gICNcbiAgIyBSZXR1cm5zIFVSTCBTdHJpbmcuXG4gIF91cmxGb3I6IChhY3Rpb24sIGlkKSAtPlxuICAgIHVybCA9IGlmIEBvcHRpb25zLnByZWZpeD8gdGhlbiBAb3B0aW9ucy5wcmVmaXggZWxzZSAnJ1xuICAgIHVybCArPSBAb3B0aW9ucy51cmxzW2FjdGlvbl1cbiAgICAjIElmIHRoZXJlJ3MgYSAnLzppZCcgaW4gdGhlIFVSTCwgZWl0aGVyIGZpbGwgaW4gdGhlIElEIG9yIHJlbW92ZSB0aGVcbiAgICAjIHNsYXNoOlxuICAgIHVybCA9IHVybC5yZXBsYWNlKC9cXC86aWQvLCBpZiBpZD8gdGhlbiAnLycgKyBpZCBlbHNlICcnKVxuICAgICMgSWYgdGhlcmUncyBhIGJhcmUgJzppZCcgaW4gdGhlIFVSTCwgdGhlbiBzdWJzdGl0dXRlIGRpcmVjdGx5OlxuICAgIHVybCA9IHVybC5yZXBsYWNlKC86aWQvLCBpZiBpZD8gdGhlbiBpZCBlbHNlICcnKVxuXG4gICAgdXJsXG5cbiAgIyBNYXBzIGFuIGFjdGlvbiB0byBhbiBIVFRQIG1ldGhvZC5cbiAgI1xuICAjIGFjdGlvbiAtIFRoZSBhY3Rpb24gU3RyaW5nLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgc3RvcmUuX21ldGhvZEZvcigncmVhZCcpICAgICMgPT4gXCJHRVRcIlxuICAjICAgc3RvcmUuX21ldGhvZEZvcigndXBkYXRlJykgICMgPT4gXCJQVVRcIlxuICAjICAgc3RvcmUuX21ldGhvZEZvcignZGVzdHJveScpICMgPT4gXCJERUxFVEVcIlxuICAjXG4gICMgUmV0dXJucyBIVFRQIG1ldGhvZCBTdHJpbmcuXG4gIF9tZXRob2RGb3I6IChhY3Rpb24pIC0+XG4gICAgdGFibGUgPSB7XG4gICAgICAnY3JlYXRlJzogICdQT1NUJ1xuICAgICAgJ3JlYWQnOiAgICAnR0VUJ1xuICAgICAgJ3VwZGF0ZSc6ICAnUFVUJ1xuICAgICAgJ2Rlc3Ryb3knOiAnREVMRVRFJ1xuICAgICAgJ3NlYXJjaCc6ICAnR0VUJ1xuICAgIH1cblxuICAgIHRhYmxlW2FjdGlvbl1cblxuICAjIGpRdWVyeS5hamF4KCkgY2FsbGJhY2suIERpc3BsYXlzIGFuIGVycm9yIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlciBpZlxuICAjIHRoZSByZXF1ZXN0IGZhaWxlZC5cbiAgI1xuICAjIHhociAtIFRoZSBqWE1MSHR0cFJlcXVlc3Qgb2JqZWN0LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBfb25FcnJvcjogKHhocikgPT5cbiAgICBhY3Rpb24gID0geGhyLl9hY3Rpb25cbiAgICBtZXNzYWdlID0gQW5ub3RhdG9yLl90KFwiU29ycnkgd2UgY291bGQgbm90IFwiKSArIGFjdGlvbiArIEFubm90YXRvci5fdChcIiB0aGlzIGFubm90YXRpb25cIilcblxuICAgIGlmIHhoci5fYWN0aW9uID09ICdzZWFyY2gnXG4gICAgICBtZXNzYWdlID0gQW5ub3RhdG9yLl90KFwiU29ycnkgd2UgY291bGQgbm90IHNlYXJjaCB0aGUgc3RvcmUgZm9yIGFubm90YXRpb25zXCIpXG4gICAgZWxzZSBpZiB4aHIuX2FjdGlvbiA9PSAncmVhZCcgJiYgIXhoci5faWRcbiAgICAgIG1lc3NhZ2UgPSBBbm5vdGF0b3IuX3QoXCJTb3JyeSB3ZSBjb3VsZCBub3QgXCIpICsgYWN0aW9uICsgQW5ub3RhdG9yLl90KFwiIHRoZSBhbm5vdGF0aW9ucyBmcm9tIHRoZSBzdG9yZVwiKVxuXG4gICAgc3dpdGNoIHhoci5zdGF0dXNcbiAgICAgIHdoZW4gNDAxIHRoZW4gbWVzc2FnZSA9IEFubm90YXRvci5fdChcIlNvcnJ5IHlvdSBhcmUgbm90IGFsbG93ZWQgdG8gXCIpICsgYWN0aW9uICsgQW5ub3RhdG9yLl90KFwiIHRoaXMgYW5ub3RhdGlvblwiKVxuICAgICAgd2hlbiA0MDQgdGhlbiBtZXNzYWdlID0gQW5ub3RhdG9yLl90KFwiU29ycnkgd2UgY291bGQgbm90IGNvbm5lY3QgdG8gdGhlIGFubm90YXRpb25zIHN0b3JlXCIpXG4gICAgICB3aGVuIDUwMCB0aGVuIG1lc3NhZ2UgPSBBbm5vdGF0b3IuX3QoXCJTb3JyeSBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBhbm5vdGF0aW9uIHN0b3JlXCIpXG5cbiAgICBBbm5vdGF0b3Iuc2hvd05vdGlmaWNhdGlvbiBtZXNzYWdlLCBBbm5vdGF0b3IuTm90aWZpY2F0aW9uLkVSUk9SXG5cbiAgICBjb25zb2xlLmVycm9yIEFubm90YXRvci5fdChcIkFQSSByZXF1ZXN0IGZhaWxlZDpcIikgKyBcIiAnI3t4aHIuc3RhdHVzfSdcIlxuXG5cbm1vZHVsZS5leHBvcnRzID0gQW5ub3RhdG9yLlBsdWdpbi5TdG9yZVxuIiwiQW5ub3RhdG9yID0gcmVxdWlyZSgnYW5ub3RhdG9yJylcblxuXG4jIFB1YmxpYzogVGFncyBwbHVnaW4gYWxsb3dzIHVzZXJzIHRvIHRhZyB0aGllciBhbm5vdGF0aW9ucyB3aXRoIG1ldGFkYXRhXG4jIHN0b3JlZCBpbiBhbiBBcnJheSBvbiB0aGUgYW5ub3RhdGlvbiBhcyB0YWdzLlxuY2xhc3MgQW5ub3RhdG9yLlBsdWdpbi5UYWdzIGV4dGVuZHMgQW5ub3RhdG9yLlBsdWdpblxuXG4gIG9wdGlvbnM6XG4gICAgIyBDb25maWd1cmFibGUgZnVuY3Rpb24gd2hpY2ggYWNjZXB0cyBhIHN0cmluZyAodGhlIGNvbnRlbnRzKVxuICAgICMgb2YgdGhlIHRhZ3MgaW5wdXQgYXMgYW4gYXJndW1lbnQsIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mXG4gICAgIyB0YWdzLlxuICAgIHBhcnNlVGFnczogKHN0cmluZykgLT5cbiAgICAgIHN0cmluZyA9ICQudHJpbShzdHJpbmcpXG5cbiAgICAgIHRhZ3MgPSBbXVxuICAgICAgdGFncyA9IHN0cmluZy5zcGxpdCgvXFxzKy8pIGlmIHN0cmluZ1xuICAgICAgdGFnc1xuXG4gICAgIyBDb25maWd1cmFibGUgZnVuY3Rpb24gd2hpY2ggYWNjZXB0cyBhbiBhcnJheSBvZiB0YWdzIGFuZFxuICAgICMgcmV0dXJucyBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmlsbCB0aGUgdGFncyBpbnB1dC5cbiAgICBzdHJpbmdpZnlUYWdzOiAoYXJyYXkpIC0+XG4gICAgICBhcnJheS5qb2luKFwiIFwiKVxuXG4gICMgVGhlIGZpZWxkIGVsZW1lbnQgYWRkZWQgdG8gdGhlIEFubm90YXRvci5FZGl0b3Igd3JhcHBlZCBpbiBqUXVlcnkuIENhY2hlZCB0b1xuICAjIHNhdmUgaGF2aW5nIHRvIHJlY3JlYXRlIGl0IGV2ZXJ5dGltZSB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC5cbiAgZmllbGQ6IG51bGxcblxuICAjIFRoZSBpbnB1dCBlbGVtZW50IGFkZGVkIHRvIHRoZSBBbm5vdGF0b3IuRWRpdG9yIHdyYXBwZWQgaW4galF1ZXJ5LiBDYWNoZWQgdG9cbiAgIyBzYXZlIGhhdmluZyB0byByZWNyZWF0ZSBpdCBldmVyeXRpbWUgdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuXG4gIGlucHV0OiBudWxsXG5cbiAgIyBQdWJsaWM6IEluaXRpYWxpc2VzIHRoZSBwbHVnaW4gYW5kIGFkZHMgY3VzdG9tIGZpZWxkcyB0byBib3RoIHRoZVxuICAjIGFubm90YXRvciB2aWV3ZXIgYW5kIGVkaXRvci4gVGhlIHBsdWdpbiBhbHNvIGNoZWNrcyBpZiB0aGUgYW5ub3RhdG9yIGlzXG4gICMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGJyb3dzZXIuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHBsdWdpbkluaXQ6IC0+XG4gICAgcmV0dXJuIHVubGVzcyBBbm5vdGF0b3Iuc3VwcG9ydGVkKClcblxuICAgIEBmaWVsZCA9IEBhbm5vdGF0b3IuZWRpdG9yLmFkZEZpZWxkKHtcbiAgICAgIGxhYmVsOiAgQW5ub3RhdG9yLl90KCdBZGQgc29tZSB0YWdzIGhlcmUnKSArICdcXHUyMDI2J1xuICAgICAgbG9hZDogICB0aGlzLnVwZGF0ZUZpZWxkXG4gICAgICBzdWJtaXQ6IHRoaXMuc2V0QW5ub3RhdGlvblRhZ3NcbiAgICB9KVxuXG4gICAgQGFubm90YXRvci52aWV3ZXIuYWRkRmllbGQoe1xuICAgICAgbG9hZDogdGhpcy51cGRhdGVWaWV3ZXJcbiAgICB9KVxuXG4gICAgIyBBZGQgYSBmaWx0ZXIgdG8gdGhlIEZpbHRlciBwbHVnaW4gaWYgbG9hZGVkLlxuICAgIGlmIEBhbm5vdGF0b3IucGx1Z2lucy5GaWx0ZXJcbiAgICAgIEBhbm5vdGF0b3IucGx1Z2lucy5GaWx0ZXIuYWRkRmlsdGVyXG4gICAgICAgIGxhYmVsOiBBbm5vdGF0b3IuX3QoJ1RhZycpXG4gICAgICAgIHByb3BlcnR5OiAndGFncydcbiAgICAgICAgaXNGaWx0ZXJlZDogQW5ub3RhdG9yLlBsdWdpbi5UYWdzLmZpbHRlckNhbGxiYWNrXG5cbiAgICBAaW5wdXQgPSAkKEBmaWVsZCkuZmluZCgnOmlucHV0JylcblxuICAjIFB1YmxpYzogRXh0cmFjdHMgdGFncyBmcm9tIHRoZSBwcm92aWRlZCBTdHJpbmcuXG4gICNcbiAgIyBzdHJpbmcgLSBBIFN0cmluZyBvZiB0YWdzIHNlcGVyYXRlZCBieSBzcGFjZXMuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBwbHVnaW4ucGFyc2VUYWdzKCdjYWtlIGNob2NvbGF0ZSBjYWJiYWdlJylcbiAgIyAgICMgPT4gWydjYWtlJywgJ2Nob2NvbGF0ZScsICdjYWJiYWdlJ11cbiAgI1xuICAjIFJldHVybnMgQXJyYXkgb2YgcGFyc2VkIHRhZ3MuXG4gIHBhcnNlVGFnczogKHN0cmluZykgLT5cbiAgICBAb3B0aW9ucy5wYXJzZVRhZ3Moc3RyaW5nKVxuXG4gICMgUHVibGljOiBUYWtlcyBhbiBhcnJheSBvZiB0YWdzIGFuZCBzZXJpYWxpc2VzIHRoZW0gaW50byBhIFN0cmluZy5cbiAgI1xuICAjIGFycmF5IC0gQW4gQXJyYXkgb2YgdGFncy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHBsdWdpbi5zdHJpbmdpZnlUYWdzKFsnY2FrZScsICdjaG9jb2xhdGUnLCAnY2FiYmFnZSddKVxuICAjICAgIyA9PiAnY2FrZSBjaG9jb2xhdGUgY2FiYmFnZSdcbiAgI1xuICAjIFJldHVybnMgQXJyYXkgb2YgcGFyc2VkIHRhZ3MuXG4gIHN0cmluZ2lmeVRhZ3M6IChhcnJheSkgLT5cbiAgICBAb3B0aW9ucy5zdHJpbmdpZnlUYWdzKGFycmF5KVxuXG4gICMgQW5ub3RhdG9yLkVkaXRvciBjYWxsYmFjayBmdW5jdGlvbi4gVXBkYXRlcyB0aGUgQGlucHV0IGZpZWxkIHdpdGggdGhlXG4gICMgdGFncyBhdHRhY2hlZCB0byB0aGUgcHJvdmlkZWQgYW5ub3RhdGlvbi5cbiAgI1xuICAjIGZpZWxkICAgICAgLSBUaGUgdGFncyBmaWVsZCBFbGVtZW50IGNvbnRhaW5pbmcgdGhlIGlucHV0IEVsZW1lbnQuXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gb2JqZWN0IHRvIGJlIGVkaXRlZC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGZpZWxkID0gJCgnPGxpPjxpbnB1dCAvPjwvbGk+JylbMF1cbiAgIyAgIHBsdWdpbi51cGRhdGVGaWVsZChmaWVsZCwge3RhZ3M6IFsnYXBwbGVzJywgJ29yYW5nZXMnLCAnY2FrZSddfSlcbiAgIyAgIGZpZWxkLnZhbHVlICMgPT4gUmV0dXJucyAnYXBwbGVzIG9yYW5nZXMgY2FrZSdcbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgdXBkYXRlRmllbGQ6IChmaWVsZCwgYW5ub3RhdGlvbikgPT5cbiAgICB2YWx1ZSA9ICcnXG4gICAgdmFsdWUgPSB0aGlzLnN0cmluZ2lmeVRhZ3MoYW5ub3RhdGlvbi50YWdzKSBpZiBhbm5vdGF0aW9uLnRhZ3NcblxuICAgIEBpbnB1dC52YWwodmFsdWUpXG5cbiAgIyBBbm5vdGF0b3IuRWRpdG9yIGNhbGxiYWNrIGZ1bmN0aW9uLiBVcGRhdGVzIHRoZSBhbm5vdGF0aW9uIGZpZWxkIHdpdGggdGhlXG4gICMgZGF0YSByZXRyaWV2ZWQgZnJvbSB0aGUgQGlucHV0IHByb3BlcnR5LlxuICAjXG4gICMgZmllbGQgICAgICAtIFRoZSB0YWdzIGZpZWxkIEVsZW1lbnQgY29udGFpbmluZyB0aGUgaW5wdXQgRWxlbWVudC5cbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBvYmplY3QgdG8gYmUgdXBkYXRlZC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGFubm90YXRpb24gPSB7fVxuICAjICAgZmllbGQgPSAkKCc8bGk+PGlucHV0IHZhbHVlPVwiY2FrZSBjaG9jb2xhdGUgY2FiYmFnZVwiIC8+PC9saT4nKVswXVxuICAjXG4gICMgICBwbHVnaW4uc2V0QW5ub3RhdGlvblRhZ3MoZmllbGQsIGFubm90YXRpb24pXG4gICMgICBhbm5vdGF0aW9uLnRhZ3MgIyA9PiBSZXR1cm5zIFsnY2FrZScsICdjaG9jb2xhdGUnLCAnY2FiYmFnZSddXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHNldEFubm90YXRpb25UYWdzOiAoZmllbGQsIGFubm90YXRpb24pID0+XG4gICAgYW5ub3RhdGlvbi50YWdzID0gdGhpcy5wYXJzZVRhZ3MoQGlucHV0LnZhbCgpKVxuXG4gICMgQW5ub3RhdG9yLlZpZXdlciBjYWxsYmFjayBmdW5jdGlvbi4gVXBkYXRlcyB0aGUgYW5ub3RhdGlvbiBkaXNwbGF5IHdpdGggdGFnc1xuICAjIHJlbW92ZXMgdGhlIGZpZWxkIGZyb20gdGhlIFZpZXdlciBpZiB0aGVyZSBhcmUgbm8gdGFncyB0byBkaXNwbGF5LlxuICAjXG4gICMgZmllbGQgICAgICAtIFRoZSBFbGVtZW50IHRvIHBvcHVsYXRlIHdpdGggdGFncy5cbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBvYmplY3QgdG8gYmUgZGlzcGxheS5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGZpZWxkID0gJCgnPGRpdiAvPicpWzBdXG4gICMgICBwbHVnaW4udXBkYXRlRmllbGQoZmllbGQsIHt0YWdzOiBbJ2FwcGxlcyddfSlcbiAgIyAgIGZpZWxkLmlubmVySFRNTCAjID0+IFJldHVybnMgJzxzcGFuIGNsYXNzPVwiYW5ub3RhdG9yLXRhZ1wiPmFwcGxlczwvc3Bhbj4nXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHVwZGF0ZVZpZXdlcjogKGZpZWxkLCBhbm5vdGF0aW9uKSAtPlxuICAgIGZpZWxkID0gJChmaWVsZClcblxuICAgIGlmIGFubm90YXRpb24udGFncyBhbmQgJC5pc0FycmF5KGFubm90YXRpb24udGFncykgYW5kIGFubm90YXRpb24udGFncy5sZW5ndGhcbiAgICAgIGZpZWxkLmFkZENsYXNzKCdhbm5vdGF0b3ItdGFncycpLmh0bWwoLT5cbiAgICAgICAgc3RyaW5nID0gJC5tYXAoYW5ub3RhdGlvbi50YWdzLCh0YWcpIC0+XG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJhbm5vdGF0b3ItdGFnXCI+JyArIEFubm90YXRvci5VdGlsLmVzY2FwZSh0YWcpICsgJzwvc3Bhbj4nXG4gICAgICAgICkuam9pbignICcpXG4gICAgICApXG4gICAgZWxzZVxuICAgICAgZmllbGQucmVtb3ZlKClcblxuIyBDaGVja3MgYW4gaW5wdXQgc3RyaW5nIG9mIGtleXdvcmRzIGFnYWluc3QgYW4gYXJyYXkgb2YgdGFncy4gSWYgdGhlIGtleXdvcmRzXG4jIG1hdGNoIF9hbGxfIHRhZ3MgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBhcyBhIGNhbGxiYWNrXG4jIGluIHRoZSBGaWx0ZXIgcGx1Z2luLlxuI1xuIyBpbnB1dCAtIEEgU3RyaW5nIG9mIGtleXdvcmRzIGZyb20gYSBpbnB1dCBmaWVsZC5cbiNcbiMgRXhhbXBsZXNcbiNcbiMgICBUYWdzLmZpbHRlckNhbGxiYWNrKCdjYXQgZG9nIG1vdXNlJywgWydjYXQnLCAnZG9nJywgJ21vdXNlJ10pIC8vPT4gdHJ1ZVxuIyAgIFRhZ3MuZmlsdGVyQ2FsbGJhY2soJ2NhdCBkb2cnLCBbJ2NhdCcsICdkb2cnLCAnbW91c2UnXSkgLy89PiB0cnVlXG4jICAgVGFncy5maWx0ZXJDYWxsYmFjaygnY2F0IGRvZycsIFsnY2F0J10pIC8vPT4gZmFsc2VcbiNcbiMgUmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBrZXl3b3JkcyBtYXRjaCBhbGwgdGFncy5cbkFubm90YXRvci5QbHVnaW4uVGFncy5maWx0ZXJDYWxsYmFjayA9IChpbnB1dCwgdGFncyA9IFtdKSAtPlxuICBtYXRjaGVzICA9IDBcbiAga2V5d29yZHMgPSBbXVxuICBpZiBpbnB1dFxuICAgIGtleXdvcmRzID0gaW5wdXQuc3BsaXQoL1xccysvZylcbiAgICBmb3Iga2V5d29yZCBpbiBrZXl3b3JkcyB3aGVuIHRhZ3MubGVuZ3RoXG4gICAgICBtYXRjaGVzICs9IDEgZm9yIHRhZyBpbiB0YWdzIHdoZW4gdGFnLmluZGV4T2Yoa2V5d29yZCkgIT0gLTFcblxuICBtYXRjaGVzID09IGtleXdvcmRzLmxlbmd0aFxuXG5cbm1vZHVsZS5leHBvcnRzID0gQW5ub3RhdG9yLlBsdWdpbi5UYWdzXG4iLCJBbm5vdGF0b3IgPSByZXF1aXJlKCdhbm5vdGF0b3InKVxuXG5cbiMgUGx1Z2luIHRoYXQgd2lsbCBkaXNwbGF5IGEgbm90aWZpY2F0aW9uIHRvIHRoZSB1c2VyIGlmIHRoaWVyIGJyb3dzZXIgZG9lc1xuIyBub3Qgc3VwcG9ydCB0aGUgQW5ub3RhdG9yLlxuY2xhc3MgQW5ub3RhdG9yLlBsdWdpbi5VbnN1cHBvcnRlZCBleHRlbmRzIEFubm90YXRvci5QbHVnaW5cbiAgIyBPcHRpb25zIE9iamVjdCwgbWVzc2FnZSBzZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCBpbiB0aGUgYnJvd3Nlci5cbiAgb3B0aW9uczpcbiAgICBtZXNzYWdlOiBBbm5vdGF0b3IuX3QoXCJTb3JyeSB5b3VyIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBBbm5vdGF0b3JcIilcblxuICAjIFB1YmxpYzogQ2hlY2tzIHRoZSBBbm5vdGF0b3Iuc3VwcG9ydGVkKCkgbWV0aG9kIGFuZCBpZiB1bnN1cHBvcnRlZCBkaXNwbGF5c1xuICAjIEBvcHRpb25zLm1lc3NhZ2UgaW4gYSBub3RpZmljYXRpb24uXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHBsdWdpbkluaXQ6IC0+XG4gICAgdW5sZXNzIEFubm90YXRvci5zdXBwb3J0ZWQoKVxuICAgICAgJCg9PlxuICAgICAgICAjIE9uIGRvY3VtZW50IGxvYWQgZGlzcGxheSBub3RpZmljYXRpb24uXG4gICAgICAgIEFubm90YXRvci5zaG93Tm90aWZpY2F0aW9uKEBvcHRpb25zLm1lc3NhZ2UpXG5cbiAgICAgICAgIyBBZGQgYSBjbGFzcyBpZiB3ZSdyZSBpbiBJRTYuIEEgYml0IG9mIGEgaGFjayBidXQgd2UgbmVlZCB0byBiZSBhYmxlXG4gICAgICAgICMgdG8gc2V0IHRoZSBub3RpZmljYXRpb24gcG9zaXRpb24gaW4gdGhlIENTUy5cbiAgICAgICAgaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCA9PSB1bmRlZmluZWQpIGFuZCAoQWN0aXZlWE9iamVjdCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgJCgnaHRtbCcpLmFkZENsYXNzKCdpZTYnKVxuICAgICAgKVxuXG5cbm1vZHVsZS5leHBvcnRzID0gQW5ub3RhdG9yLlBsdWdpbi5VbnN1cHBvcnRlZFxuIiwiVXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cblxuUmFuZ2UgPSB7fVxuXG4jIFB1YmxpYzogRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBSYW5nZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGFuZCByZXR1cm5zXG4jIGEgc3VpdGFibGUgUmFuZ2UgaW5zdGFuY2UuXG4jXG4jIHIgLSBBIHJhbmdlIE9iamVjdC5cbiNcbiMgRXhhbXBsZXNcbiNcbiMgICBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiMgICBSYW5nZS5zbmlmZihzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKSlcbiMgICAjID0+IFJldHVybnMgYSBCcm93c2VyUmFuZ2UgaW5zdGFuY2UuXG4jXG4jIFJldHVybnMgYSBSYW5nZSBvYmplY3Qgb3IgZmFsc2UuXG5SYW5nZS5zbmlmZiA9IChyKSAtPlxuICBpZiByLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyP1xuICAgIG5ldyBSYW5nZS5Ccm93c2VyUmFuZ2UocilcbiAgZWxzZSBpZiB0eXBlb2Ygci5zdGFydCBpcyBcInN0cmluZ1wiXG4gICAgbmV3IFJhbmdlLlNlcmlhbGl6ZWRSYW5nZShyKVxuICBlbHNlIGlmIHIuc3RhcnQgYW5kIHR5cGVvZiByLnN0YXJ0IGlzIFwib2JqZWN0XCJcbiAgICBuZXcgUmFuZ2UuTm9ybWFsaXplZFJhbmdlKHIpXG4gIGVsc2VcbiAgICBjb25zb2xlLmVycm9yKF90KFwiQ291bGQgbm90IHNuaWZmIHJhbmdlIHR5cGVcIikpXG4gICAgZmFsc2VcblxuIyBQdWJsaWM6IEZpbmRzIGFuIEVsZW1lbnQgTm9kZSB1c2luZyBhbiBYUGF0aCByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQgcm9vdC5cbiNcbiMgSWYgdGhlIGRvY3VtZW50IGlzIHNlcnZlZCBhcyBhcHBsaWNhdGlvbi94aHRtbCt4bWwgaXQgd2lsbCB0cnkgYW5kIHJlc29sdmVcbiMgYW55IG5hbWVzcGFjZXMgd2l0aGluIHRoZSBYUGF0aC5cbiNcbiMgeHBhdGggLSBBbiBYUGF0aCBTdHJpbmcgdG8gcXVlcnkuXG4jXG4jIEV4YW1wbGVzXG4jXG4jICAgbm9kZSA9IFJhbmdlLm5vZGVGcm9tWFBhdGgoJy9odG1sL2JvZHkvZGl2L3BbMl0nKVxuIyAgIGlmIG5vZGVcbiMgICAgICMgRG8gc29tZXRoaW5nIHdpdGggdGhlIG5vZGUuXG4jXG4jIFJldHVybnMgdGhlIE5vZGUgaWYgZm91bmQgb3RoZXJ3aXNlIG51bGwuXG5SYW5nZS5ub2RlRnJvbVhQYXRoID0gKHhwYXRoLCByb290PWRvY3VtZW50KSAtPlxuICBldmFsdWF0ZVhQYXRoID0gKHhwLCBuc1Jlc29sdmVyPW51bGwpIC0+XG4gICAgdHJ5XG4gICAgICBkb2N1bWVudC5ldmFsdWF0ZSgnLicgKyB4cCwgcm9vdCwgbnNSZXNvbHZlciwgWFBhdGhSZXN1bHQuRklSU1RfT1JERVJFRF9OT0RFX1RZUEUsIG51bGwpLnNpbmdsZU5vZGVWYWx1ZVxuICAgIGNhdGNoIGV4Y2VwdGlvblxuICAgICAgIyBUaGVyZSBhcmUgY2FzZXMgd2hlbiB0aGUgZXZhbHVhdGlvbiBmYWlscywgYmVjYXVzZSB0aGVcbiAgICAgICMgSFRNTCBkb2N1bWVudHMgY29udGFpbnMgbm9kZXMgd2l0aCBpbnZhbGlkIG5hbWVzLFxuICAgICAgIyBmb3IgZXhhbXBsZSB0YWdzIHdpdGggZXF1YWwgc2lnbnMgaW4gdGhlbSwgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC5cbiAgICAgICMgSW4gdGhlc2UgY2FzZXMsIHRoZSBYUGF0aCBleHByZXNzaW9ucyB3aWxsIGhhdmUgdGhlc2UgYWJvbWluYXRpb25zLFxuICAgICAgIyB0b28sIGFuZCB0aGVuIHRoZXkgY2FuIG5vdCBiZSBldmFsdWF0ZWQuXG4gICAgICAjIEluIHRoZXNlIGNhc2VzLCB3ZSBnZXQgYW4gWFBhdGhFeGNlcHRpb24sIHdpdGggZXJyb3IgY29kZSA1Mi5cbiAgICAgICMgU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLVhQYXRoL3hwYXRoLmh0bWwjWFBhdGhFeGNlcHRpb25cbiAgICAgICMgVGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBtYWtlIGFueSBzZW5zZSwgYnV0IHRoaXMgd2hhdCB3ZSBzZWVcbiAgICAgICMgaGFwcGVuaW5nLlxuICAgICAgY29uc29sZS5sb2cgXCJYUGF0aCBldmFsdWF0aW9uIGZhaWxlZC5cIlxuICAgICAgY29uc29sZS5sb2cgXCJUcnlpbmcgZmFsbGJhY2suLi5cIlxuICAgICAgIyBXZSBoYXZlIGEgYW4gJ2V2YWx1YXRvcicgZm9yIHRoZSByZWFsbHkgc2ltcGxlIGV4cHJlc3Npb25zIHRoYXRcbiAgICAgICMgc2hvdWxkIHdvcmsgZm9yIHRoZSBzaW1wbGUgZXhwcmVzc2lvbnMgd2UgZ2VuZXJhdGUuXG4gICAgICBVdGlsLm5vZGVGcm9tWFBhdGgoeHAsIHJvb3QpXG5cbiAgaWYgbm90ICQuaXNYTUxEb2MgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgZXZhbHVhdGVYUGF0aCB4cGF0aFxuICBlbHNlXG4gICAgIyBXZSdyZSBpbiBhbiBYTUwgZG9jdW1lbnQsIGNyZWF0ZSBhIG5hbWVzcGFjZSByZXNvbHZlciBmdW5jdGlvbiB0byB0cnlcbiAgICAjIGFuZCByZXNvbHZlIGFueSBuYW1lc3BhY2VzIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LlxuICAgICMgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL2RvY3VtZW50LmNyZWF0ZU5TUmVzb2x2ZXJcbiAgICBjdXN0b21SZXNvbHZlciA9IGRvY3VtZW50LmNyZWF0ZU5TUmVzb2x2ZXIoXG4gICAgICBpZiBkb2N1bWVudC5vd25lckRvY3VtZW50ID09IG51bGxcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICBlbHNlXG4gICAgICAgIGRvY3VtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgKVxuICAgIG5vZGUgPSBldmFsdWF0ZVhQYXRoIHhwYXRoLCBjdXN0b21SZXNvbHZlclxuXG4gICAgdW5sZXNzIG5vZGVcbiAgICAgICMgSWYgdGhlIHByZXZpb3VzIHNlYXJjaCBmYWlsZWQgdG8gZmluZCBhIG5vZGUgdGhlbiB3ZSBtdXN0IHRyeSB0b1xuICAgICAgIyBwcm92aWRlIGEgY3VzdG9tIG5hbWVzcGFjZSByZXNvbHZlciB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgZGVmYXVsdFxuICAgICAgIyBuYW1lc3BhY2UuIFdlIGFsc28gcHJlZml4IGFsbCBub2RlIG5hbWVzIHdpdGggYSBjdXN0b20geGh0bWwgbmFtZXNwYWNlXG4gICAgICAjIGVnLiAnZGl2JyA9PiAneGh0bWw6ZGl2Jy5cbiAgICAgIHhwYXRoID0gKGZvciBzZWdtZW50IGluIHhwYXRoLnNwbGl0ICcvJ1xuICAgICAgICBpZiBzZWdtZW50IGFuZCBzZWdtZW50LmluZGV4T2YoJzonKSA9PSAtMVxuICAgICAgICAgIHNlZ21lbnQucmVwbGFjZSgvXihbYS16XSspLywgJ3hodG1sOiQxJylcbiAgICAgICAgZWxzZSBzZWdtZW50XG4gICAgICApLmpvaW4oJy8nKVxuXG4gICAgICAjIEZpbmQgdGhlIGRlZmF1bHQgZG9jdW1lbnQgbmFtZXNwYWNlLlxuICAgICAgbmFtZXNwYWNlID0gZG9jdW1lbnQubG9va3VwTmFtZXNwYWNlVVJJIG51bGxcblxuICAgICAgIyBUcnkgYW5kIHJlc29sdmUgdGhlIG5hbWVzcGFjZSwgZmlyc3Qgc2VlaW5nIGlmIGl0IGlzIGFuIHhodG1sIG5vZGVcbiAgICAgICMgb3RoZXJ3aXNlIGNoZWNrIHRoZSBoZWFkIGF0dHJpYnV0ZXMuXG4gICAgICBjdXN0b21SZXNvbHZlciAgPSAobnMpIC0+XG4gICAgICAgIGlmIG5zID09ICd4aHRtbCcgdGhlbiBuYW1lc3BhY2VcbiAgICAgICAgZWxzZSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4bWxuczonICsgbnMpXG5cbiAgICAgIG5vZGUgPSBldmFsdWF0ZVhQYXRoIHhwYXRoLCBjdXN0b21SZXNvbHZlclxuICAgIG5vZGVcblxuY2xhc3MgUmFuZ2UuUmFuZ2VFcnJvciBleHRlbmRzIEVycm9yXG4gIGNvbnN0cnVjdG9yOiAoQHR5cGUsIEBtZXNzYWdlLCBAcGFyZW50PW51bGwpIC0+XG4gICAgc3VwZXIoQG1lc3NhZ2UpXG5cbiMgUHVibGljOiBDcmVhdGVzIGEgd3JhcHBlciBhcm91bmQgYSByYW5nZSBvYmplY3Qgb2J0YWluZWQgZnJvbSBhIERPTVNlbGVjdGlvbi5cbmNsYXNzIFJhbmdlLkJyb3dzZXJSYW5nZVxuXG4gICMgUHVibGljOiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJyb3dzZXJSYW5nZS5cbiAgI1xuICAjIG9iamVjdCAtIEEgcmFuZ2Ugb2JqZWN0IG9idGFpbmVkIHZpYSBET01TZWxlY3Rpb24jZ2V0UmFuZ2VBdCgpLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICMgICByYW5nZSA9IG5ldyBSYW5nZS5Ccm93c2VyUmFuZ2Uoc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkpXG4gICNcbiAgIyBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIEJyb3dzZXJSYW5nZS5cbiAgY29uc3RydWN0b3I6IChvYmopIC0+XG4gICAgQGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyID0gb2JqLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXG4gICAgQHN0YXJ0Q29udGFpbmVyICAgICAgICAgID0gb2JqLnN0YXJ0Q29udGFpbmVyXG4gICAgQHN0YXJ0T2Zmc2V0ICAgICAgICAgICAgID0gb2JqLnN0YXJ0T2Zmc2V0XG4gICAgQGVuZENvbnRhaW5lciAgICAgICAgICAgID0gb2JqLmVuZENvbnRhaW5lclxuICAgIEBlbmRPZmZzZXQgICAgICAgICAgICAgICA9IG9iai5lbmRPZmZzZXRcblxuICAjIFB1YmxpYzogbm9ybWFsaXplIHdvcmtzIGFyb3VuZCB0aGUgZmFjdCB0aGF0IGJyb3dzZXJzIGRvbid0IGdlbmVyYXRlXG4gICMgcmFuZ2VzL3NlbGVjdGlvbnMgaW4gYSBjb25zaXN0ZW50IG1hbm5lci4gU29tZSAoU2FmYXJpKSB3aWxsIGNyZWF0ZVxuICAjIHJhbmdlcyB0aGF0IGhhdmUgKHNheSkgYSB0ZXh0Tm9kZSBzdGFydENvbnRhaW5lciBhbmQgZWxlbWVudE5vZGVcbiAgIyBlbmRDb250YWluZXIuIE90aGVycyAoRmlyZWZveCkgc2VlbSB0byBvbmx5IGV2ZXIgZ2VuZXJhdGVcbiAgIyB0ZXh0Tm9kZS90ZXh0Tm9kZSBvciBlbGVtZW50Tm9kZS9lbGVtZW50Tm9kZSBwYWlycy5cbiAgI1xuICAjIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgUmFuZ2UuTm9ybWFsaXplZFJhbmdlXG4gIG5vcm1hbGl6ZTogKHJvb3QpIC0+XG4gICAgaWYgQHRhaW50ZWRcbiAgICAgIGNvbnNvbGUuZXJyb3IoX3QoXCJZb3UgbWF5IG9ubHkgY2FsbCBub3JtYWxpemUoKSBvbmNlIG9uIGEgQnJvd3NlclJhbmdlIVwiKSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIGVsc2VcbiAgICAgIEB0YWludGVkID0gdHJ1ZVxuXG4gICAgciA9IHt9XG5cbiAgICAjIExvb2sgYXQgdGhlIHN0YXJ0XG4gICAgaWYgQHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlIGlzIE5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAjIFdlIGFyZSBkZWFsaW5nIHdpdGggZWxlbWVudCBub2RlcyAgXG4gICAgICByLnN0YXJ0ID0gVXRpbC5nZXRGaXJzdFRleHROb2RlTm90QmVmb3JlIEBzdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW0BzdGFydE9mZnNldF1cbiAgICAgIHIuc3RhcnRPZmZzZXQgPSAwXG4gICAgZWxzZVxuICAgICAgIyBXZSBhcmUgZGVhbGluZyB3aXRoIHNpbXBsZSB0ZXh0IG5vZGVzXG4gICAgICByLnN0YXJ0ID0gQHN0YXJ0Q29udGFpbmVyXG4gICAgICByLnN0YXJ0T2Zmc2V0ID0gQHN0YXJ0T2Zmc2V0XG5cbiAgICAjIExvb2sgYXQgdGhlIGVuZFxuICAgIGlmIEBlbmRDb250YWluZXIubm9kZVR5cGUgaXMgTm9kZS5FTEVNRU5UX05PREVcbiAgICAgICMgR2V0IHNwZWNpZmllZCBub2RlLlxuICAgICAgbm9kZSA9IEBlbmRDb250YWluZXIuY2hpbGROb2Rlc1tAZW5kT2Zmc2V0XVxuXG4gICAgICBpZiBub2RlPyAjIERvZXMgdGhhdCBub2RlIGV4aXN0P1xuICAgICAgICAjIExvb2sgZm9yIGEgdGV4dCBub2RlIGVpdGhlciBhdCB0aGUgaW1tZWRpYXRlIGJlZ2lubmluZyBvZiBub2RlXG4gICAgICAgIG4gPSBub2RlXG4gICAgICAgIHdoaWxlIG4/IGFuZCAobi5ub2RlVHlwZSBpc250IE5vZGUuVEVYVF9OT0RFKVxuICAgICAgICAgIG4gPSBuLmZpcnN0Q2hpbGRcbiAgICAgICAgaWYgbj8gIyBEaWQgd2UgZmluZCBhIHRleHQgbm9kZSBhdCB0aGUgc3RhcnQgb2YgdGhpcyBlbGVtZW50P1xuICAgICAgICAgIHIuZW5kID0gblxuICAgICAgICAgIHIuZW5kT2Zmc2V0ID0gMFxuXG4gICAgICB1bmxlc3Mgci5lbmQ/ICBcbiAgICAgICAgIyBXZSBuZWVkIHRvIGZpbmQgYSB0ZXh0IG5vZGUgaW4gdGhlIHByZXZpb3VzIHNpYmxpbmcgb2YgdGhlIG5vZGUgYXQgdGhlXG4gICAgICAgICMgZ2l2ZW4gb2Zmc2V0LCBpZiBvbmUgZXhpc3RzLCBvciBpbiB0aGUgcHJldmlvdXMgc2libGluZyBvZiBpdHMgY29udGFpbmVyLlxuICAgICAgICBpZiBAZW5kT2Zmc2V0XG4gICAgICAgICAgbm9kZSA9IEBlbmRDb250YWluZXIuY2hpbGROb2Rlc1tAZW5kT2Zmc2V0IC0gMV1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIG5vZGUgPSBAZW5kQ29udGFpbmVyLnByZXZpb3VzU2libGluZ1xuICAgICAgICByLmVuZCA9IFV0aWwuZ2V0TGFzdFRleHROb2RlVXBUbyBub2RlXG4gICAgICAgIHIuZW5kT2Zmc2V0ID0gci5lbmQubm9kZVZhbHVlLmxlbmd0aFxuXG4gICAgZWxzZSAjIFdlIGFyZSBkZWFsaW5nIHdpdGggc2ltcGxlIHRleHQgbm9kZXNcbiAgICAgIHIuZW5kID0gQGVuZENvbnRhaW5lclxuICAgICAgci5lbmRPZmZzZXQgPSBAZW5kT2Zmc2V0XG5cbiAgICAjIFdlIGhhdmUgY29sbGVjdGVkIHRoZSBpbml0aWFsIGRhdGEuXG5cbiAgICAjIE5vdyBsZXQncyBzdGFydCB0byBzbGljZSAmIGRpY2UgdGhlIHRleHQgZWxlbWVudHMhXG4gICAgbnIgPSB7fVxuXG4gICAgaWYgci5zdGFydE9mZnNldCA+IDBcbiAgICAgICMgRG8gd2UgcmVhbGx5IGhhdmUgdG8gY3V0P1xuICAgICAgaWYgci5zdGFydC5ub2RlVmFsdWUubGVuZ3RoID4gci5zdGFydE9mZnNldFxuICAgICAgICAjIFllcy4gQ3V0LlxuICAgICAgICBuci5zdGFydCA9IHIuc3RhcnQuc3BsaXRUZXh0KHIuc3RhcnRPZmZzZXQpXG4gICAgICBlbHNlXG4gICAgICAgICMgQXZvaWQgc3BsaXR0aW5nIG9mZiB6ZXJvLWxlbmd0aCBwaWVjZXMuXG4gICAgICAgIG5yLnN0YXJ0ID0gci5zdGFydC5uZXh0U2libGluZ1xuICAgIGVsc2VcbiAgICAgIG5yLnN0YXJ0ID0gci5zdGFydFxuXG4gICAgIyBpcyB0aGUgd2hvbGUgc2VsZWN0aW9uIGluc2lkZSBvbmUgdGV4dCBlbGVtZW50ID9cbiAgICBpZiByLnN0YXJ0IGlzIHIuZW5kXG4gICAgICBpZiBuci5zdGFydC5ub2RlVmFsdWUubGVuZ3RoID4gKHIuZW5kT2Zmc2V0IC0gci5zdGFydE9mZnNldClcbiAgICAgICAgbnIuc3RhcnQuc3BsaXRUZXh0KHIuZW5kT2Zmc2V0IC0gci5zdGFydE9mZnNldClcbiAgICAgIG5yLmVuZCA9IG5yLnN0YXJ0XG4gICAgZWxzZSAjIG5vLCB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gaXMgaW4gYSBzZXBhcmF0ZSB0ZXh0IGVsZW1lbnRcbiAgICAgICMgZG9lcyB0aGUgZW5kIG5lZWQgdG8gYmUgY3V0P1xuICAgICAgaWYgci5lbmQubm9kZVZhbHVlLmxlbmd0aCA+IHIuZW5kT2Zmc2V0XG4gICAgICAgIHIuZW5kLnNwbGl0VGV4dChyLmVuZE9mZnNldClcbiAgICAgIG5yLmVuZCA9IHIuZW5kXG5cbiAgICAjIE1ha2Ugc3VyZSB0aGUgY29tbW9uIGFuY2VzdG9yIGlzIGFuIGVsZW1lbnQgbm9kZS5cbiAgICBuci5jb21tb25BbmNlc3RvciA9IEBjb21tb25BbmNlc3RvckNvbnRhaW5lclxuICAgIHdoaWxlIG5yLmNvbW1vbkFuY2VzdG9yLm5vZGVUeXBlIGlzbnQgTm9kZS5FTEVNRU5UX05PREVcbiAgICAgIG5yLmNvbW1vbkFuY2VzdG9yID0gbnIuY29tbW9uQW5jZXN0b3IucGFyZW50Tm9kZVxuXG4gICAgbmV3IFJhbmdlLk5vcm1hbGl6ZWRSYW5nZShucilcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhIHJhbmdlIHN1aXRhYmxlIGZvciBzdG9yYWdlLlxuICAjXG4gICMgcm9vdCAgICAgICAgICAgLSBBIHJvb3QgRWxlbWVudCBmcm9tIHdoaWNoIHRvIGFuY2hvciB0aGUgc2VyaWFsaXNhdGlvbi5cbiAgIyBpZ25vcmVTZWxlY3RvciAtIEEgc2VsZWN0b3IgU3RyaW5nIG9mIGVsZW1lbnRzIHRvIGlnbm9yZS4gRm9yIGV4YW1wbGVcbiAgIyAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGluamVjdGVkIGJ5IHRoZSBhbm5vdGF0b3IuXG4gICNcbiAgIyBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIFNlcmlhbGl6ZWRSYW5nZS5cbiAgc2VyaWFsaXplOiAocm9vdCwgaWdub3JlU2VsZWN0b3IpIC0+XG4gICAgdGhpcy5ub3JtYWxpemUocm9vdCkuc2VyaWFsaXplKHJvb3QsIGlnbm9yZVNlbGVjdG9yKVxuXG4jIFB1YmxpYzogQSBub3JtYWxpc2VkIHJhbmdlIGlzIG1vc3QgY29tbW9ubHkgdXNlZCB0aHJvdWdob3V0IHRoZSBhbm5vdGF0b3IuXG4jIGl0cyB0aGUgcmVzdWx0IG9mIGEgZGVzZXJpYWxpc2VkIFNlcmlhbGl6ZWRSYW5nZSBvciBhIEJyb3dzZXJSYW5nZSB3aXRoXG4jIG91dCBicm93c2VyIGluY29uc2lzdGVuY2llcy5cbmNsYXNzIFJhbmdlLk5vcm1hbGl6ZWRSYW5nZVxuXG4gICMgUHVibGljOiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgTm9ybWFsaXplZFJhbmdlLlxuICAjXG4gICMgVGhpcyBpcyB1c3VhbGx5IGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgLm5vcm1hbGl6ZSgpIG1ldGhvZCBvbiBvbmUgb2YgdGhlXG4gICMgb3RoZXIgUmFuZ2UgY2xhc3NlcyByYXRoZXIgdGhhbiBtYW51YWxseS5cbiAgI1xuICAjIG9iaiAtIEFuIE9iamVjdCBsaXRlcmFsLiBTaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMuXG4gICMgICAgICAgY29tbW9uQW5jZXN0b3I6IEEgRWxlbWVudCB0aGF0IGVuY29tcGFzc2VzIGJvdGggdGhlIHN0YXJ0IGFuZCBlbmQgbm9kZXNcbiAgIyAgICAgICBzdGFydDogICAgICAgICAgVGhlIGZpcnN0IFRleHROb2RlIGluIHRoZSByYW5nZS5cbiAgIyAgICAgICBlbmQgICAgICAgICAgICAgVGhlIGxhc3QgVGV4dE5vZGUgaW4gdGhlIHJhbmdlLlxuICAjXG4gICMgUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBOb3JtYWxpemVkUmFuZ2UuXG4gIGNvbnN0cnVjdG9yOiAob2JqKSAtPlxuICAgIEBjb21tb25BbmNlc3RvciA9IG9iai5jb21tb25BbmNlc3RvclxuICAgIEBzdGFydCAgICAgICAgICA9IG9iai5zdGFydFxuICAgIEBlbmQgICAgICAgICAgICA9IG9iai5lbmRcblxuICAjIFB1YmxpYzogRm9yIEFQSSBjb25zaXN0ZW5jeS5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmLlxuICBub3JtYWxpemU6IChyb290KSAtPlxuICAgIHRoaXNcblxuICAjIFB1YmxpYzogTGltaXRzIHRoZSBub2RlcyB3aXRoaW4gdGhlIE5vcm1hbGl6ZWRSYW5nZSB0byB0aG9zZSBjb250YWluZWRcbiAgIyB3aXRoaW5nIHRoZSBib3VuZHMgcGFyYW1ldGVyLiBJdCByZXR1cm5zIGFuIHVwZGF0ZWQgcmFuZ2Ugd2l0aCBhbGxcbiAgIyBwcm9wZXJ0aWVzIHVwZGF0ZWQuIE5PVEU6IE1ldGhvZCByZXR1cm5zIG51bGwgaWYgYWxsIG5vZGVzIGZhbGwgb3V0c2lkZVxuICAjIG9mIHRoZSBib3VuZHMuXG4gICNcbiAgIyBib3VuZHMgLSBBbiBFbGVtZW50IHRvIGxpbWl0IHRoZSByYW5nZSB0by5cbiAgI1xuICAjIFJldHVybnMgdXBkYXRlZCBzZWxmIG9yIG51bGwuXG4gIGxpbWl0OiAoYm91bmRzKSAtPlxuICAgIG5vZGVzID0gJC5ncmVwIHRoaXMudGV4dE5vZGVzKCksIChub2RlKSAtPlxuICAgICAgbm9kZS5wYXJlbnROb2RlID09IGJvdW5kcyBvciAkLmNvbnRhaW5zKGJvdW5kcywgbm9kZS5wYXJlbnROb2RlKVxuXG4gICAgcmV0dXJuIG51bGwgdW5sZXNzIG5vZGVzLmxlbmd0aFxuXG4gICAgQHN0YXJ0ID0gbm9kZXNbMF1cbiAgICBAZW5kICAgPSBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXVxuXG4gICAgc3RhcnRQYXJlbnRzID0gJChAc3RhcnQpLnBhcmVudHMoKVxuICAgIGZvciBwYXJlbnQgaW4gJChAZW5kKS5wYXJlbnRzKClcbiAgICAgIGlmIHN0YXJ0UGFyZW50cy5pbmRleChwYXJlbnQpICE9IC0xXG4gICAgICAgIEBjb21tb25BbmNlc3RvciA9IHBhcmVudFxuICAgICAgICBicmVha1xuICAgIHRoaXNcblxuICAjIENvbnZlcnQgdGhpcyByYW5nZSBpbnRvIGFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHR3byBwYWlycyBvZiAoeHBhdGgsXG4gICMgY2hhcmFjdGVyIG9mZnNldCksIHdoaWNoIGNhbiBiZSBlYXNpbHkgc3RvcmVkIGluIGEgZGF0YWJhc2UuXG4gICNcbiAgIyByb290IC0gICAgICAgICAgIFRoZSByb290IEVsZW1lbnQgcmVsYXRpdmUgdG8gd2hpY2ggWFBhdGhzIHNob3VsZCBiZSBjYWxjdWxhdGVkXG4gICMgaWdub3JlU2VsZWN0b3IgLSBBIHNlbGVjdG9yIFN0cmluZyBvZiBlbGVtZW50cyB0byBpZ25vcmUuIEZvciBleGFtcGxlXG4gICMgICAgICAgICAgICAgICAgICBlbGVtZW50cyBpbmplY3RlZCBieSB0aGUgYW5ub3RhdG9yLlxuICAjXG4gICMgUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBTZXJpYWxpemVkUmFuZ2UuXG4gIHNlcmlhbGl6ZTogKHJvb3QsIGlnbm9yZVNlbGVjdG9yKSAtPlxuXG4gICAgc2VyaWFsaXphdGlvbiA9IChub2RlLCBpc0VuZCkgLT5cbiAgICAgIGlmIGlnbm9yZVNlbGVjdG9yXG4gICAgICAgIG9yaWdQYXJlbnQgPSAkKG5vZGUpLnBhcmVudHMoXCI6bm90KCN7aWdub3JlU2VsZWN0b3J9KVwiKS5lcSgwKVxuICAgICAgZWxzZVxuICAgICAgICBvcmlnUGFyZW50ID0gJChub2RlKS5wYXJlbnQoKVxuXG4gICAgICB4cGF0aCA9IFV0aWwueHBhdGhGcm9tTm9kZShvcmlnUGFyZW50LCByb290KVswXVxuICAgICAgdGV4dE5vZGVzID0gVXRpbC5nZXRUZXh0Tm9kZXMob3JpZ1BhcmVudClcblxuICAgICAgIyBDYWxjdWxhdGUgcmVhbCBvZmZzZXQgYXMgdGhlIGNvbWJpbmVkIGxlbmd0aCBvZiBhbGwgdGhlXG4gICAgICAjIHByZWNlZGluZyB0ZXh0Tm9kZSBzaWJsaW5ncy4gV2UgaW5jbHVkZSB0aGUgbGVuZ3RoIG9mIHRoZVxuICAgICAgIyBub2RlIGlmIGl0J3MgdGhlIGVuZCBub2RlLlxuICAgICAgbm9kZXMgPSB0ZXh0Tm9kZXMuc2xpY2UoMCwgdGV4dE5vZGVzLmluZGV4KG5vZGUpKVxuICAgICAgb2Zmc2V0ID0gMFxuICAgICAgZm9yIG4gaW4gbm9kZXNcbiAgICAgICAgb2Zmc2V0ICs9IG4ubm9kZVZhbHVlLmxlbmd0aFxuXG4gICAgICBpZiBpc0VuZCB0aGVuIFt4cGF0aCwgb2Zmc2V0ICsgbm9kZS5ub2RlVmFsdWUubGVuZ3RoXSBlbHNlIFt4cGF0aCwgb2Zmc2V0XVxuXG4gICAgc3RhcnQgPSBzZXJpYWxpemF0aW9uKEBzdGFydClcbiAgICBlbmQgICA9IHNlcmlhbGl6YXRpb24oQGVuZCwgdHJ1ZSlcblxuICAgIG5ldyBSYW5nZS5TZXJpYWxpemVkUmFuZ2Uoe1xuICAgICAgIyBYUGF0aCBzdHJpbmdzXG4gICAgICBzdGFydDogc3RhcnRbMF1cbiAgICAgIGVuZDogZW5kWzBdXG4gICAgICAjIENoYXJhY3RlciBvZmZzZXRzIChpbnRlZ2VyKVxuICAgICAgc3RhcnRPZmZzZXQ6IHN0YXJ0WzFdXG4gICAgICBlbmRPZmZzZXQ6IGVuZFsxXVxuICAgIH0pXG5cbiAgIyBQdWJsaWM6IENyZWF0ZXMgYSBjb25jYXRlbmF0ZWQgU3RyaW5nIG9mIHRoZSBjb250ZW50cyBvZiBhbGwgdGhlIHRleHQgbm9kZXNcbiAgIyB3aXRoaW4gdGhlIHJhbmdlLlxuICAjXG4gICMgUmV0dXJucyBhIFN0cmluZy5cbiAgdGV4dDogLT5cbiAgICAoZm9yIG5vZGUgaW4gdGhpcy50ZXh0Tm9kZXMoKVxuICAgICAgbm9kZS5ub2RlVmFsdWVcbiAgICApLmpvaW4gJydcblxuICAjIFB1YmxpYzogRmV0Y2hlcyBvbmx5IHRoZSB0ZXh0IG5vZGVzIHdpdGhpbiB0aCByYW5nZS5cbiAgI1xuICAjIFJldHVybnMgYW4gQXJyYXkgb2YgVGV4dE5vZGUgaW5zdGFuY2VzLlxuICB0ZXh0Tm9kZXM6IC0+XG4gICAgdGV4dE5vZGVzID0gVXRpbC5nZXRUZXh0Tm9kZXMoJCh0aGlzLmNvbW1vbkFuY2VzdG9yKSlcbiAgICBbc3RhcnQsIGVuZF0gPSBbdGV4dE5vZGVzLmluZGV4KHRoaXMuc3RhcnQpLCB0ZXh0Tm9kZXMuaW5kZXgodGhpcy5lbmQpXVxuICAgICMgUmV0dXJuIHRoZSB0ZXh0Tm9kZXMgdGhhdCBmYWxsIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgaW5kZXhlcy5cbiAgICAkLm1ha2VBcnJheSB0ZXh0Tm9kZXNbc3RhcnQuLmVuZF1cblxuICAjIFB1YmxpYzogQ29udmVydHMgdGhlIE5vcm1hbGl6ZWQgcmFuZ2UgdG8gYSBuYXRpdmUgYnJvd3NlciByYW5nZS5cbiAgI1xuICAjIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3JhbmdlXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgIyAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAjICAgc2VsZWN0aW9uLmFkZFJhbmdlKG5vcm1lZFJhbmdlLnRvUmFuZ2UoKSlcbiAgI1xuICAjIFJldHVybnMgYSBSYW5nZSBvYmplY3QuXG4gIHRvUmFuZ2U6IC0+XG4gICAgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUoQHN0YXJ0KVxuICAgIHJhbmdlLnNldEVuZEFmdGVyKEBlbmQpXG4gICAgcmFuZ2VcblxuIyBQdWJsaWM6IEEgcmFuZ2Ugc3VpdGFibGUgZm9yIHN0b3JpbmcgaW4gbG9jYWwgc3RvcmFnZSBvciBzZXJpYWxpemluZyB0byBKU09OLlxuY2xhc3MgUmFuZ2UuU2VyaWFsaXplZFJhbmdlXG5cbiAgIyBQdWJsaWM6IENyZWF0ZXMgYSBTZXJpYWxpemVkUmFuZ2VcbiAgI1xuICAjIG9iaiAtIFRoZSBzdG9yZWQgb2JqZWN0LiBJdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMuXG4gICMgICAgICAgc3RhcnQ6ICAgICAgIEFuIHhwYXRoIHRvIHRoZSBFbGVtZW50IGNvbnRhaW5pbmcgdGhlIGZpcnN0IFRleHROb2RlXG4gICMgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByb290IEVsZW1lbnQuXG4gICMgICAgICAgc3RhcnRPZmZzZXQ6IFRoZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWxlY3Rpb24gZnJvbSBvYmouc3RhcnQuXG4gICMgICAgICAgZW5kOiAgICAgICAgIEFuIHhwYXRoIHRvIHRoZSBFbGVtZW50IGNvbnRhaW5pbmcgdGhlIGxhc3QgVGV4dE5vZGVcbiAgIyAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3QgRWxlbWVudC5cbiAgIyAgICAgICBzdGFydE9mZnNldDogVGhlIG9mZnNldCB0byB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gZnJvbSBvYmouZW5kLlxuICAjXG4gICMgUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBTZXJpYWxpemVkUmFuZ2VcbiAgY29uc3RydWN0b3I6IChvYmopIC0+XG4gICAgQHN0YXJ0ICAgICAgID0gb2JqLnN0YXJ0XG4gICAgQHN0YXJ0T2Zmc2V0ID0gb2JqLnN0YXJ0T2Zmc2V0XG4gICAgQGVuZCAgICAgICAgID0gb2JqLmVuZFxuICAgIEBlbmRPZmZzZXQgICA9IG9iai5lbmRPZmZzZXRcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhIE5vcm1hbGl6ZWRSYW5nZS5cbiAgI1xuICAjIHJvb3QgLSBUaGUgcm9vdCBFbGVtZW50IGZyb20gd2hpY2ggdGhlIFhQYXRocyB3ZXJlIGdlbmVyYXRlZC5cbiAgI1xuICAjIFJldHVybnMgYSBOb3JtYWxpemVkUmFuZ2UgaW5zdGFuY2UuXG4gIG5vcm1hbGl6ZTogKHJvb3QpIC0+XG4gICAgcmFuZ2UgPSB7fVxuXG4gICAgZm9yIHAgaW4gWydzdGFydCcsICdlbmQnXVxuICAgICAgdHJ5XG4gICAgICAgIG5vZGUgPSBSYW5nZS5ub2RlRnJvbVhQYXRoKHRoaXNbcF0sIHJvb3QpXG4gICAgICBjYXRjaCBlXG4gICAgICAgIHRocm93IG5ldyBSYW5nZS5SYW5nZUVycm9yKHAsIFwiRXJyb3Igd2hpbGUgZmluZGluZyAje3B9IG5vZGU6ICN7dGhpc1twXX06IFwiICsgZSwgZSlcblxuICAgICAgaWYgbm90IG5vZGVcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlLlJhbmdlRXJyb3IocCwgXCJDb3VsZG4ndCBmaW5kICN7cH0gbm9kZTogI3t0aGlzW3BdfVwiKVxuXG4gICAgICAjIFVuZm9ydHVuYXRlbHksIHdlICpjYW4ndCogZ3VhcmFudGVlIG9ubHkgb25lIHRleHROb2RlIHBlclxuICAgICAgIyBlbGVtZW50Tm9kZSwgc28gd2UgaGF2ZSB0byB3YWxrIGFsb25nIHRoZSBlbGVtZW50J3MgdGV4dE5vZGVzIHVudGlsXG4gICAgICAjIHRoZSBjb21iaW5lZCBsZW5ndGggb2YgdGhlIHRleHROb2RlcyB0byB0aGF0IHBvaW50IGV4Y2VlZHMgb3JcbiAgICAgICMgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIG9mZnNldC5cbiAgICAgIGxlbmd0aCA9IDBcbiAgICAgIHRhcmdldE9mZnNldCA9IHRoaXNbcCArICdPZmZzZXQnXVxuXG4gICAgICAjIFJhbmdlIGV4Y2x1ZGVzIGl0cyBlbmRwb2ludCBiZWNhdXNlIGl0IGRlc2NyaWJlcyB0aGUgYm91bmRhcnkgcG9zaXRpb24uXG4gICAgICAjIFRhcmdldCB0aGUgc3RyaW5nIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbnNpZGUgdGhlIHJhbmdlLlxuICAgICAgaWYgcCBpcyAnZW5kJyB0aGVuIHRhcmdldE9mZnNldC0tXG5cbiAgICAgIGZvciB0biBpbiBVdGlsLmdldFRleHROb2RlcygkKG5vZGUpKVxuICAgICAgICBpZiAobGVuZ3RoICsgdG4ubm9kZVZhbHVlLmxlbmd0aCA+IHRhcmdldE9mZnNldClcbiAgICAgICAgICByYW5nZVtwICsgJ0NvbnRhaW5lciddID0gdG5cbiAgICAgICAgICByYW5nZVtwICsgJ09mZnNldCddID0gdGhpc1twICsgJ09mZnNldCddIC0gbGVuZ3RoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGxlbmd0aCArPSB0bi5ub2RlVmFsdWUubGVuZ3RoXG5cbiAgICAgICMgSWYgd2UgZmFsbCBvZmYgdGhlIGVuZCBvZiB0aGUgZm9yIGxvb3Agd2l0aG91dCBoYXZpbmcgc2V0XG4gICAgICAjICdzdGFydE9mZnNldCcvJ2VuZE9mZnNldCcsIHRoZSBlbGVtZW50IGhhcyBzaG9ydGVyIGNvbnRlbnQgdGhhbiB3aGVuXG4gICAgICAjIHdlIGFubm90YXRlZCwgc28gdGhyb3cgYW4gZXJyb3I6XG4gICAgICBpZiBub3QgcmFuZ2VbcCArICdPZmZzZXQnXT9cbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlLlJhbmdlRXJyb3IoXCIje3B9b2Zmc2V0XCIsIFwiQ291bGRuJ3QgZmluZCBvZmZzZXQgI3t0aGlzW3AgKyAnT2Zmc2V0J119IGluIGVsZW1lbnQgI3t0aGlzW3BdfVwiKVxuXG4gICAgIyBIZXJlJ3MgYW4gZWxlZ2FudCBuZXh0IHN0ZXAuLi5cbiAgICAjXG4gICAgIyAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyID0gJChyYW5nZS5zdGFydENvbnRhaW5lcikucGFyZW50cygpLmhhcyhyYW5nZS5lbmRDb250YWluZXIpWzBdXG4gICAgI1xuICAgICMgLi4uYnV0IHVuZm9ydHVuYXRlbHkgTm9kZS5jb250YWlucygpIGlzIGJyb2tlbiBpbiBTYWZhcmkgNS4xLjUgKDc1MzQuNTUuMylcbiAgICAjIGFuZCBwcmVzdW1hYmx5IG90aGVyIGVhcmxpZXIgdmVyc2lvbnMgb2YgV2ViS2l0LiBJbiBwYXJ0aWN1bGFyLCBpbiBhXG4gICAgIyBkb2N1bWVudCBsaWtlXG4gICAgI1xuICAgICMgICA8cD5IZWxsbzwvcD5cbiAgICAjXG4gICAgIyB0aGUgY29kZVxuICAgICNcbiAgICAjICAgcCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwJylbMF1cbiAgICAjICAgcC5jb250YWlucyhwLmZpcnN0Q2hpbGQpXG4gICAgI1xuICAgICMgcmV0dXJucyBgZmFsc2VgLiBZYXkuXG4gICAgI1xuICAgICMgU28gaW5zdGVhZCwgd2Ugc3RlcCB0aHJvdWdoIHRoZSBwYXJlbnRzIGZyb20gdGhlIGJvdHRvbSB1cCBhbmQgdXNlXG4gICAgIyBOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCkgdG8gZGVjaWRlIHdoZW4gdG8gc2V0IHRoZVxuICAgICMgY29tbW9uQW5jZXN0b3JDb250YWluZXIgYW5kIGJhaWwgb3V0LlxuXG4gICAgY29udGFpbnMgPVxuICAgICAgaWYgbm90IGRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP1xuICAgICAgICAjIElFXG4gICAgICAgIChhLCBiKSAtPiBhLmNvbnRhaW5zKGIpXG4gICAgICBlbHNlXG4gICAgICAgICMgRXZlcnlvbmUgZWxzZVxuICAgICAgICAoYSwgYikgLT4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDE2XG5cbiAgICAkKHJhbmdlLnN0YXJ0Q29udGFpbmVyKS5wYXJlbnRzKCkuZWFjaCAtPlxuICAgICAgaWYgY29udGFpbnModGhpcywgcmFuZ2UuZW5kQ29udGFpbmVyKVxuICAgICAgICByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lciA9IHRoaXNcbiAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBuZXcgUmFuZ2UuQnJvd3NlclJhbmdlKHJhbmdlKS5ub3JtYWxpemUocm9vdClcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhIHJhbmdlIHN1aXRhYmxlIGZvciBzdG9yYWdlLlxuICAjXG4gICMgcm9vdCAgICAgICAgICAgLSBBIHJvb3QgRWxlbWVudCBmcm9tIHdoaWNoIHRvIGFuY2hvciB0aGUgc2VyaWFsaXNhdGlvbi5cbiAgIyBpZ25vcmVTZWxlY3RvciAtIEEgc2VsZWN0b3IgU3RyaW5nIG9mIGVsZW1lbnRzIHRvIGlnbm9yZS4gRm9yIGV4YW1wbGVcbiAgIyAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGluamVjdGVkIGJ5IHRoZSBhbm5vdGF0b3IuXG4gICNcbiAgIyBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIFNlcmlhbGl6ZWRSYW5nZS5cbiAgc2VyaWFsaXplOiAocm9vdCwgaWdub3JlU2VsZWN0b3IpIC0+XG4gICAgdGhpcy5ub3JtYWxpemUocm9vdCkuc2VyaWFsaXplKHJvb3QsIGlnbm9yZVNlbGVjdG9yKVxuXG4gICMgUHVibGljOiBSZXR1cm5zIHRoZSByYW5nZSBhcyBhbiBPYmplY3QgbGl0ZXJhbC5cbiAgdG9PYmplY3Q6IC0+XG4gICAge1xuICAgICAgc3RhcnQ6IEBzdGFydFxuICAgICAgc3RhcnRPZmZzZXQ6IEBzdGFydE9mZnNldFxuICAgICAgZW5kOiBAZW5kXG4gICAgICBlbmRPZmZzZXQ6IEBlbmRPZmZzZXRcbiAgICB9XG5cblxuIyBFeHBvcnQgUmFuZ2Ugb2JqZWN0LlxubW9kdWxlLmV4cG9ydHMgPSBSYW5nZVxuIiwiIyBSZWdpc3RyeSBpcyBhIGZhY3RvcnkgZm9yIGFubm90YXRvciBhcHBsaWNhdGlvbnMgcHJvdmlkaW5nIGEgc2ltcGxlIHJ1bnRpbWVcbiMgZXh0ZW5zaW9uIGludGVyZmFjZSBhbmQgYXBwbGljYXRpb24gbG9hZGVyLiBJdCBpcyB1c2VkIHRvIHBhc3Mgc2V0dGluZ3MgdG9cbiMgZXh0ZW5zaW9uIG1vZHVsZXMgYW5kIHByb3ZpZGUgYSBtZWFucyBieSB3aGljaCBleHRlbnNpb25zIGNhbiBleHBvcnRcbiMgZnVuY3Rpb25hbGl0eSB0byBhcHBsaWNhdGlvbnMuXG5jbGFzcyBSZWdpc3RyeVxuXG4gICMgUHVibGljOiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIGRlZmluZWQgYnkgdGhlIHByb3ZpZGVkXG4gICMgbW9kdWxlLiBUaGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlIGEgbmV3IHJlZ2lzdHJ5IGluc3RhbmNlIHdob3NlIHNldHRpbmdzXG4gICMgbWF5IGJlIHByb3ZpZGVkIGFzIGEgc2Vjb25kIGFyZ3VtZW50IHRvIHRoaXMgbWV0aG9kLiBUaGUgcmVnaXN0cnkgd2lsbFxuICAjIGltbWVkaWF0ZWx5IGludm9rZSB0aGUgcnVuIGNhbGxiYWNrIG9mIHRoZSBtb2R1bGUuXG4gIEBjcmVhdGVBcHA6IChhcHBNb2R1bGUsIHNldHRpbmdzPXt9KSAtPlxuICAgIChuZXcgdGhpcyhzZXR0aW5ncykpLnJ1bihhcHBNb2R1bGUpXG5cbiAgY29uc3RydWN0b3I6IChAc2V0dGluZ3M9e30pIC0+XG5cbiAgIyBQdWJsaWM6IEluY2x1ZGUgYSBtb2R1bGUuIEEgbW9kdWxlIGlzIGFueSBPYmplY3Qgd2l0aCBhIGZ1Y3Rpb24gcHJvcGVydHlcbiAgIyBuYW1lZCAnY29uZmlndXJlYC4gVGhpcyBmdW5jdGlvbiBpcyBpbW1lZGlhdGVseSBpbnZva2VkIHdpdGggdGhlIHJlZ2lzdHJ5XG4gICMgaW5zdGFuY2UgYXMgdGhlIG9ubHkgYXJndW1lbnQuXG4gIGluY2x1ZGU6IChtb2R1bGUpIC0+XG4gICAgbW9kdWxlLmNvbmZpZ3VyZSh0aGlzKVxuICAgIHRoaXNcblxuICAjIFB1YmxpYzogUnVuIGFuIGFwcGxpY2F0aW9uLiBBbiBhcHBsaWNhdGlvbiBpcyBhIG1vZHVsZSB3aXRoIGEgZnVuY3Rpb25cbiAgIyBwcm9wZXJ0eSBuYW1lZCAncnVuJy4gVGhlIGFwcGxpY2F0aW9uIGlzIGltbWVkaWF0ZWx5IGluY2x1ZGVkIGFuZCBpdHMgcnVuXG4gICMgY2FsbGJhY2sgaW52b2tlZCB3aXRoIHRoZSByZWdpc3RyeSBpbnN0YW5jZSBhcyB0aGUgb25seSBhcmd1bWVudC5cbiAgcnVuOiAoYXBwKSAtPlxuICAgIGlmIHRoaXMuYXBwXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWdpc3RyeSBpcyBhbHJlYWR5IGJvdW5kIHRvIGEgcnVubmluZyBhcHBsaWNhdGlvblwiKVxuXG4gICAgdGhpcy5pbmNsdWRlKGFwcClcblxuICAgIGZvciBvd24gaywgdiBvZiB0aGlzXG4gICAgICBhcHBba10gPSB2XG5cbiAgICB0aGlzLmFwcCA9IGFwcFxuICAgIGFwcC5ydW4odGhpcylcblxubW9kdWxlLmV4cG9ydHMgPSBSZWdpc3RyeVxuIiwiIyBQdWJsaWM6IEFkZHMgcGVyc2lzdGVuY2UgaG9va3MgZm9yIGFubm90YXRpb25zLlxuY2xhc3MgU3RvcmFnZVByb3ZpZGVyXG5cbiAgQGNvbmZpZ3VyZTogKHJlZ2lzdHJ5KSAtPlxuICAgIGtsYXNzID0gcmVnaXN0cnkuc2V0dGluZ3Muc3RvcmU/LnR5cGVcblxuICAgIGlmIHR5cGVvZihrbGFzcykgaXMgJ2Z1bmN0aW9uJ1xuICAgICAgc3RvcmUgPSBuZXcga2xhc3MocmVnaXN0cnkuc2V0dGluZ3Muc3RvcmUpXG4gICAgZWxzZVxuICAgICAgc3RvcmUgPSBuZXcgdGhpcyhyZWdpc3RyeSlcblxuICAgIHJlZ2lzdHJ5WydzdG9yZSddID89IHN0b3JlXG5cbiAgY29uc3RydWN0b3I6IChAcmVnaXN0cnkpIC0+XG5cbiAgIyBQdWJsaWM6IGdldCBhbiB1bmlxdWUgaWRlbnRpZmllclxuICBpZDogKC0+IGNvdW50ZXIgPSAwOyAtPiBjb3VudGVyKyspKClcblxuICAjIFB1YmxpYzogY3JlYXRlIGFuIGFubm90YXRpb25cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdCB0byBjcmVhdGUuXG4gICNcbiAgIyBSZXR1cm5zIGEgcHJvbWlzZSBvZiB0aGUgbmV3IGFubm90YXRpb24gT2JqZWN0LlxuICBjcmVhdGU6IChhbm5vdGF0aW9uKSAtPlxuICAgIGRmZCA9ICQuRGVmZXJyZWQoKVxuICAgIGlmIG5vdCBhbm5vdGF0aW9uLmlkP1xuICAgICAgYW5ub3RhdGlvbi5pZCA9IHRoaXMuaWQoKVxuICAgIGRmZC5yZXNvbHZlKGFubm90YXRpb24pXG4gICAgcmV0dXJuIGRmZC5wcm9taXNlKClcblxuICAjIFB1YmxpYzogdXBkYXRlIGFuIGFubm90YXRpb25cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdCB0byBiZSB1cGRhdGVkLlxuICAjXG4gICMgUmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIHVwZGF0ZWQgYW5ub3RhdGlvbiBPYmplY3QuXG4gIHVwZGF0ZTogKGFubm90YXRpb24pIC0+XG4gICAgZGZkID0gJC5EZWZlcnJlZCgpXG4gICAgZGZkLnJlc29sdmUoYW5ub3RhdGlvbilcbiAgICByZXR1cm4gZGZkLnByb21pc2UoKVxuXG4gICMgUHVibGljOiBkZWxldGUgYW4gYW5ub3RhdGlvblxuICAjXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gT2JqZWN0IHRvIGJlIGRlbGV0ZWQuXG4gICNcbiAgIyBSZXR1cm5zIGEgcHJvbWlzZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBkZWxldGUgb3BlcmF0aW9uLlxuICBkZWxldGU6IChhbm5vdGF0aW9uKSAtPlxuICAgIGRmZCA9ICQuRGVmZXJyZWQoKVxuICAgIGRmZC5yZXNvbHZlKGFubm90YXRpb24pXG4gICAgcmV0dXJuIGRmZC5wcm9taXNlKClcblxuICAjIFB1YmxpYzogcXVlcnkgdGhlIHN0b3JlIGZvciBhbm5vdGF0aW9uc1xuICAjXG4gICMgUmV0dXJucyBhIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBxdWVyeSByZXN1bHRzIGFuZCBxdWVyeSBtZXRhZGF0YS5cbiAgcXVlcnk6IChxdWVyeU9iaikgLT5cbiAgICBkZmQgPSAkLkRlZmVycmVkKClcbiAgICBkZmQucmVzb2x2ZShbXSwge30pXG4gICAgcmV0dXJuIGRmZC5wcm9taXNlKClcblxubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlUHJvdmlkZXJcbiIsInhwYXRoID0gcmVxdWlyZSAnLi94cGF0aCdcblxuXG4jIEkxOE5cbmdldHRleHQgPSBudWxsXG5cbmlmIEdldHRleHQ/XG4gIF9nZXR0ZXh0ID0gbmV3IEdldHRleHQoZG9tYWluOiBcImFubm90YXRvclwiKVxuICBnZXR0ZXh0ID0gKG1zZ2lkKSAtPiBfZ2V0dGV4dC5nZXR0ZXh0KG1zZ2lkKVxuZWxzZVxuICBnZXR0ZXh0ID0gKG1zZ2lkKSAtPiBtc2dpZFxuXG5fdCA9IChtc2dpZCkgLT4gZ2V0dGV4dChtc2dpZClcblxudW5sZXNzIGpRdWVyeT8uZm4/LmpxdWVyeVxuICBjb25zb2xlLmVycm9yKF90KFwiQW5ub3RhdG9yIHJlcXVpcmVzIGpRdWVyeTogaGF2ZSB5b3UgaW5jbHVkZWQgbGliL3ZlbmRvci9qcXVlcnkuanM/XCIpKVxuXG51bmxlc3MgSlNPTiBhbmQgSlNPTi5wYXJzZSBhbmQgSlNPTi5zdHJpbmdpZnlcbiAgY29uc29sZS5lcnJvcihfdChcIkFubm90YXRvciByZXF1aXJlcyBhIEpTT04gaW1wbGVtZW50YXRpb246IGhhdmUgeW91IGluY2x1ZGVkIGxpYi92ZW5kb3IvanNvbjIuanM/XCIpKVxuXG5VdGlsID0ge31cblxuIyBQdWJsaWM6IENyZWF0ZSBhIEdldHRleHQgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSBhIG1lc3NhZ2UgaWRcbiNcbiMgUmV0dXJucyBhIFN0cmluZ1xuVXRpbC5UcmFuc2xhdGlvblN0cmluZyA9IF90XG5cblxuIyBQdWJsaWM6IEZsYXR0ZW4gYSBuZXN0ZWQgYXJyYXkgc3RydWN0dXJlXG4jXG4jIFJldHVybnMgYW4gYXJyYXlcblV0aWwuZmxhdHRlbiA9IChhcnJheSkgLT5cbiAgZmxhdHRlbiA9IChhcnkpIC0+XG4gICAgZmxhdCA9IFtdXG5cbiAgICBmb3IgZWwgaW4gYXJ5XG4gICAgICBmbGF0ID0gZmxhdC5jb25jYXQoaWYgZWwgYW5kICQuaXNBcnJheShlbCkgdGhlbiBmbGF0dGVuKGVsKSBlbHNlIGVsKVxuXG4gICAgcmV0dXJuIGZsYXRcblxuICBmbGF0dGVuKGFycmF5KVxuXG4jIFB1YmxpYzogZGVjaWRlcyB3aGV0aGVyIG5vZGUgQSBpcyBhbiBhbmNlc3RvciBvZiBub2RlIEIuXG4jXG4jIFRoaXMgZnVuY3Rpb24gcHVycG9zZWZ1bGx5IGlnbm9yZXMgdGhlIG5hdGl2ZSBicm93c2VyIGZ1bmN0aW9uIGZvciB0aGlzLFxuIyBiZWNhdXNlIGl0IGFjdHMgd2VpcmQgaW4gUGhhbnRvbUpTLlxuIyBJc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2FyaXlhL3BoYW50b21qcy9pc3N1ZXMvMTE0NzlcblV0aWwuY29udGFpbnMgPSAocGFyZW50LCBjaGlsZCkgLT5cbiAgbm9kZSA9IGNoaWxkXG4gIHdoaWxlIG5vZGU/XG4gICAgaWYgbm9kZSBpcyBwYXJlbnQgdGhlbiByZXR1cm4gdHJ1ZVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGVcbiAgcmV0dXJuIGZhbHNlXG5cbiMgUHVibGljOiBGaW5kcyBhbGwgdGV4dCBub2RlcyB3aXRoaW4gdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24uXG4jXG4jIFJldHVybnMgYSBuZXcgalF1ZXJ5IGNvbGxlY3Rpb24gb2YgdGV4dCBub2Rlcy5cblV0aWwuZ2V0VGV4dE5vZGVzID0gKGpxKSAtPlxuICBnZXRUZXh0Tm9kZXMgPSAobm9kZSkgLT5cbiAgICBpZiBub2RlIGFuZCBub2RlLm5vZGVUeXBlICE9IE5vZGUuVEVYVF9OT0RFXG4gICAgICBub2RlcyA9IFtdXG5cbiAgICAgICMgSWYgbm90IGEgY29tbWVudCB0aGVuIHRyYXZlcnNlIGNoaWxkcmVuIGNvbGxlY3RpbmcgdGV4dCBub2Rlcy5cbiAgICAgICMgV2UgdHJhdmVyc2UgdGhlIGNoaWxkIG5vZGVzIG1hbnVhbGx5IHJhdGhlciB0aGFuIHVzaW5nIHRoZSAuY2hpbGROb2Rlc1xuICAgICAgIyBwcm9wZXJ0eSBiZWNhdXNlIElFOSBkb2VzIG5vdCB1cGRhdGUgdGhlIC5jaGlsZE5vZGVzIHByb3BlcnR5IGFmdGVyXG4gICAgICAjIC5zcGxpdFRleHQoKSBpcyBjYWxsZWQgb24gYSBjaGlsZCB0ZXh0IG5vZGUuXG4gICAgICBpZiBub2RlLm5vZGVUeXBlICE9IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgICAgICMgU3RhcnQgYXQgdGhlIGxhc3QgY2hpbGQgYW5kIHdhbGsgYmFja3dhcmRzIHRocm91Z2ggc2libGluZ3MuXG4gICAgICAgIG5vZGUgPSBub2RlLmxhc3RDaGlsZFxuICAgICAgICB3aGlsZSBub2RlXG4gICAgICAgICAgbm9kZXMucHVzaCBnZXRUZXh0Tm9kZXMobm9kZSlcbiAgICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmdcblxuICAgICAgIyBGaW5hbGx5IHJldmVyc2UgdGhlIGFycmF5IHNvIHRoYXQgbm9kZXMgYXJlIGluIHRoZSBjb3JyZWN0IG9yZGVyLlxuICAgICAgcmV0dXJuIG5vZGVzLnJldmVyc2UoKVxuICAgIGVsc2VcbiAgICAgIHJldHVybiBub2RlXG5cbiAganEubWFwIC0+IFV0aWwuZmxhdHRlbihnZXRUZXh0Tm9kZXModGhpcykpXG5cbiMgUHVibGljOiBkZXRlcm1pbmUgdGhlIGxhc3QgdGV4dCBub2RlIGluc2lkZSBvciBiZWZvcmUgdGhlIGdpdmVuIG5vZGVcblV0aWwuZ2V0TGFzdFRleHROb2RlVXBUbyA9IChuKSAtPlxuICBzd2l0Y2ggbi5ub2RlVHlwZVxuICAgIHdoZW4gTm9kZS5URVhUX05PREVcbiAgICAgIHJldHVybiBuICMgV2UgaGF2ZSBmb3VuZCBvdXIgdGV4dCBub2RlLlxuICAgIHdoZW4gTm9kZS5FTEVNRU5UX05PREVcbiAgICAgICMgVGhpcyBpcyBhbiBlbGVtZW50LCB3ZSBuZWVkIHRvIGRpZyBpblxuICAgICAgaWYgbi5sYXN0Q2hpbGQ/ICMgRG9lcyBpdCBoYXZlIGNoaWxkcmVuIGF0IGFsbD9cbiAgICAgICAgcmVzdWx0ID0gVXRpbC5nZXRMYXN0VGV4dE5vZGVVcFRvIG4ubGFzdENoaWxkXG4gICAgICAgIGlmIHJlc3VsdD8gdGhlbiByZXR1cm4gcmVzdWx0ICAgICAgICBcbiAgICBlbHNlXG4gICAgICAjIE5vdCBhIHRleHQgbm9kZSwgYW5kIG5vdCBhbiBlbGVtZW50IG5vZGUuXG4gICMgQ291bGQgbm90IGZpbmQgYSB0ZXh0IG5vZGUgaW4gY3VycmVudCBub2RlLCBnbyBiYWNrd2FyZHNcbiAgbiA9IG4ucHJldmlvdXNTaWJsaW5nXG4gIGlmIG4/XG4gICAgVXRpbC5nZXRMYXN0VGV4dE5vZGVVcFRvIG5cbiAgZWxzZVxuICAgIG51bGxcblxuIyBQdWJsaWM6IGRldGVybWluZSB0aGUgZmlyc3QgdGV4dCBub2RlIGluIG9yIGFmdGVyIHRoZSBnaXZlbiBqUXVlcnkgbm9kZS5cblV0aWwuZ2V0Rmlyc3RUZXh0Tm9kZU5vdEJlZm9yZSA9IChuKSAtPlxuICBzd2l0Y2ggbi5ub2RlVHlwZVxuICAgIHdoZW4gTm9kZS5URVhUX05PREVcbiAgICAgIHJldHVybiBuICMgV2UgaGF2ZSBmb3VuZCBvdXIgdGV4dCBub2RlLlxuICAgIHdoZW4gTm9kZS5FTEVNRU5UX05PREVcbiAgICAgICMgVGhpcyBpcyBhbiBlbGVtZW50LCB3ZSBuZWVkIHRvIGRpZyBpblxuICAgICAgaWYgbi5maXJzdENoaWxkPyAjIERvZXMgaXQgaGF2ZSBjaGlsZHJlbiBhdCBhbGw/XG4gICAgICAgIHJlc3VsdCA9IFV0aWwuZ2V0Rmlyc3RUZXh0Tm9kZU5vdEJlZm9yZSBuLmZpcnN0Q2hpbGRcbiAgICAgICAgaWYgcmVzdWx0PyB0aGVuIHJldHVybiByZXN1bHRcbiAgICBlbHNlXG4gICAgICAjIE5vdCBhIHRleHQgb3IgYW4gZWxlbWVudCBub2RlLlxuICAjIENvdWxkIG5vdCBmaW5kIGEgdGV4dCBub2RlIGluIGN1cnJlbnQgbm9kZSwgZ28gZm9yd2FyZFxuICBuID0gbi5uZXh0U2libGluZ1xuICBpZiBuP1xuICAgIFV0aWwuZ2V0Rmlyc3RUZXh0Tm9kZU5vdEJlZm9yZSBuXG4gIGVsc2VcbiAgICBudWxsXG5cbiMgUHVibGljOiByZWFkIG91dCB0aGUgdGV4dCB2YWx1ZSBvZiBhIHJhbmdlIHVzaW5nIHRoZSBzZWxlY3Rpb24gQVBJXG4jXG4jIFRoaXMgbWV0aG9kIHNlbGVjdHMgdGhlIHNwZWNpZmllZCByYW5nZSwgYW5kIGFza3MgZm9yIHRoZSBzdHJpbmdcbiMgdmFsdWUgb2YgdGhlIHNlbGVjdGlvbi4gV2hhdCB0aGlzIHJldHVybnMgaXMgdmVyeSBjbG9zZSB0byB3aGF0IHRoZSB1c2VyXG4jIGFjdHVhbGx5IHNlZXMuXG5VdGlsLnJlYWRSYW5nZVZpYVNlbGVjdGlvbiA9IChyYW5nZSkgLT5cbiAgc2VsID0gVXRpbC5nZXRHbG9iYWwoKS5nZXRTZWxlY3Rpb24oKSAjIEdldCB0aGUgYnJvd3NlciBzZWxlY3Rpb24gb2JqZWN0XG4gIHNlbC5yZW1vdmVBbGxSYW5nZXMoKSAgICAgICAgICAgICAgICAgIyBjbGVhciB0aGUgc2VsZWN0aW9uXG4gIHNlbC5hZGRSYW5nZSByYW5nZS50b1JhbmdlKCkgICAgICAgICAgIyBTZWxlY3QgdGhlIHJhbmdlXG4gIHNlbC50b1N0cmluZygpICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWFkIG91dCB0aGUgc2VsZWN0aW9uXG5cblV0aWwueHBhdGhGcm9tTm9kZSA9IChlbCwgcmVsYXRpdmVSb290KSAtPlxuICB0cnlcbiAgICByZXN1bHQgPSB4cGF0aC5zaW1wbGVYUGF0aEpRdWVyeS5jYWxsIGVsLCByZWxhdGl2ZVJvb3RcbiAgY2F0Y2ggZXhjZXB0aW9uXG4gICAgY29uc29sZS5sb2cgXCJqUXVlcnktYmFzZWQgWFBhdGggY29uc3RydWN0aW9uIGZhaWxlZCEgRmFsbGluZyBiYWNrIHRvIG1hbnVhbC5cIlxuICAgIHJlc3VsdCA9IHhwYXRoLnNpbXBsZVhQYXRoUHVyZS5jYWxsIGVsLCByZWxhdGl2ZVJvb3RcbiAgcmVzdWx0XG5cblV0aWwubm9kZUZyb21YUGF0aCA9ICh4cCwgcm9vdCkgLT5cbiAgc3RlcHMgPSB4cC5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpXG4gIG5vZGUgPSByb290XG4gIGZvciBzdGVwIGluIHN0ZXBzXG4gICAgW25hbWUsIGlkeF0gPSBzdGVwLnNwbGl0IFwiW1wiXG4gICAgaWR4ID0gaWYgaWR4PyB0aGVuIHBhcnNlSW50IChpZHg/LnNwbGl0IFwiXVwiKVswXSBlbHNlIDFcbiAgICBub2RlID0geHBhdGguZmluZENoaWxkIG5vZGUsIG5hbWUudG9Mb3dlckNhc2UoKSwgaWR4XG5cbiAgbm9kZVxuXG5VdGlsLmVzY2FwZSA9IChodG1sKSAtPlxuICBodG1sXG4gICAgLnJlcGxhY2UoLyYoPyFcXHcrOykvZywgJyZhbXA7JylcbiAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcblxuVXRpbC51dWlkID0gKC0+IGNvdW50ZXIgPSAwOyAtPiBjb3VudGVyKyspKClcblxuVXRpbC5nZXRHbG9iYWwgPSAtPiAoLT4gdGhpcykoKVxuXG4jIFJldHVybiB0aGUgbWF4aW11bSB6LWluZGV4IG9mIGFueSBlbGVtZW50IGluICRlbGVtZW50cyAoYSBqUXVlcnkgY29sbGVjdGlvbikuXG5VdGlsLm1heFpJbmRleCA9ICgkZWxlbWVudHMpIC0+XG4gIGFsbCA9IGZvciBlbCBpbiAkZWxlbWVudHNcbiAgICAgICAgICBpZiAkKGVsKS5jc3MoJ3Bvc2l0aW9uJykgPT0gJ3N0YXRpYydcbiAgICAgICAgICAgIC0xXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFyc2VJbnQoJChlbCkuY3NzKCd6LWluZGV4JyksIDEwKSBvciAtMVxuICBNYXRoLm1heC5hcHBseShNYXRoLCBhbGwpXG5cblV0aWwubW91c2VQb3NpdGlvbiA9IChlLCBvZmZzZXRFbCkgLT5cbiAgIyBJZiB0aGUgb2Zmc2V0IGVsZW1lbnQgaXMgbm90IGEgcG9zaXRpb25pbmcgcm9vdCB1c2UgaXRzIG9mZnNldCBwYXJlbnRcbiAgdW5sZXNzICQob2Zmc2V0RWwpLmNzcygncG9zaXRpb24nKSBpbiBbJ2Fic29sdXRlJywgJ2ZpeGVkJywgJ3JlbGF0aXZlJ11cbiAgICBvZmZzZXRFbCA9ICQob2Zmc2V0RWwpLm9mZnNldFBhcmVudCgpWzBdXG4gIG9mZnNldCA9ICQob2Zmc2V0RWwpLm9mZnNldCgpXG4gIHtcbiAgICB0b3A6ICBlLnBhZ2VZIC0gb2Zmc2V0LnRvcCxcbiAgICBsZWZ0OiBlLnBhZ2VYIC0gb2Zmc2V0LmxlZnRcbiAgfVxuXG4jIENoZWNrcyB0byBzZWUgaWYgYW4gZXZlbnQgcGFyYW1ldGVyIGlzIHByb3ZpZGVkIGFuZCBjb250YWlucyB0aGUgcHJldmVudFxuIyBkZWZhdWx0IG1ldGhvZC4gSWYgaXQgZG9lcyBpdCBjYWxscyBpdC5cbiNcbiMgVGhpcyBpcyB1c2VmdWwgZm9yIG1ldGhvZHMgdGhhdCBjYW4gYmUgb3B0aW9uYWxseSB1c2VkIGFzIGNhbGxiYWNrc1xuIyB3aGVyZSB0aGUgZXhpc3RhbmNlIG9mIHRoZSBwYXJhbWV0ZXIgbXVzdCBiZSBjaGVja2VkIGJlZm9yZSBjYWxsaW5nLlxuVXRpbC5wcmV2ZW50RXZlbnREZWZhdWx0ID0gKGV2ZW50KSAtPlxuICBldmVudD8ucHJldmVudERlZmF1bHQ/KClcblxuXG4jIEV4cG9ydCBVdGlsIG9iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBVdGlsXG4iLCJVdGlsID0gcmVxdWlyZSAnLi91dGlsJ1xuV2lkZ2V0ID0gcmVxdWlyZSAnLi93aWRnZXQnXG5cblxuX3QgPSBVdGlsLlRyYW5zbGF0aW9uU3RyaW5nXG5cblxuIyBQdWJsaWM6IENyZWF0ZXMgYW4gZWxlbWVudCBmb3Igdmlld2luZyBhbm5vdGF0aW9ucy5cbmNsYXNzIFZpZXdlciBleHRlbmRzIFdpZGdldFxuXG4gICMgRXZlbnRzIHRvIGJlIGJvdW5kIHRvIHRoZSBAZWxlbWVudC5cbiAgZXZlbnRzOlxuICAgIFwiLmFubm90YXRvci1lZGl0IGNsaWNrXCI6ICAgXCJvbkVkaXRDbGlja1wiXG4gICAgXCIuYW5ub3RhdG9yLWRlbGV0ZSBjbGlja1wiOiBcIm9uRGVsZXRlQ2xpY2tcIlxuXG4gICMgQ2xhc3NlcyBmb3IgdG9nZ2xpbmcgYW5ub3RhdG9yIHN0YXRlLlxuICBjbGFzc2VzOlxuICAgIGhpZGU6ICdhbm5vdGF0b3ItaGlkZSdcbiAgICBzaG93Q29udHJvbHM6ICdhbm5vdGF0b3ItdmlzaWJsZSdcblxuICAjIEhUTUwgdGVtcGxhdGVzIGZvciBAZWxlbWVudCBhbmQgQGl0ZW0gcHJvcGVydGllcy5cbiAgaHRtbDpcbiAgICBlbGVtZW50OlwiXCJcIlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFubm90YXRvci1vdXRlciBhbm5vdGF0b3Itdmlld2VyXCI+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImFubm90YXRvci13aWRnZXQgYW5ub3RhdG9yLWxpc3RpbmdcIj48L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcIlwiXCJcbiAgICBpdGVtOiAgIFwiXCJcIlxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiYW5ub3RhdG9yLWFubm90YXRpb24gYW5ub3RhdG9yLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhbm5vdGF0b3ItY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIHRpdGxlPVwiVmlldyBhcyB3ZWJwYWdlXCIgY2xhc3M9XCJhbm5vdGF0b3ItbGlua1wiPlZpZXcgYXMgd2VicGFnZTwvYT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIkVkaXRcIiBjbGFzcz1cImFubm90YXRvci1lZGl0XCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRpdGxlPVwiRGVsZXRlXCIgY2xhc3M9XCJhbm5vdGF0b3ItZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICBcIlwiXCJcblxuICAjIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICBvcHRpb25zOlxuICAgIHJlYWRPbmx5OiBmYWxzZSAjIFN0YXJ0IHRoZSB2aWV3ZXIgaW4gcmVhZC1vbmx5IG1vZGUuIE5vIGNvbnRyb2xzIHdpbGwgYmUgc2hvd24uXG5cbiAgIyBQdWJsaWM6IENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFZpZXdlciBvYmplY3QuIFRoaXMgd2lsbCBjcmVhdGUgdGhlXG4gICMgQGVsZW1lbnQgZnJvbSB0aGUgQGh0bWwuZWxlbWVudCBzdHJpbmcgYW5kIHNldCB1cCBhbGwgZXZlbnRzLlxuICAjXG4gICMgb3B0aW9ucyAtIEFuIE9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcgb3B0aW9ucy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgQ3JlYXRlcyBhIG5ldyB2aWV3ZXIsIGFkZHMgYSBjdXN0b20gZmllbGQgYW5kIGRpc3BsYXlzIGFuIGFubm90YXRpb24uXG4gICMgICB2aWV3ZXIgPSBuZXcgQW5ub3RhdG9yLlZpZXdlcigpXG4gICMgICB2aWV3ZXIuYWRkRmllbGQoe1xuICAjICAgICBsb2FkOiBzb21lTG9hZENhbGxiYWNrXG4gICMgICB9KVxuICAjICAgdmlld2VyLmxvYWQoYW5ub3RhdGlvbilcbiAgI1xuICAjIFJldHVybnMgYSBuZXcgVmlld2VyIGluc3RhbmNlLlxuICBjb25zdHJ1Y3RvcjogKG9wdGlvbnMpIC0+XG4gICAgc3VwZXIgJChAaHRtbC5lbGVtZW50KVswXSwgb3B0aW9uc1xuXG4gICAgQGl0ZW0gICA9ICQoQGh0bWwuaXRlbSlbMF1cbiAgICBAZmllbGRzID0gW11cbiAgICBAYW5ub3RhdGlvbnMgPSBbXVxuXG4gICMgUHVibGljOiBEaXNwbGF5cyB0aGUgVmlld2VyIGFuZCBmaXJzdCB0aGUgXCJzaG93XCIgZXZlbnQuIENhbiBiZSB1c2VkIGFzIGFuXG4gICMgZXZlbnQgY2FsbGJhY2sgYW5kIHdpbGwgY2FsbCBFdmVudCNwcmV2ZW50RGVmYXVsdCgpIG9uIHRoZSBzdXBwbGllZCBldmVudC5cbiAgI1xuICAjIGV2ZW50IC0gRXZlbnQgb2JqZWN0IHByb3ZpZGVkIGlmIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnRcbiAgIyAgICAgICAgIGxpc3RlbmVyIChkZWZhdWx0OnVuZGVmaW5lZClcbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgRGlzcGxheXMgdGhlIGVkaXRvci5cbiAgIyAgIHZpZXdlci5zaG93KClcbiAgI1xuICAjICAgIyBEaXNwbGF5cyB0aGUgdmlld2VyIG9uIGNsaWNrIChwcmV2ZW50cyBkZWZhdWx0IGFjdGlvbikuXG4gICMgICAkKCdhLnNob3ctdmlld2VyJykuYmluZCgnY2xpY2snLCB2aWV3ZXIuc2hvdylcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmLlxuICBzaG93OiAoZXZlbnQpID0+XG4gICAgVXRpbC5wcmV2ZW50RXZlbnREZWZhdWx0IGV2ZW50XG5cbiAgICBjb250cm9scyA9IEBlbGVtZW50XG4gICAgICAuZmluZCgnLmFubm90YXRvci1jb250cm9scycpXG4gICAgICAuYWRkQ2xhc3MoQGNsYXNzZXMuc2hvd0NvbnRyb2xzKVxuICAgIHNldFRpbWVvdXQoKD0+IGNvbnRyb2xzLnJlbW92ZUNsYXNzKEBjbGFzc2VzLnNob3dDb250cm9scykpLCA1MDApXG5cbiAgICBAZWxlbWVudC5yZW1vdmVDbGFzcyhAY2xhc3Nlcy5oaWRlKVxuICAgIHRoaXMuY2hlY2tPcmllbnRhdGlvbigpLnB1Ymxpc2goJ3Nob3cnKVxuXG4gICMgUHVibGljOiBDaGVja3MgdG8gc2VlIGlmIHRoZSBWaWV3ZXIgaXMgY3VycmVudGx5IGRpc3BsYXllZC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHZpZXdlci5zaG93KClcbiAgIyAgIHZpZXdlci5pc1Nob3duKCkgIyA9PiBSZXR1cm5zIHRydWVcbiAgI1xuICAjICAgdmlld2VyLmhpZGUoKVxuICAjICAgdmlld2VyLmlzU2hvd24oKSAjID0+IFJldHVybnMgZmFsc2VcbiAgI1xuICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgVmlld2VyIGlzIHZpc2libGUuXG4gIGlzU2hvd246IC0+XG4gICAgbm90IEBlbGVtZW50Lmhhc0NsYXNzKEBjbGFzc2VzLmhpZGUpXG5cbiAgIyBQdWJsaWM6IEhpZGVzIHRoZSBFZGl0b3IgYW5kIGZpcmVzIHRoZSBcImhpZGVcIiBldmVudC4gQ2FuIGJlIHVzZWQgYXMgYW4gZXZlbnRcbiAgIyBjYWxsYmFjayBhbmQgd2lsbCBjYWxsIEV2ZW50I3ByZXZlbnREZWZhdWx0KCkgb24gdGhlIHN1cHBsaWVkIGV2ZW50LlxuICAjXG4gICMgZXZlbnQgLSBFdmVudCBvYmplY3QgcHJvdmlkZWQgaWYgbWV0aG9kIGlzIGNhbGxlZCBieSBldmVudFxuICAjICAgICAgICAgbGlzdGVuZXIgKGRlZmF1bHQ6dW5kZWZpbmVkKVxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBIaWRlcyB0aGUgZWRpdG9yLlxuICAjICAgdmlld2VyLmhpZGUoKVxuICAjXG4gICMgICAjIEhpZGUgdGhlIHZpZXdlciBvbiBjbGljayAocHJldmVudHMgZGVmYXVsdCBhY3Rpb24pLlxuICAjICAgJCgnYS5oaWRlLXZpZXdlcicpLmJpbmQoJ2NsaWNrJywgdmlld2VyLmhpZGUpXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZi5cbiAgaGlkZTogKGV2ZW50KSA9PlxuICAgIFV0aWwucHJldmVudEV2ZW50RGVmYXVsdCBldmVudFxuXG4gICAgQGVsZW1lbnQuYWRkQ2xhc3MoQGNsYXNzZXMuaGlkZSlcbiAgICB0aGlzLnB1Ymxpc2goJ2hpZGUnKVxuXG4gICMgUHVibGljOiBMb2FkcyBhbm5vdGF0aW9ucyBpbnRvIHRoZSB2aWV3ZXIgYW5kIHNob3dzIGl0LiBGaXJlcyB0aGUgXCJsb2FkXCJcbiAgIyBldmVudCBvbmNlIHRoZSB2aWV3ZXIgaXMgbG9hZGVkIHBhc3NpbmcgdGhlIGFubm90YXRpb25zIGludG8gdGhlIGNhbGxiYWNrLlxuICAjXG4gICMgYW5ub3RhdGlvbiAtIEFuIEFycmF5IG9mIGFubm90YXRpb24gZWxlbWVudHMuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICB2aWV3ZXIubG9hZChbYW5ub3RhdGlvbjEsIGFubm90YXRpb24yLCBhbm5vdGF0aW9uM10pXG4gICNcbiAgIyBSZXR1cm5zIGl0c2xlZi5cbiAgbG9hZDogKGFubm90YXRpb25zKSA9PlxuICAgIEBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zIHx8IFtdXG5cbiAgICBsaXN0ID0gQGVsZW1lbnQuZmluZCgndWw6Zmlyc3QnKS5lbXB0eSgpXG4gICAgZm9yIGFubm90YXRpb24gaW4gQGFubm90YXRpb25zXG4gICAgICBpdGVtID0gJChAaXRlbSkuY2xvbmUoKS5hcHBlbmRUbyhsaXN0KS5kYXRhKCdhbm5vdGF0aW9uJywgYW5ub3RhdGlvbilcbiAgICAgIGNvbnRyb2xzID0gaXRlbS5maW5kKCcuYW5ub3RhdG9yLWNvbnRyb2xzJylcblxuICAgICAgbGluayA9IGNvbnRyb2xzLmZpbmQoJy5hbm5vdGF0b3ItbGluaycpXG4gICAgICBlZGl0ID0gY29udHJvbHMuZmluZCgnLmFubm90YXRvci1lZGl0JylcbiAgICAgIGRlbCAgPSBjb250cm9scy5maW5kKCcuYW5ub3RhdG9yLWRlbGV0ZScpXG5cbiAgICAgIGxpbmtzID0gbmV3IExpbmtQYXJzZXIoYW5ub3RhdGlvbi5saW5rcyBvciBbXSkuZ2V0KCdhbHRlcm5hdGUnLCB7J3R5cGUnOiAndGV4dC9odG1sJ30pXG4gICAgICBpZiBsaW5rcy5sZW5ndGggaXMgMCBvciBub3QgbGlua3NbMF0uaHJlZj9cbiAgICAgICAgbGluay5yZW1vdmUoKVxuICAgICAgZWxzZVxuICAgICAgICBsaW5rLmF0dHIoJ2hyZWYnLCBsaW5rc1swXS5ocmVmKVxuXG4gICAgICBpZiBAb3B0aW9ucy5yZWFkT25seVxuICAgICAgICBlZGl0LnJlbW92ZSgpXG4gICAgICAgIGRlbC5yZW1vdmUoKVxuICAgICAgZWxzZVxuICAgICAgICBjb250cm9sbGVyID0ge1xuICAgICAgICAgIHNob3dFZGl0OiAtPiBlZGl0LnJlbW92ZUF0dHIoJ2Rpc2FibGVkJylcbiAgICAgICAgICBoaWRlRWRpdDogLT4gZWRpdC5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpXG4gICAgICAgICAgc2hvd0RlbGV0ZTogLT4gZGVsLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJylcbiAgICAgICAgICBoaWRlRGVsZXRlOiAtPiBkZWwuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKVxuICAgICAgICB9XG5cbiAgICAgIGZvciBmaWVsZCBpbiBAZmllbGRzXG4gICAgICAgIGVsZW1lbnQgPSAkKGZpZWxkLmVsZW1lbnQpLmNsb25lKCkuYXBwZW5kVG8oaXRlbSlbMF1cbiAgICAgICAgZmllbGQubG9hZChlbGVtZW50LCBhbm5vdGF0aW9uLCBjb250cm9sbGVyKVxuXG4gICAgdGhpcy5wdWJsaXNoKCdsb2FkJywgW0Bhbm5vdGF0aW9uc10pXG5cbiAgICB0aGlzLnNob3coKVxuXG4gICMgUHVibGljOiBBZGRzIGFuIGFkZGlvbmFsIGZpZWxkIHRvIGFuIGFubm90YXRpb24gdmlldy4gQSBjYWxsYmFjayBjYW4gYmVcbiAgIyBwcm92aWRlZCB0byB1cGRhdGUgdGhlIHZpZXcgb24gbG9hZC5cbiAgI1xuICAjIG9wdGlvbnMgLSBBbiBvcHRpb25zIE9iamVjdC4gT3B0aW9ucyBhcmUgYXMgZm9sbG93czpcbiAgIyAgICAgICAgICAgbG9hZCAtIENhbGxiYWNrIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSB2aWV3IGlzIGxvYWRlZCB3aXRoIGFuXG4gICMgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLiBSZWNpZXZlcyBhIG5ld2x5IGNyZWF0ZWQgY2xvbmUgb2YgQGl0ZW0gYW5kXG4gICMgICAgICAgICAgICAgICAgICB0aGUgYW5ub3RhdGlvbiB0byBiZSBkaXNwbGF5ZWQgKGl0IHdpbGwgYmUgY2FsbGVkIG9uY2VcbiAgIyAgICAgICAgICAgICAgICAgIGZvciBlYWNoIGFubm90YXRpb24gYmVpbmcgbG9hZGVkKS5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgRGlzcGxheSBhIHVzZXIgbmFtZS5cbiAgIyAgIHZpZXdlci5hZGRGaWVsZCh7XG4gICMgICAgICMgVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgdmlld2VyIGlzIGxvYWRlZC5cbiAgIyAgICAgbG9hZDogKGZpZWxkLCBhbm5vdGF0aW9uKSAtPlxuICAjICAgICAgIGZpZWxkID0gJChmaWVsZClcbiAgI1xuICAjICAgICAgIGlmIGFubm90YXRpb24udXNlclxuICAjICAgICAgICAgZmllbGQudGV4dChhbm5vdGF0aW9uLnVzZXIpICMgRGlzcGxheSB0aGUgdXNlclxuICAjICAgICAgIGVsc2VcbiAgIyAgICAgICAgIGZpZWxkLnJlbW92ZSgpICAgICAgICAgICAgICAjIERvIG5vdCBkaXNwbGF5IHRoZSBmaWVsZC5cbiAgIyAgIH0pXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZi5cbiAgYWRkRmllbGQ6IChvcHRpb25zKSAtPlxuICAgIGZpZWxkID0gJC5leHRlbmQoe1xuICAgICAgbG9hZDogLT5cbiAgICB9LCBvcHRpb25zKVxuXG4gICAgZmllbGQuZWxlbWVudCA9ICQoJzxkaXYgLz4nKVswXVxuICAgIEBmaWVsZHMucHVzaCBmaWVsZFxuICAgIGZpZWxkLmVsZW1lbnRcbiAgICB0aGlzXG5cbiAgIyBDYWxsYmFjayBmdW5jdGlvbjogY2FsbGVkIHdoZW4gdGhlIGVkaXQgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICNcbiAgIyBldmVudCAtIEFuIEV2ZW50IG9iamVjdC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgb25FZGl0Q2xpY2s6IChldmVudCkgPT5cbiAgICB0aGlzLm9uQnV0dG9uQ2xpY2soZXZlbnQsICdlZGl0JylcblxuICAjIENhbGxiYWNrIGZ1bmN0aW9uOiBjYWxsZWQgd2hlbiB0aGUgZGVsZXRlIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAjXG4gICMgZXZlbnQgLSBBbiBFdmVudCBvYmplY3QuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIG9uRGVsZXRlQ2xpY2s6IChldmVudCkgPT5cbiAgICB0aGlzLm9uQnV0dG9uQ2xpY2soZXZlbnQsICdkZWxldGUnKVxuXG4gICMgRmlyZXMgYW4gZXZlbnQgb2YgdHlwZSBhbmQgcGFzc2VzIGluIHRoZSBhc3NvY2lhdGVkIGFubm90YXRpb24uXG4gICNcbiAgIyBldmVudCAtIEFuIEV2ZW50IG9iamVjdC5cbiAgIyB0eXBlICAtIFRoZSB0eXBlIG9mIGV2ZW50IHRvIGZpcmUuIEVpdGhlciBcImVkaXRcIiBvciBcImRlbGV0ZVwiLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBvbkJ1dHRvbkNsaWNrOiAoZXZlbnQsIHR5cGUpIC0+XG4gICAgaXRlbSA9ICQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCcuYW5ub3RhdG9yLWFubm90YXRpb24nKVxuXG4gICAgdGhpcy5wdWJsaXNoKHR5cGUsIFtpdGVtLmRhdGEoJ2Fubm90YXRpb24nKV0pXG5cbiMgUHJpdmF0ZTogc2ltcGxlIHBhcnNlciBmb3IgaHlwZXJtZWRpYSBsaW5rIHN0cnVjdHVyZVxuI1xuIyBFeGFtcGxlczpcbiNcbiMgICBsaW5rcyA9IFtcbiMgICAgIHsgcmVsOiAnYWx0ZXJuYXRlJywgaHJlZjogJ2h0dHA6Ly9leGFtcGxlLmNvbS9wYWdlcy8xNC5qc29uJywgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4jICAgICB7IHJlbDogJ3ByZXYnOiBocmVmOiAnaHR0cDovL2V4YW1wbGUuY29tL3BhZ2VzLzEzJyB9XG4jICAgXVxuI1xuIyAgIGxwID0gTGlua1BhcnNlcihsaW5rcylcbiMgICBscC5nZXQoJ2FsdGVybmF0ZScpICAgICAgICAgICAgICAgICAgICAgICMgPT4gWyB7IHJlbDogJ2FsdGVybmF0ZScsIGhyZWY6ICdodHRwOi8vLi4uJywgLi4uIH0gXVxuIyAgIGxwLmdldCgnYWx0ZXJuYXRlJywge3R5cGU6ICd0ZXh0L2h0bWwnfSkgIyA9PiBbXVxuI1xuY2xhc3MgTGlua1BhcnNlclxuICBjb25zdHJ1Y3RvcjogKEBkYXRhKSAtPlxuXG4gIGdldDogKHJlbCwgY29uZD17fSkgLT5cbiAgICBjb25kID0gJC5leHRlbmQoe30sIGNvbmQsIHtyZWw6IHJlbH0pXG4gICAga2V5cyA9IChrIGZvciBvd24gaywgdiBvZiBjb25kKVxuICAgIGZvciBkIGluIEBkYXRhXG4gICAgICBtYXRjaCA9IGtleXMucmVkdWNlICgobSwgaykgLT4gbSBhbmQgKGRba10gaXMgY29uZFtrXSkpLCB0cnVlXG4gICAgICBpZiBtYXRjaFxuICAgICAgICBkXG4gICAgICBlbHNlXG4gICAgICAgIGNvbnRpbnVlXG5cblxuIyBFeHBvcnQgdGhlIFZpZXdlciBvYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gVmlld2VyXG4iLCJEZWxlZ2F0b3IgPSByZXF1aXJlICcuL2NsYXNzJ1xuVXRpbCA9IHJlcXVpcmUgJy4vdXRpbCdcblxuXG4jIFB1YmxpYzogQmFzZSBjbGFzcyBmb3IgdGhlIEVkaXRvciBhbmQgVmlld2VyIGVsZW1lbnRzLiBDb250YWlucyBtZXRob2RzIHRoYXRcbiMgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSB0d28uXG5jbGFzcyBXaWRnZXQgZXh0ZW5kcyBEZWxlZ2F0b3JcbiAgIyBDbGFzc2VzIHVzZWQgdG8gYWx0ZXIgdGhlIHdpZGdldHMgc3RhdGUuXG4gIGNsYXNzZXM6XG4gICAgaGlkZTogJ2Fubm90YXRvci1oaWRlJ1xuICAgIGludmVydDpcbiAgICAgIHg6ICdhbm5vdGF0b3ItaW52ZXJ0LXgnXG4gICAgICB5OiAnYW5ub3RhdG9yLWludmVydC15J1xuXG4gICMgUHVibGljOiBDcmVhdGVzIGEgbmV3IFdpZGdldCBpbnN0YW5jZS5cbiAgI1xuICAjIGVsZW1lbnQgLSBUaGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHdpZGdldCBpbiB0aGUgRE9NLlxuICAjIG9wdGlvbnMgLSBBbiBPYmplY3QgbGl0ZXJhbCBvZiBvcHRpb25zLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICMgICB3aWRnZXQgID0gbmV3IEFubm90YXRvci5XaWRnZXQoZWxlbWVudClcbiAgI1xuICAjIFJldHVybnMgYSBuZXcgV2lkZ2V0IGluc3RhbmNlLlxuICBjb25zdHJ1Y3RvcjogKGVsZW1lbnQsIG9wdGlvbnMpIC0+XG4gICAgc3VwZXJcbiAgICBAY2xhc3NlcyA9ICQuZXh0ZW5kIHt9LCBXaWRnZXQucHJvdG90eXBlLmNsYXNzZXMsIEBjbGFzc2VzXG5cbiAgIyBQdWJsaWM6IFVuYmluZCB0aGUgd2lkZ2V0J3MgZXZlbnRzIGFuZCByZW1vdmUgaXRzIGVsZW1lbnQgZnJvbSB0aGUgRE9NLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBkZXN0cm95OiAtPlxuICAgIHRoaXMucmVtb3ZlRXZlbnRzKClcbiAgICBAZWxlbWVudC5yZW1vdmUoKVxuXG4gIGNoZWNrT3JpZW50YXRpb246IC0+XG4gICAgdGhpcy5yZXNldE9yaWVudGF0aW9uKClcblxuICAgIHdpbmRvdyAgID0gJChVdGlsLmdldEdsb2JhbCgpKVxuICAgIHdpZGdldCAgID0gQGVsZW1lbnQuY2hpbGRyZW4oXCI6Zmlyc3RcIilcbiAgICBvZmZzZXQgICA9IHdpZGdldC5vZmZzZXQoKVxuICAgIHZpZXdwb3J0ID0ge1xuICAgICAgdG9wOiAgIHdpbmRvdy5zY3JvbGxUb3AoKSxcbiAgICAgIHJpZ2h0OiB3aW5kb3cud2lkdGgoKSArIHdpbmRvdy5zY3JvbGxMZWZ0KClcbiAgICB9XG4gICAgY3VycmVudCA9IHtcbiAgICAgIHRvcDogICBvZmZzZXQudG9wXG4gICAgICByaWdodDogb2Zmc2V0LmxlZnQgKyB3aWRnZXQud2lkdGgoKVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50LnRvcCAtIHZpZXdwb3J0LnRvcCkgPCAwXG4gICAgICB0aGlzLmludmVydFkoKVxuXG4gICAgaWYgKGN1cnJlbnQucmlnaHQgLSB2aWV3cG9ydC5yaWdodCkgPiAwXG4gICAgICB0aGlzLmludmVydFgoKVxuXG4gICAgdGhpc1xuXG4gICMgUHVibGljOiBSZXNldHMgb3JpZW50YXRpb24gb2Ygd2lkZ2V0IG9uIHRoZSBYICYgWSBheGlzLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgd2lkZ2V0LnJlc2V0T3JpZW50YXRpb24oKSAjIFdpZGdldCBpcyBvcmlnaW5hbCB3YXkgdXAuXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gIHJlc2V0T3JpZW50YXRpb246IC0+XG4gICAgQGVsZW1lbnQucmVtb3ZlQ2xhc3MoQGNsYXNzZXMuaW52ZXJ0LngpLnJlbW92ZUNsYXNzKEBjbGFzc2VzLmludmVydC55KVxuICAgIHRoaXNcblxuICAjIFB1YmxpYzogSW52ZXJ0cyB0aGUgd2lkZ2V0IG9uIHRoZSBYIGF4aXMuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICB3aWRnZXQuaW52ZXJ0WCgpICMgV2lkZ2V0IGlzIG5vdyByaWdodCBhbGlnbmVkLlxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICBpbnZlcnRYOiAtPlxuICAgIEBlbGVtZW50LmFkZENsYXNzIEBjbGFzc2VzLmludmVydC54XG4gICAgdGhpc1xuXG4gICMgUHVibGljOiBJbnZlcnRzIHRoZSB3aWRnZXQgb24gdGhlIFkgYXhpcy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHdpZGdldC5pbnZlcnRZKCkgIyBXaWRnZXQgaXMgbm93IHVwc2lkZSBkb3duLlxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICBpbnZlcnRZOiAtPlxuICAgIEBlbGVtZW50LmFkZENsYXNzIEBjbGFzc2VzLmludmVydC55XG4gICAgdGhpc1xuXG4gICMgUHVibGljOiBGaW5kIG91dCB3aGV0aGVyIG9yIG5vdCB0aGUgd2lkZ2V0IGlzIGN1cnJlbnRseSB1cHNpZGUgZG93blxuICAjXG4gICMgUmV0dXJucyBhIGJvb2xlYW46IHRydWUgaWYgdGhlIHdpZGdldCBpcyB1cHNpZGUgZG93blxuICBpc0ludmVydGVkWTogLT5cbiAgICBAZWxlbWVudC5oYXNDbGFzcyBAY2xhc3Nlcy5pbnZlcnQueVxuXG4gICMgUHVibGljOiBGaW5kIG91dCB3aGV0aGVyIG9yIG5vdCB0aGUgd2lkZ2V0IGlzIGN1cnJlbnRseSByaWdodCBhbGlnbmVkXG4gICNcbiAgIyBSZXR1cm5zIGEgYm9vbGVhbjogdHJ1ZSBpZiB0aGUgd2lkZ2V0IGlzIHJpZ2h0IGFsaWduZWRcbiAgaXNJbnZlcnRlZFg6IC0+XG4gICAgQGVsZW1lbnQuaGFzQ2xhc3MgQGNsYXNzZXMuaW52ZXJ0LnhcblxuXG4jIEV4cG9ydCB0aGUgV2lkZ2V0IG9iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBXaWRnZXRcbiIsIiMgQSBzaW1wbGUgWFBhdGggZXZhbHVhdG9yIHVzaW5nIGpRdWVyeSB3aGljaCBjYW4gZXZhbHVhdGUgcXVlcmllcyBvZlxuc2ltcGxlWFBhdGhKUXVlcnkgPSAocmVsYXRpdmVSb290KSAtPlxuICBqcSA9IHRoaXMubWFwIC0+XG4gICAgcGF0aCA9ICcnXG4gICAgZWxlbSA9IHRoaXNcblxuICAgIHdoaWxlIGVsZW0/Lm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFIGFuZCBlbGVtIGlzbnQgcmVsYXRpdmVSb290XG4gICAgICB0YWdOYW1lID0gZWxlbS50YWdOYW1lLnJlcGxhY2UoXCI6XCIsIFwiXFxcXDpcIilcbiAgICAgIGlkeCA9ICQoZWxlbS5wYXJlbnROb2RlKS5jaGlsZHJlbih0YWdOYW1lKS5pbmRleChlbGVtKSArIDFcblxuICAgICAgaWR4ICA9IFwiWyN7aWR4fV1cIlxuICAgICAgcGF0aCA9IFwiL1wiICsgZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgKyBpZHggKyBwYXRoXG4gICAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlXG5cbiAgICBwYXRoXG5cbiAganEuZ2V0KClcblxuIyBBIHNpbXBsZSBYUGF0aCBldmFsdWF0b3IgdXNpbmcgb25seSBzdGFuZGFyZCBET00gbWV0aG9kcyB3aGljaCBjYW5cbiMgZXZhbHVhdGUgcXVlcmllcyBvZiB0aGUgZm9ybSAvdGFnW2luZGV4XS90YWdbaW5kZXhdLlxuc2ltcGxlWFBhdGhQdXJlID0gKHJlbGF0aXZlUm9vdCkgLT5cblxuICBnZXRQYXRoU2VnbWVudCA9IChub2RlKSAtPlxuICAgIG5hbWUgPSBnZXROb2RlTmFtZSBub2RlXG4gICAgcG9zID0gZ2V0Tm9kZVBvc2l0aW9uIG5vZGVcbiAgICBcIiN7bmFtZX1bI3twb3N9XVwiXG5cbiAgcm9vdE5vZGUgPSByZWxhdGl2ZVJvb3RcblxuICBnZXRQYXRoVG8gPSAobm9kZSkgLT5cbiAgICB4cGF0aCA9ICcnO1xuICAgIHdoaWxlIG5vZGUgIT0gcm9vdE5vZGVcbiAgICAgIHVubGVzcyBub2RlP1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IgXCJDYWxsZWQgZ2V0UGF0aFRvIG9uIGEgbm9kZSB3aGljaCB3YXMgbm90IGEgZGVzY2VuZGFudCBvZiBAcm9vdE5vZGUuIFwiICsgcm9vdE5vZGVcbiAgICAgIHhwYXRoID0gKGdldFBhdGhTZWdtZW50IG5vZGUpICsgJy8nICsgeHBhdGhcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGVcbiAgICB4cGF0aCA9ICcvJyArIHhwYXRoXG4gICAgeHBhdGggPSB4cGF0aC5yZXBsYWNlIC9cXC8kLywgJydcbiAgICB4cGF0aFxuXG4gIGpxID0gdGhpcy5tYXAgLT5cbiAgICBwYXRoID0gZ2V0UGF0aFRvIHRoaXNcblxuICAgIHBhdGhcblxuICBqcS5nZXQoKVxuXG5maW5kQ2hpbGQgPSAobm9kZSwgdHlwZSwgaW5kZXgpIC0+XG4gIHVubGVzcyBub2RlLmhhc0NoaWxkTm9kZXMoKVxuICAgIHRocm93IG5ldyBFcnJvciBcIlhQYXRoIGVycm9yOiBub2RlIGhhcyBubyBjaGlsZHJlbiFcIlxuICBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2Rlc1xuICBmb3VuZCA9IDBcbiAgZm9yIGNoaWxkIGluIGNoaWxkcmVuXG4gICAgbmFtZSA9IGdldE5vZGVOYW1lIGNoaWxkXG4gICAgaWYgbmFtZSBpcyB0eXBlXG4gICAgICBmb3VuZCArPSAxXG4gICAgICBpZiBmb3VuZCBpcyBpbmRleFxuICAgICAgICByZXR1cm4gY2hpbGRcbiAgdGhyb3cgbmV3IEVycm9yIFwiWFBhdGggZXJyb3I6IHdhbnRlZCBjaGlsZCBub3QgZm91bmQuXCJcblxuIyBHZXQgdGhlIG5vZGUgbmFtZSBmb3IgdXNlIGluIGdlbmVyYXRpbmcgYW4geHBhdGggZXhwcmVzc2lvbi5cbmdldE5vZGVOYW1lID0gKG5vZGUpIC0+XG4gICAgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKClcbiAgICBzd2l0Y2ggbm9kZU5hbWVcbiAgICAgIHdoZW4gXCIjdGV4dFwiIHRoZW4gcmV0dXJuIFwidGV4dCgpXCJcbiAgICAgIHdoZW4gXCIjY29tbWVudFwiIHRoZW4gcmV0dXJuIFwiY29tbWVudCgpXCJcbiAgICAgIHdoZW4gXCIjY2RhdGEtc2VjdGlvblwiIHRoZW4gcmV0dXJuIFwiY2RhdGEtc2VjdGlvbigpXCJcbiAgICAgIGVsc2UgcmV0dXJuIG5vZGVOYW1lXG5cbiMgR2V0IHRoZSBpbmRleCBvZiB0aGUgbm9kZSBhcyBpdCBhcHBlYXJzIGluIGl0cyBwYXJlbnQncyBjaGlsZCBsaXN0XG5nZXROb2RlUG9zaXRpb24gPSAobm9kZSkgLT5cbiAgcG9zID0gMFxuICB0bXAgPSBub2RlXG4gIHdoaWxlIHRtcFxuICAgIGlmIHRtcC5ub2RlTmFtZSBpcyBub2RlLm5vZGVOYW1lXG4gICAgICBwb3MrK1xuICAgIHRtcCA9IHRtcC5wcmV2aW91c1NpYmxpbmdcbiAgcG9zXG5cblxubW9kdWxlLmV4cG9ydHMgPVxuICBzaW1wbGVYUGF0aEpRdWVyeTogc2ltcGxlWFBhdGhKUXVlcnlcbiAgc2ltcGxlWFBhdGhQdXJlOiBzaW1wbGVYUGF0aFB1cmVcbiAgZmluZENoaWxkOiBmaW5kQ2hpbGRcbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGtnL2Fubm90YXRvci1kaWdpbGliLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2JhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lL2JhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2JhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2JhY2tib25lLWV4dGVuZC1zdGFuZGFsb25lL2JhY2tib25lLWV4dGVuZC1zdGFuZGFsb25lLmpzIiwiYW5ub3RhdGlvbnMuY29mZmVlIiwiYW5ub3RhdG9yLmNvZmZlZSIsImNsYXNzLmNvZmZlZSIsImVkaXRvci5jb2ZmZWUiLCJub3RpZmljYXRpb24uY29mZmVlIiwicGx1Z2luL2F1dGhsb2dpbi5jb2ZmZWUiLCJwbHVnaW4vZmlsdGVyLmNvZmZlZSIsInBsdWdpbi9tYXJrZG93bi5jb2ZmZWUiLCJwbHVnaW4vcGVybWlzc2lvbnMuY29mZmVlIiwicGx1Z2luL3N0b3JlLmNvZmZlZSIsInBsdWdpbi90YWdzLmNvZmZlZSIsInBsdWdpbi91bnN1cHBvcnRlZC5jb2ZmZWUiLCJyYW5nZS5jb2ZmZWUiLCJyZWdpc3RyeS5jb2ZmZWUiLCJzdG9yYWdlLmNvZmZlZSIsInV0aWwuY29mZmVlIiwidmlld2VyLmNvZmZlZSIsIndpZGdldC5jb2ZmZWUiLCJ4cGF0aC5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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XSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpfXZhciBmPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChmLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGYsZi5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvKipcbiAqIFN0YW5kYWxvbmUgZXh0cmFjdGlvbiBvZiBCYWNrYm9uZS5FdmVudHMsIG5vIGV4dGVybmFsIGRlcGVuZGVuY3kgcmVxdWlyZWQuXG4gKiBEZWdyYWRlcyBuaWNlbHkgd2hlbiBCYWNrb25lL3VuZGVyc2NvcmUgYXJlIGFscmVhZHkgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50XG4gKiBnbG9iYWwgY29udGV4dC5cbiAqXG4gKiBOb3RlIHRoYXQgZG9jcyBzdWdnZXN0IHRvIHVzZSB1bmRlcnNjb3JlJ3MgYF8uZXh0ZW5kKClgIG1ldGhvZCB0byBhZGQgRXZlbnRzXG4gKiBzdXBwb3J0IHRvIHNvbWUgZ2l2ZW4gb2JqZWN0LiBBIGBtaXhpbigpYCBtZXRob2QgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIEV2ZW50c1xuICogcHJvdG90eXBlIHRvIGF2b2lkIHVzaW5nIHVuZGVyc2NvcmUgZm9yIHRoYXQgc29sZSBwdXJwb3NlOlxuICpcbiAqICAgICB2YXIgbXlFdmVudEVtaXR0ZXIgPSBCYWNrYm9uZUV2ZW50cy5taXhpbih7fSk7XG4gKlxuICogT3IgZm9yIGEgZnVuY3Rpb24gY29uc3RydWN0b3I6XG4gKlxuICogICAgIGZ1bmN0aW9uIE15Q29uc3RydWN0b3IoKXt9XG4gKiAgICAgTXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZm9vID0gZnVuY3Rpb24oKXt9XG4gKiAgICAgQmFja2JvbmVFdmVudHMubWl4aW4oTXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICpcbiAqIChjKSAyMDA5LTIwMTMgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIEluYy5cbiAqIChjKSAyMDEzIE5pY29sYXMgUGVycmlhdWx0XG4gKi9cbi8qIGdsb2JhbCBleHBvcnRzOnRydWUsIGRlZmluZSwgbW9kdWxlICovXG4oZnVuY3Rpb24oKSB7XG4gIHZhciByb290ID0gdGhpcyxcbiAgICAgIGJyZWFrZXIgPSB7fSxcbiAgICAgIG5hdGl2ZUZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCxcbiAgICAgIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLFxuICAgICAgaWRDb3VudGVyID0gMDtcblxuICAvLyBSZXR1cm5zIGEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBtYXRjaGluZyB0aGUgbWluaW1hbCBBUEkgc3Vic2V0IHJlcXVpcmVkXG4gIC8vIGJ5IEJhY2tib25lLkV2ZW50c1xuICBmdW5jdGlvbiBtaW5pc2NvcmUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IE9iamVjdC5rZXlzLFxuXG4gICAgICB1bmlxdWVJZDogZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgICAgIHZhciBpZCA9ICsraWRDb3VudGVyICsgJyc7XG4gICAgICAgIHJldHVybiBwcmVmaXggPyBwcmVmaXggKyBpZCA6IGlkO1xuICAgICAgfSxcblxuICAgICAgaGFzOiBmdW5jdGlvbihvYmosIGtleSkge1xuICAgICAgICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG4gICAgICB9LFxuXG4gICAgICBlYWNoOiBmdW5jdGlvbihvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBpZiAobmF0aXZlRm9yRWFjaCAmJiBvYmouZm9yRWFjaCA9PT0gbmF0aXZlRm9yRWFjaCkge1xuICAgICAgICAgIG9iai5mb3JFYWNoKGl0ZXJhdG9yLCBjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChvYmoubGVuZ3RoID09PSArb2JqLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopID09PSBicmVha2VyKSByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhvYmosIGtleSkpIHtcbiAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2tleV0sIGtleSwgb2JqKSA9PT0gYnJlYWtlcikgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgb25jZTogZnVuY3Rpb24oZnVuYykge1xuICAgICAgICB2YXIgcmFuID0gZmFsc2UsIG1lbW87XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAocmFuKSByZXR1cm4gbWVtbztcbiAgICAgICAgICByYW4gPSB0cnVlO1xuICAgICAgICAgIG1lbW8gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgZnVuYyA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHZhciBfID0gbWluaXNjb3JlKCksIEV2ZW50cztcblxuICAvLyBCYWNrYm9uZS5FdmVudHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gQSBtb2R1bGUgdGhhdCBjYW4gYmUgbWl4ZWQgaW4gdG8gKmFueSBvYmplY3QqIGluIG9yZGVyIHRvIHByb3ZpZGUgaXQgd2l0aFxuICAvLyBjdXN0b20gZXZlbnRzLiBZb3UgbWF5IGJpbmQgd2l0aCBgb25gIG9yIHJlbW92ZSB3aXRoIGBvZmZgIGNhbGxiYWNrXG4gIC8vIGZ1bmN0aW9ucyB0byBhbiBldmVudDsgYHRyaWdnZXJgLWluZyBhbiBldmVudCBmaXJlcyBhbGwgY2FsbGJhY2tzIGluXG4gIC8vIHN1Y2Nlc3Npb24uXG4gIC8vXG4gIC8vICAgICB2YXIgb2JqZWN0ID0ge307XG4gIC8vICAgICBfLmV4dGVuZChvYmplY3QsIEJhY2tib25lLkV2ZW50cyk7XG4gIC8vICAgICBvYmplY3Qub24oJ2V4cGFuZCcsIGZ1bmN0aW9uKCl7IGFsZXJ0KCdleHBhbmRlZCcpOyB9KTtcbiAgLy8gICAgIG9iamVjdC50cmlnZ2VyKCdleHBhbmQnKTtcbiAgLy9cbiAgRXZlbnRzID0ge1xuXG4gICAgLy8gQmluZCBhbiBldmVudCB0byBhIGBjYWxsYmFja2AgZnVuY3Rpb24uIFBhc3NpbmcgYFwiYWxsXCJgIHdpbGwgYmluZFxuICAgIC8vIHRoZSBjYWxsYmFjayB0byBhbGwgZXZlbnRzIGZpcmVkLlxuICAgIG9uOiBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgaWYgKCFldmVudHNBcGkodGhpcywgJ29uJywgbmFtZSwgW2NhbGxiYWNrLCBjb250ZXh0XSkgfHwgIWNhbGxiYWNrKSByZXR1cm4gdGhpcztcbiAgICAgIHRoaXMuX2V2ZW50cyB8fCAodGhpcy5fZXZlbnRzID0ge30pO1xuICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50c1tuYW1lXSB8fCAodGhpcy5fZXZlbnRzW25hbWVdID0gW10pO1xuICAgICAgZXZlbnRzLnB1c2goe2NhbGxiYWNrOiBjYWxsYmFjaywgY29udGV4dDogY29udGV4dCwgY3R4OiBjb250ZXh0IHx8IHRoaXN9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBCaW5kIGFuIGV2ZW50IHRvIG9ubHkgYmUgdHJpZ2dlcmVkIGEgc2luZ2xlIHRpbWUuIEFmdGVyIHRoZSBmaXJzdCB0aW1lXG4gICAgLy8gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQsIGl0IHdpbGwgYmUgcmVtb3ZlZC5cbiAgICBvbmNlOiBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgaWYgKCFldmVudHNBcGkodGhpcywgJ29uY2UnLCBuYW1lLCBbY2FsbGJhY2ssIGNvbnRleHRdKSB8fCAhY2FsbGJhY2spIHJldHVybiB0aGlzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIG9uY2UgPSBfLm9uY2UoZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYub2ZmKG5hbWUsIG9uY2UpO1xuICAgICAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSk7XG4gICAgICBvbmNlLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgcmV0dXJuIHRoaXMub24obmFtZSwgb25jZSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBvbmUgb3IgbWFueSBjYWxsYmFja3MuIElmIGBjb250ZXh0YCBpcyBudWxsLCByZW1vdmVzIGFsbFxuICAgIC8vIGNhbGxiYWNrcyB3aXRoIHRoYXQgZnVuY3Rpb24uIElmIGBjYWxsYmFja2AgaXMgbnVsbCwgcmVtb3ZlcyBhbGxcbiAgICAvLyBjYWxsYmFja3MgZm9yIHRoZSBldmVudC4gSWYgYG5hbWVgIGlzIG51bGwsIHJlbW92ZXMgYWxsIGJvdW5kXG4gICAgLy8gY2FsbGJhY2tzIGZvciBhbGwgZXZlbnRzLlxuICAgIG9mZjogZnVuY3Rpb24obmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgIHZhciByZXRhaW4sIGV2LCBldmVudHMsIG5hbWVzLCBpLCBsLCBqLCBrO1xuICAgICAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIWV2ZW50c0FwaSh0aGlzLCAnb2ZmJywgbmFtZSwgW2NhbGxiYWNrLCBjb250ZXh0XSkpIHJldHVybiB0aGlzO1xuICAgICAgaWYgKCFuYW1lICYmICFjYWxsYmFjayAmJiAhY29udGV4dCkge1xuICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIG5hbWVzID0gbmFtZSA/IFtuYW1lXSA6IF8ua2V5cyh0aGlzLl9ldmVudHMpO1xuICAgICAgZm9yIChpID0gMCwgbCA9IG5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgIGlmIChldmVudHMgPSB0aGlzLl9ldmVudHNbbmFtZV0pIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0gPSByZXRhaW4gPSBbXTtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sgfHwgY29udGV4dCkge1xuICAgICAgICAgICAgZm9yIChqID0gMCwgayA9IGV2ZW50cy5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgICAgZXYgPSBldmVudHNbal07XG4gICAgICAgICAgICAgIGlmICgoY2FsbGJhY2sgJiYgY2FsbGJhY2sgIT09IGV2LmNhbGxiYWNrICYmIGNhbGxiYWNrICE9PSBldi5jYWxsYmFjay5fY2FsbGJhY2spIHx8XG4gICAgICAgICAgICAgICAgICAoY29udGV4dCAmJiBjb250ZXh0ICE9PSBldi5jb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHJldGFpbi5wdXNoKGV2KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXJldGFpbi5sZW5ndGgpIGRlbGV0ZSB0aGlzLl9ldmVudHNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIFRyaWdnZXIgb25lIG9yIG1hbnkgZXZlbnRzLCBmaXJpbmcgYWxsIGJvdW5kIGNhbGxiYWNrcy4gQ2FsbGJhY2tzIGFyZVxuICAgIC8vIHBhc3NlZCB0aGUgc2FtZSBhcmd1bWVudHMgYXMgYHRyaWdnZXJgIGlzLCBhcGFydCBmcm9tIHRoZSBldmVudCBuYW1lXG4gICAgLy8gKHVubGVzcyB5b3UncmUgbGlzdGVuaW5nIG9uIGBcImFsbFwiYCwgd2hpY2ggd2lsbCBjYXVzZSB5b3VyIGNhbGxiYWNrIHRvXG4gICAgLy8gcmVjZWl2ZSB0aGUgdHJ1ZSBuYW1lIG9mIHRoZSBldmVudCBhcyB0aGUgZmlyc3QgYXJndW1lbnQpLlxuICAgIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIGlmICghdGhpcy5fZXZlbnRzKSByZXR1cm4gdGhpcztcbiAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgaWYgKCFldmVudHNBcGkodGhpcywgJ3RyaWdnZXInLCBuYW1lLCBhcmdzKSkgcmV0dXJuIHRoaXM7XG4gICAgICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzW25hbWVdO1xuICAgICAgdmFyIGFsbEV2ZW50cyA9IHRoaXMuX2V2ZW50cy5hbGw7XG4gICAgICBpZiAoZXZlbnRzKSB0cmlnZ2VyRXZlbnRzKGV2ZW50cywgYXJncyk7XG4gICAgICBpZiAoYWxsRXZlbnRzKSB0cmlnZ2VyRXZlbnRzKGFsbEV2ZW50cywgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBUZWxsIHRoaXMgb2JqZWN0IHRvIHN0b3AgbGlzdGVuaW5nIHRvIGVpdGhlciBzcGVjaWZpYyBldmVudHMgLi4uIG9yXG4gICAgLy8gdG8gZXZlcnkgb2JqZWN0IGl0J3MgY3VycmVudGx5IGxpc3RlbmluZyB0by5cbiAgICBzdG9wTGlzdGVuaW5nOiBmdW5jdGlvbihvYmosIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuICAgICAgaWYgKCFsaXN0ZW5lcnMpIHJldHVybiB0aGlzO1xuICAgICAgdmFyIGRlbGV0ZUxpc3RlbmVyID0gIW5hbWUgJiYgIWNhbGxiYWNrO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JykgY2FsbGJhY2sgPSB0aGlzO1xuICAgICAgaWYgKG9iaikgKGxpc3RlbmVycyA9IHt9KVtvYmouX2xpc3RlbmVySWRdID0gb2JqO1xuICAgICAgZm9yICh2YXIgaWQgaW4gbGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyc1tpZF0ub2ZmKG5hbWUsIGNhbGxiYWNrLCB0aGlzKTtcbiAgICAgICAgaWYgKGRlbGV0ZUxpc3RlbmVyKSBkZWxldGUgdGhpcy5fbGlzdGVuZXJzW2lkXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICB9O1xuXG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHNwbGl0IGV2ZW50IHN0cmluZ3MuXG4gIHZhciBldmVudFNwbGl0dGVyID0gL1xccysvO1xuXG4gIC8vIEltcGxlbWVudCBmYW5jeSBmZWF0dXJlcyBvZiB0aGUgRXZlbnRzIEFQSSBzdWNoIGFzIG11bHRpcGxlIGV2ZW50XG4gIC8vIG5hbWVzIGBcImNoYW5nZSBibHVyXCJgIGFuZCBqUXVlcnktc3R5bGUgZXZlbnQgbWFwcyBge2NoYW5nZTogYWN0aW9ufWBcbiAgLy8gaW4gdGVybXMgb2YgdGhlIGV4aXN0aW5nIEFQSS5cbiAgdmFyIGV2ZW50c0FwaSA9IGZ1bmN0aW9uKG9iaiwgYWN0aW9uLCBuYW1lLCByZXN0KSB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIEhhbmRsZSBldmVudCBtYXBzLlxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG4gICAgICAgIG9ialthY3Rpb25dLmFwcGx5KG9iaiwgW2tleSwgbmFtZVtrZXldXS5jb25jYXQocmVzdCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGFjZSBzZXBhcmF0ZWQgZXZlbnQgbmFtZXMuXG4gICAgaWYgKGV2ZW50U3BsaXR0ZXIudGVzdChuYW1lKSkge1xuICAgICAgdmFyIG5hbWVzID0gbmFtZS5zcGxpdChldmVudFNwbGl0dGVyKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIG9ialthY3Rpb25dLmFwcGx5KG9iaiwgW25hbWVzW2ldXS5jb25jYXQocmVzdCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIEEgZGlmZmljdWx0LXRvLWJlbGlldmUsIGJ1dCBvcHRpbWl6ZWQgaW50ZXJuYWwgZGlzcGF0Y2ggZnVuY3Rpb24gZm9yXG4gIC8vIHRyaWdnZXJpbmcgZXZlbnRzLiBUcmllcyB0byBrZWVwIHRoZSB1c3VhbCBjYXNlcyBzcGVlZHkgKG1vc3QgaW50ZXJuYWxcbiAgLy8gQmFja2JvbmUgZXZlbnRzIGhhdmUgMyBhcmd1bWVudHMpLlxuICB2YXIgdHJpZ2dlckV2ZW50cyA9IGZ1bmN0aW9uKGV2ZW50cywgYXJncykge1xuICAgIHZhciBldiwgaSA9IC0xLCBsID0gZXZlbnRzLmxlbmd0aCwgYTEgPSBhcmdzWzBdLCBhMiA9IGFyZ3NbMV0sIGEzID0gYXJnc1syXTtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHdoaWxlICgrK2kgPCBsKSAoZXYgPSBldmVudHNbaV0pLmNhbGxiYWNrLmNhbGwoZXYuY3R4KTsgcmV0dXJuO1xuICAgICAgY2FzZSAxOiB3aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5jYWxsKGV2LmN0eCwgYTEpOyByZXR1cm47XG4gICAgICBjYXNlIDI6IHdoaWxlICgrK2kgPCBsKSAoZXYgPSBldmVudHNbaV0pLmNhbGxiYWNrLmNhbGwoZXYuY3R4LCBhMSwgYTIpOyByZXR1cm47XG4gICAgICBjYXNlIDM6IHdoaWxlICgrK2kgPCBsKSAoZXYgPSBldmVudHNbaV0pLmNhbGxiYWNrLmNhbGwoZXYuY3R4LCBhMSwgYTIsIGEzKTsgcmV0dXJuO1xuICAgICAgZGVmYXVsdDogd2hpbGUgKCsraSA8IGwpIChldiA9IGV2ZW50c1tpXSkuY2FsbGJhY2suYXBwbHkoZXYuY3R4LCBhcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGxpc3Rlbk1ldGhvZHMgPSB7bGlzdGVuVG86ICdvbicsIGxpc3RlblRvT25jZTogJ29uY2UnfTtcblxuICAvLyBJbnZlcnNpb24tb2YtY29udHJvbCB2ZXJzaW9ucyBvZiBgb25gIGFuZCBgb25jZWAuIFRlbGwgKnRoaXMqIG9iamVjdCB0b1xuICAvLyBsaXN0ZW4gdG8gYW4gZXZlbnQgaW4gYW5vdGhlciBvYmplY3QgLi4uIGtlZXBpbmcgdHJhY2sgb2Ygd2hhdCBpdCdzXG4gIC8vIGxpc3RlbmluZyB0by5cbiAgXy5lYWNoKGxpc3Rlbk1ldGhvZHMsIGZ1bmN0aW9uKGltcGxlbWVudGF0aW9uLCBtZXRob2QpIHtcbiAgICBFdmVudHNbbWV0aG9kXSA9IGZ1bmN0aW9uKG9iaiwgbmFtZSwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMgfHwgKHRoaXMuX2xpc3RlbmVycyA9IHt9KTtcbiAgICAgIHZhciBpZCA9IG9iai5fbGlzdGVuZXJJZCB8fCAob2JqLl9saXN0ZW5lcklkID0gXy51bmlxdWVJZCgnbCcpKTtcbiAgICAgIGxpc3RlbmVyc1tpZF0gPSBvYmo7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSBjYWxsYmFjayA9IHRoaXM7XG4gICAgICBvYmpbaW1wbGVtZW50YXRpb25dKG5hbWUsIGNhbGxiYWNrLCB0aGlzKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH0pO1xuXG4gIC8vIEFsaWFzZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICBFdmVudHMuYmluZCAgID0gRXZlbnRzLm9uO1xuICBFdmVudHMudW5iaW5kID0gRXZlbnRzLm9mZjtcblxuICAvLyBNaXhpbiB1dGlsaXR5XG4gIEV2ZW50cy5taXhpbiA9IGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgdmFyIGV4cG9ydHMgPSBbJ29uJywgJ29uY2UnLCAnb2ZmJywgJ3RyaWdnZXInLCAnc3RvcExpc3RlbmluZycsICdsaXN0ZW5UbycsXG4gICAgICAgICAgICAgICAgICAgJ2xpc3RlblRvT25jZScsICdiaW5kJywgJ3VuYmluZCddO1xuICAgIF8uZWFjaChleHBvcnRzLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICBwcm90b1tuYW1lXSA9IHRoaXNbbmFtZV07XG4gICAgfSwgdGhpcyk7XG4gICAgcmV0dXJuIHByb3RvO1xuICB9O1xuXG4gIC8vIEV4cG9ydCBFdmVudHMgYXMgQmFja2JvbmVFdmVudHMgZGVwZW5kaW5nIG9uIGN1cnJlbnQgY29udGV4dFxuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIEV2ZW50cztcbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50cztcbiAgICB9XG4gICAgZXhwb3J0cy5CYWNrYm9uZUV2ZW50cyA9IEV2ZW50cztcbiAgfSBlbHNlIHtcbiAgICByb290LkJhY2tib25lRXZlbnRzID0gRXZlbnRzO1xuICB9XG59KSh0aGlzKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9iYWNrYm9uZS1ldmVudHMtc3RhbmRhbG9uZScpO1xuIiwiKGZ1bmN0aW9uIChkZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgfVxuICBlbHNlIHtcbiAgICB3aW5kb3cuQmFja2JvbmVFeHRlbmQgPSBkZWZpbml0aW9uKCk7XG4gIH1cbn0pKGZ1bmN0aW9uICgpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG4gIFxuICAvLyBtaW5pLXVuZGVyc2NvcmVcbiAgdmFyIF8gPSB7XG4gICAgaGFzOiBmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xuICAgIH0sXG4gIFxuICAgIGV4dGVuZDogZnVuY3Rpb24ob2JqKSB7XG4gICAgICBmb3IgKHZhciBpPTE7IGk8YXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgb2JqW3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH07XG5cbiAgLy8vIEZvbGxvd2luZyBjb2RlIGlzIHBhc3RlZCBmcm9tIEJhY2tib25lLmpzIC8vL1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb3JyZWN0bHkgc2V0IHVwIHRoZSBwcm90b3R5cGUgY2hhaW4sIGZvciBzdWJjbGFzc2VzLlxuICAvLyBTaW1pbGFyIHRvIGBnb29nLmluaGVyaXRzYCwgYnV0IHVzZXMgYSBoYXNoIG9mIHByb3RvdHlwZSBwcm9wZXJ0aWVzIGFuZFxuICAvLyBjbGFzcyBwcm9wZXJ0aWVzIHRvIGJlIGV4dGVuZGVkLlxuICB2YXIgZXh0ZW5kID0gZnVuY3Rpb24ocHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcztcbiAgICB2YXIgY2hpbGQ7XG5cbiAgICAvLyBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoZSBuZXcgc3ViY2xhc3MgaXMgZWl0aGVyIGRlZmluZWQgYnkgeW91XG4gICAgLy8gKHRoZSBcImNvbnN0cnVjdG9yXCIgcHJvcGVydHkgaW4geW91ciBgZXh0ZW5kYCBkZWZpbml0aW9uKSwgb3IgZGVmYXVsdGVkXG4gICAgLy8gYnkgdXMgdG8gc2ltcGx5IGNhbGwgdGhlIHBhcmVudCdzIGNvbnN0cnVjdG9yLlxuICAgIGlmIChwcm90b1Byb3BzICYmIF8uaGFzKHByb3RvUHJvcHMsICdjb25zdHJ1Y3RvcicpKSB7XG4gICAgICBjaGlsZCA9IHByb3RvUHJvcHMuY29uc3RydWN0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkID0gZnVuY3Rpb24oKXsgcmV0dXJuIHBhcmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIH1cblxuICAgIC8vIEFkZCBzdGF0aWMgcHJvcGVydGllcyB0byB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24sIGlmIHN1cHBsaWVkLlxuICAgIF8uZXh0ZW5kKGNoaWxkLCBwYXJlbnQsIHN0YXRpY1Byb3BzKTtcblxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGNoYWluIHRvIGluaGVyaXQgZnJvbSBgcGFyZW50YCwgd2l0aG91dCBjYWxsaW5nXG4gICAgLy8gYHBhcmVudGAncyBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAgICB2YXIgU3Vycm9nYXRlID0gZnVuY3Rpb24oKXsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9O1xuICAgIFN1cnJvZ2F0ZS5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICAgIGNoaWxkLnByb3RvdHlwZSA9IG5ldyBTdXJyb2dhdGUoKTtcblxuICAgIC8vIEFkZCBwcm90b3R5cGUgcHJvcGVydGllcyAoaW5zdGFuY2UgcHJvcGVydGllcykgdG8gdGhlIHN1YmNsYXNzLFxuICAgIC8vIGlmIHN1cHBsaWVkLlxuICAgIGlmIChwcm90b1Byb3BzKSBfLmV4dGVuZChjaGlsZC5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuXG4gICAgLy8gU2V0IGEgY29udmVuaWVuY2UgcHJvcGVydHkgaW4gY2FzZSB0aGUgcGFyZW50J3MgcHJvdG90eXBlIGlzIG5lZWRlZFxuICAgIC8vIGxhdGVyLlxuICAgIGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7XG5cbiAgICByZXR1cm4gY2hpbGQ7XG4gIH07XG5cbiAgLy8gRXhwb3NlIHRoZSBleHRlbmQgZnVuY3Rpb25cbiAgcmV0dXJuIGV4dGVuZDtcbn0pO1xuIiwiU3RvcmFnZVByb3ZpZGVyID0gcmVxdWlyZSgnLi9zdG9yYWdlJylcblxuXG4jIFB1YmxpYzogUHJvdmlkZXMgQ1JVRCBtZXRob2RzIGZvciBhbm5vdGF0aW9ucyB3aGljaCBjYWxsIGNvcnJlc3BvbmRpbmcgcmVnaXN0cnkgaG9va3MuXG5jbGFzcyBBbm5vdGF0aW9uUHJvdmlkZXJcblxuICBAY29uZmlndXJlOiAocmVnaXN0cnkpIC0+XG4gICAgcmVnaXN0cnlbJ2Fubm90YXRpb25zJ10gPz0gbmV3IHRoaXMocmVnaXN0cnkpXG4gICAgcmVnaXN0cnkuaW5jbHVkZShTdG9yYWdlUHJvdmlkZXIpXG5cbiAgY29uc3RydWN0b3I6IChAcmVnaXN0cnkpIC0+XG5cbiAgIyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGFubm90YXRpb24gb2JqZWN0LlxuICAjXG4gICMgUnVucyB0aGUgJ2JlZm9yZUNyZWF0ZUFubm90YXRpb24nIGhvb2sgdG8gYWxsb3cgdGhlIG5ldyBhbm5vdGF0aW9uIHRvXG4gICMgYmUgaW5pdGlhbGl6ZWQgb3IgcHJldmVudGVkLlxuICAjXG4gICMgUnVucyB0aGUgJ2NyZWF0ZUFubm90YXRpb24nIGhvb2sgd2hlbiB0aGUgbmV3IGFubm90YXRpb24gaXMgaW5pdGlhbGl6ZWQuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAuY3JlYXRlKHt9KVxuICAjXG4gICMgICByZWdpc3RyeS5vbiAnYmVmb3JlQW5ub3RhdGlvbkNyZWF0ZWQnLCAoYW5ub3RhdGlvbikgLT5cbiAgIyAgICAgYW5ub3RhdGlvbi5teVByb3BlcnR5ID0gJ1RoaXMgaXMgYSBjdXN0b20gcHJvcGVydHknXG4gICMgICByZWdpc3RyeS5jcmVhdGUoe30pICMgUmVzb2x2ZXMgdG8ge215UHJvcGVydHk6IFwiVGhpcyBpcyBh4oCmXCJ9XG4gICNcbiAgIyBSZXR1cm5zIGEgUHJvbWlzZSBvZiBhbiBhbm5vdGF0aW9uIE9iamVjdC5cbiAgY3JlYXRlOiAob2JqPXt9KSAtPlxuICAgIHRoaXMuX2N5Y2xlKG9iaiwgJ2NyZWF0ZScpXG5cbiAgIyBVcGRhdGVzIGFuIGFubm90YXRpb24uXG4gICNcbiAgIyBQdWJsaXNoZXMgdGhlICdiZWZvcmVBbm5vdGF0aW9uVXBkYXRlZCcgYW5kICdhbm5vdGF0aW9uVXBkYXRlZCcgZXZlbnRzLlxuICAjIExpc3RlbmVycyB3aXNoaW5nIHRvIG1vZGlmeSBhbiB1cGRhdGVkIGFubm90YXRpb24gc2hvdWxkIHN1YnNjcmliZSB0b1xuICAjICdiZWZvcmVBbm5vdGF0aW9uVXBkYXRlZCcgd2hpbGUgbGlzdGVuZXJzIHN0b3JpbmcgYW5ub3RhdGlvbnMgc2hvdWxkXG4gICMgc3Vic2NyaWJlIHRvICdhbm5vdGF0aW9uVXBkYXRlZCcuXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBPYmplY3QgdG8gdXBkYXRlLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgYW5ub3RhdGlvbiA9IHt0YWdzOiAnYXBwbGVzIG9yYW5nZXMgcGVhcnMnfVxuICAjICAgcmVnaXN0cnkub24gJ2JlZm9yZUFubm90YXRpb25VcGRhdGVkJywgKGFubm90YXRpb24pIC0+XG4gICMgICAgICMgdmFsaWRhdGUgb3IgbW9kaWZ5IGEgcHJvcGVydHkuXG4gICMgICAgIGFubm90YXRpb24udGFncyA9IGFubm90YXRpb24udGFncy5zcGxpdCgnICcpXG4gICMgICByZWdpc3RyeS51cGRhdGUoYW5ub3RhdGlvbilcbiAgIyAgICMgPT4gUmV0dXJucyBbXCJhcHBsZXNcIiwgXCJvcmFuZ2VzXCIsIFwicGVhcnNcIl1cbiAgI1xuICAjIFJldHVybnMgYSBQcm9taXNlIG9mIGFuIGFubm90YXRpb24gT2JqZWN0LlxuICB1cGRhdGU6IChvYmopIC0+XG4gICAgaWYgbm90IG9iai5pZD9cbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhbm5vdGF0aW9uIG11c3QgaGF2ZSBhbiBpZCBmb3IgdXBkYXRlKClcIilcbiAgICB0aGlzLl9jeWNsZShvYmosICd1cGRhdGUnKVxuXG4gICMgUHVibGljOiBEZWxldGVzIHRoZSBhbm5vdGF0aW9uLlxuICAjXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gT2JqZWN0IHRvIGRlbGV0ZS5cbiAgI1xuICAjIFJldHVybnMgYSBQcm9taXNlIG9mIGFuIGFubm90YXRpb24gT2JqZWN0LlxuICBkZWxldGU6IChvYmopIC0+XG4gICAgaWYgbm90IG9iai5pZD9cbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhbm5vdGF0aW9uIG11c3QgaGF2ZSBhbiBpZCBmb3IgZGVsZXRlKClcIilcbiAgICB0aGlzLl9jeWNsZShvYmosICdkZWxldGUnKVxuXG4gICMgUHVibGljOiBRdWVyaWVzIHRoZSBzdG9yZVxuICAjXG4gICMgcXVlcnkgLSBBbiBPYmplY3QgZGVmaW5pbmcgYSBxdWVyeS4gVGhpcyBtYXkgYmUgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkgYnlcbiAgIyAgICAgICAgIGRpZmZlcmVudCBzdG9yZXMuXG4gICNcbiAgIyBSZXR1cm5zIGEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHN0b3JlIHJldHVybiB2YWx1ZS5cbiAgcXVlcnk6IChxdWVyeSkgLT5cbiAgICByZXR1cm4gQHJlZ2lzdHJ5WydzdG9yZSddLnF1ZXJ5KHF1ZXJ5KVxuXG4gICMgUHVibGljOiBRdWVyaWVzIHRoZSBzdG9yZVxuICAjXG4gICMgcXVlcnkgLSBBbiBPYmplY3QgZGVmaW5pbmcgYSBxdWVyeS4gVGhpcyBtYXkgYmUgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkgYnlcbiAgIyAgICAgICAgIGRpZmZlcmVudCBzdG9yZXMuXG4gICNcbiAgIyBSZXR1cm5zIGEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGFubm90YXRpb25zLlxuICBsb2FkOiAocXVlcnkpIC0+XG4gICAgcmV0dXJuIHRoaXMucXVlcnkocXVlcnkpXG5cbiAgIyBQcml2YXRlOiBjeWNsZSBhIHN0b3JlIGV2ZW50LCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBhbm5vdGF0aW9uIG9iamVjdCBhbmRcbiAgIyB1cGRhdGluZyBpdCBhcyBuZWNlc3NhcnkuXG4gIF9jeWNsZTogKG9iaiwgc3RvcmVGdW5jKSAtPlxuICAgIHNhZmVDb3B5ID0gJC5leHRlbmQodHJ1ZSwge30sIG9iailcbiAgICBkZWxldGUgc2FmZUNvcHkuX2xvY2FsXG5cbiAgICBAcmVnaXN0cnlbJ3N0b3JlJ11bc3RvcmVGdW5jXShzYWZlQ29weSlcbiAgICAgIC50aGVuIChyZXQpID0+XG4gICAgICAgICMgRW1wdHkgb2JqZWN0IHdpdGhvdXQgY2hhbmdpbmcgaWRlbnRpdHlcbiAgICAgICAgZm9yIG93biBrLCB2IG9mIG9ialxuICAgICAgICAgIGlmIGsgIT0gJ19sb2NhbCdcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpba11cblxuICAgICAgICAjIFVwZGF0ZSB3aXRoIHN0b3JlIHJldHVybiB2YWx1ZVxuICAgICAgICAkLmV4dGVuZChvYmosIHJldClcblxuICAgICAgICByZXR1cm4gb2JqIFxuXG5tb2R1bGUuZXhwb3J0cyA9IEFubm90YXRpb25Qcm92aWRlclxuIiwiZXh0ZW5kID0gcmVxdWlyZSAnYmFja2JvbmUtZXh0ZW5kLXN0YW5kYWxvbmUnXG5cbkRlbGVnYXRvciA9IHJlcXVpcmUgJy4vY2xhc3MnXG5SYW5nZSA9IHJlcXVpcmUgJy4vcmFuZ2UnXG5VdGlsID0gcmVxdWlyZSAnLi91dGlsJ1xuV2lkZ2V0ID0gcmVxdWlyZSAnLi93aWRnZXQnXG5WaWV3ZXIgPSByZXF1aXJlICcuL3ZpZXdlcidcbkVkaXRvciA9IHJlcXVpcmUgJy4vZWRpdG9yJ1xuTm90aWZpY2F0aW9uID0gcmVxdWlyZSAnLi9ub3RpZmljYXRpb24nXG5SZWdpc3RyeSA9IHJlcXVpcmUgJy4vcmVnaXN0cnknXG5cbkFubm90YXRpb25Qcm92aWRlciA9IHJlcXVpcmUgJy4vYW5ub3RhdGlvbnMnXG5cbl90ID0gVXRpbC5UcmFuc2xhdGlvblN0cmluZ1xuXG5cblxuIyBTZWxlY3Rpb24gYW5kIHJhbmdlIGNyZWF0aW9uIHJlZmVyZW5jZSBmb3IgdGhlIGZvbGxvd2luZyBjb2RlOlxuIyBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2RvbS9yYW5nZV9pbnRyby5odG1sXG4jXG4jIEkndmUgcmVtb3ZlZCBhbnkgc3VwcG9ydCBmb3IgSUUgVGV4dFJhbmdlIChzZWUgY29tbWl0IGQ3MDg1YmYyIGZvciBjb2RlKVxuIyBmb3IgdGhlIG1vbWVudCwgaGF2aW5nIG5vIG1lYW5zIG9mIHRlc3RpbmcgaXQuXG5cbiMgU3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgQW5ub3RhdG9yIG9iamVjdC5cbl9Bbm5vdGF0b3IgPSB0aGlzLkFubm90YXRvclxuXG5oYW5kbGVFcnJvciA9IC0+XG4gIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKVxuXG5jbGFzcyBBbm5vdGF0b3IgZXh0ZW5kcyBEZWxlZ2F0b3JcbiAgIyBFdmVudHMgdG8gYmUgYm91bmQgb24gQW5ub3RhdG9yI2VsZW1lbnQuXG4gIGV2ZW50czpcbiAgICBcIi5hbm5vdGF0b3ItYWRkZXIgYnV0dG9uIGNsaWNrXCI6ICAgICBcIm9uQWRkZXJDbGlja1wiXG4gICAgXCIuYW5ub3RhdG9yLWFkZGVyIGJ1dHRvbiBtb3VzZWRvd25cIjogXCJvbkFkZGVyTW91c2Vkb3duXCJcbiAgICBcIi5hbm5vdGF0b3ItaGwgbW91c2VvdmVyXCI6ICAgICAgICAgICBcIm9uSGlnaGxpZ2h0TW91c2VvdmVyXCJcbiAgICBcIi5hbm5vdGF0b3ItaGwgbW91c2VvdXRcIjogICAgICAgICAgICBcInN0YXJ0Vmlld2VySGlkZVRpbWVyXCJcblxuICBodG1sOlxuICAgIGFkZGVyOiAgICc8ZGl2IGNsYXNzPVwiYW5ub3RhdG9yLWFkZGVyXCI+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+JyArIF90KCdBbm5vdGF0ZScpICsgJzwvYnV0dG9uPjwvZGl2PidcbiAgICB3cmFwcGVyOiAnPGRpdiBjbGFzcz1cImFubm90YXRvci13cmFwcGVyXCI+PC9kaXY+J1xuXG4gIG9wdGlvbnM6ICMgQ29uZmlndXJhdGlvbiBvcHRpb25zXG5cbiAgICBzdG9yZTogbnVsbCAjIFN0b3JlIHBsdWdpbiB0byB1c2UuIElmIG51bGwsIEFubm90YXRvciB3aWxsIHVzZSBhIGRlZmF1bHQgc3RvcmUuXG5cbiAgICByZWFkT25seTogZmFsc2UgIyBTdGFydCBBbm5vdGF0b3IgaW4gcmVhZC1vbmx5IG1vZGUuIE5vIGNvbnRyb2xzIHdpbGwgYmUgc2hvd24uXG5cbiAgICBsb2FkUXVlcnk6IHt9ICMgSW5pdGlhbCBxdWVyeSB0byBsb2FkIEFubm90YXRpb25zXG5cbiAgcGx1Z2luczoge31cblxuICBlZGl0b3I6IG51bGxcblxuICB2aWV3ZXI6IG51bGxcblxuICBzZWxlY3RlZFJhbmdlczogbnVsbFxuXG4gIG1vdXNlSXNEb3duOiBmYWxzZVxuXG4gIGlnbm9yZU1vdXNldXA6IGZhbHNlXG5cbiAgdmlld2VySGlkZVRpbWVyOiBudWxsXG5cbiAgIyBQdWJsaWM6IENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFubm90YXRvci4gUmVxdWlyZXMgYSBET00gRWxlbWVudCBpblxuICAjIHdoaWNoIHRvIHdhdGNoIGZvciBhbm5vdGF0aW9ucyBhcyB3ZWxsIGFzIGFueSBvcHRpb25zLlxuICAjXG4gICMgTk9URTogSWYgdGhlIEFubm90YXRvciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGJyb3dzZXIgaXQgd2lsbCBub3RcbiAgIyBwZXJmb3JtIGFueSBzZXR1cCBhbmQgc2ltcGx5IHJldHVybiBhIGJhc2ljIG9iamVjdC4gVGhpcyBhbGxvd3MgcGx1Z2luc1xuICAjIHRvIHN0aWxsIGJlIGxvYWRlZCBidXQgd2lsbCBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWQuIEl0IGlzIHJlY2NvbWVuZGVkXG4gICMgdG8gY2FsbCBBbm5vdGF0b3Iuc3VwcG9ydGVkKCkgYmVmb3JlIGNyZWF0aW5nIHRoZSBpbnN0YW5jZSBvciB1c2luZyB0aGVcbiAgIyBVbnN1cHBvcnRlZCBwbHVnaW4gd2hpY2ggd2lsbCBub3RpZnkgdXNlcnMgdGhhdCB0aGUgQW5ub3RhdG9yIHdpbGwgbm90IHdvcmsuXG4gICNcbiAgIyBlbGVtZW50IC0gQSBET00gRWxlbWVudCBpbiB3aGljaCB0byBhbm5vdGF0ZS5cbiAgIyBvcHRpb25zIC0gQW4gb3B0aW9ucyBPYmplY3QuIE5PVEU6IFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gdXNlciBvcHRpb25zLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgYW5ub3RhdG9yID0gbmV3IEFubm90YXRvcihkb2N1bWVudC5ib2R5KVxuICAjXG4gICMgICAjIEV4YW1wbGUgb2YgY2hlY2tpbmcgZm9yIHN1cHBvcnQuXG4gICMgICBpZiBBbm5vdGF0b3Iuc3VwcG9ydGVkKClcbiAgIyAgICAgYW5ub3RhdG9yID0gbmV3IEFubm90YXRvcihkb2N1bWVudC5ib2R5KVxuICAjICAgZWxzZVxuICAjICAgICAjIEZhbGxiYWNrIGZvciB1bnN1cHBvcnRlZCBicm93c2Vycy5cbiAgI1xuICAjIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEFubm90YXRvci5cbiAgY29uc3RydWN0b3I6IChlbGVtZW50LCBvcHRpb25zKSAtPlxuICAgIHN1cGVyXG4gICAgQHBsdWdpbnMgPSB7fVxuXG4gICAgQW5ub3RhdG9yLl9pbnN0YW5jZXMucHVzaCh0aGlzKVxuXG4gICAgIyBSZXR1cm4gZWFybHkgaWYgdGhlIGFubm90YXRvciBpcyBub3Qgc3VwcG9ydGVkLlxuICAgIHJldHVybiB0aGlzIHVubGVzcyBBbm5vdGF0b3Iuc3VwcG9ydGVkKClcblxuICAgICMgQ3JlYXRlIHRoZSByZWdpc3RyeSBhbmQgc3RhcnQgdGhlIGFwcGxpY2F0aW9uXG4gICAgUmVnaXN0cnkuY3JlYXRlQXBwKHRoaXMsIG9wdGlvbnMpXG5cbiAgIyBQdWJsaWM6IENyZWF0ZXMgYSBzdWJjbGFzcyBvZiBBbm5vdGF0b3IuXG4gICNcbiAgIyBTZWUgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBCYWNrYm9uZTogaHR0cDovL2JhY2tib25lanMub3JnLyNNb2RlbC1leHRlbmRcbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHZhciBFeHRlbmRlZEFubm90YXRvciA9IEFubm90YXRvci5leHRlbmQoe1xuICAjICAgICBzZXR1cEFubm90YXRpb246IGZ1bmN0aW9uIChhbm5vdGF0aW9uKSB7XG4gICMgICAgICAgLy8gSW52b2tlIHRoZSBidWlsdC1pbiBpbXBsZW1lbnRhdGlvblxuICAjICAgICAgIHRyeSB7XG4gICMgICAgICAgICBBbm5vdGF0b3IucHJvdG90eXBlLnNldHVwQW5ub3RhdGlvbi5jYWxsKHRoaXMsIGFubm90YXRpb24pO1xuICAjICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgIyAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQW5ub3RhdG9yLlJhbmdlLlJhbmdlRXJyb3IpIHtcbiAgIyAgICAgICAgICAgLy8gVHJ5IHRvIGxvY2F0ZSB0aGUgQW5ub3RhdGlvbiB1c2luZyB0aGUgcXVvdGVcbiAgIyAgICAgICAgIH0gZWxzZSB7XG4gICMgICAgICAgICAgIHRocm93IGU7XG4gICMgICAgICAgICB9XG4gICMgICAgICAgfVxuICAjXG4gICMgICAgICAgcmV0dXJuIGFubm90YXRpb247XG4gICMgICB9KTtcbiAgI1xuICAjICAgdmFyIGFubm90YXRvciA9IG5ldyBFeHRlbmRlZEFubm90YXRvcihkb2N1bWVudC5ib2R5LCAvKiB7b3B0aW9uc30gKi8pO1xuICBAZXh0ZW5kOiBleHRlbmRcblxuICAjIFdyYXBzIHRoZSBjaGlsZHJlbiBvZiBAZWxlbWVudCBpbiBhIEB3cmFwcGVyIGRpdi4gTk9URTogVGhpcyBtZXRob2Qgd2lsbCBhbHNvXG4gICMgcmVtb3ZlIGFueSBzY3JpcHQgZWxlbWVudHMgaW5zaWRlIEBlbGVtZW50IHRvIHByZXZlbnQgdGhlbSByZS1leGVjdXRpbmcuXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZy5cbiAgX3NldHVwV3JhcHBlcjogLT5cbiAgICBAd3JhcHBlciA9ICQoQGh0bWwud3JhcHBlcilcblxuICAgICMgV2UgbmVlZCB0byByZW1vdmUgYWxsIHNjcmlwdHMgd2l0aGluIHRoZSBlbGVtZW50IGJlZm9yZSB3cmFwcGluZyB0aGVcbiAgICAjIGNvbnRlbnRzIHdpdGhpbiBhIGRpdi4gT3RoZXJ3aXNlIHdoZW4gc2NyaXB0cyBhcmUgcmVhcHBlbmRlZCB0byB0aGUgRE9NXG4gICAgIyB0aGV5IHdpbGwgcmUtZXhlY3V0ZS4gVGhpcyBpcyBhbiBpc3N1ZSBmb3Igc2NyaXB0cyB0aGF0IGNhbGxcbiAgICAjIGRvY3VtZW50LndyaXRlKCkgLSBzdWNoIGFzIGFkcyAtIGFzIHRoZXkgd2lsbCBjbGVhciB0aGUgcGFnZS5cbiAgICBAZWxlbWVudC5maW5kKCdzY3JpcHQnKS5yZW1vdmUoKVxuICAgIEBlbGVtZW50LndyYXBJbm5lcihAd3JhcHBlcilcbiAgICBAd3JhcHBlciA9IEBlbGVtZW50LmZpbmQoJy5hbm5vdGF0b3Itd3JhcHBlcicpXG5cbiAgICB0aGlzXG5cbiAgIyBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEFubm90YXRvci5WaWV3ZXIgYW5kIGFzc2lnbnMgaXQgdG8gdGhlIEB2aWV3ZXJcbiAgIyBwcm9wZXJ0eSwgYXBwZW5kcyBpdCB0byB0aGUgQHdyYXBwZXIgYW5kIHNldHMgdXAgZXZlbnQgbGlzdGVuZXJzLlxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmcuXG4gIF9zZXR1cFZpZXdlcjogLT5cbiAgICBAdmlld2VyID0gbmV3IEFubm90YXRvci5WaWV3ZXIocmVhZE9ubHk6IEBvcHRpb25zLnJlYWRPbmx5KVxuICAgIEB2aWV3ZXIuaGlkZSgpXG4gICAgICAub24oXCJlZGl0XCIsIHRoaXMub25FZGl0QW5ub3RhdGlvbilcbiAgICAgIC5vbihcImRlbGV0ZVwiLCAoYW5ub3RhdGlvbikgPT5cbiAgICAgICAgQHZpZXdlci5oaWRlKClcbiAgICAgICAgdGhpcy5wdWJsaXNoKCdiZWZvcmVBbm5vdGF0aW9uRGVsZXRlZCcsIFthbm5vdGF0aW9uXSlcbiAgICAgICAgIyBEZWxldGUgaGlnaGxpZ2h0IGVsZW1lbnRzLlxuICAgICAgICB0aGlzLmNsZWFudXBBbm5vdGF0aW9uKGFubm90YXRpb24pXG4gICAgICAgICMgRGVsZXRlIGFubm90YXRpb25cbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5kZWxldGUoYW5ub3RhdGlvbilcbiAgICAgICAgICAuZG9uZSA9PiB0aGlzLnB1Ymxpc2goJ2Fubm90YXRpb25EZWxldGVkJywgW2Fubm90YXRpb25dKVxuICAgICAgKVxuICAgICAgLmFkZEZpZWxkKHtcbiAgICAgICAgbG9hZDogKGZpZWxkLCBhbm5vdGF0aW9uKSA9PlxuICAgICAgICAgIGlmIGFubm90YXRpb24udGV4dFxuICAgICAgICAgICAgJChmaWVsZCkuaHRtbChVdGlsLmVzY2FwZShhbm5vdGF0aW9uLnRleHQpKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICQoZmllbGQpLmh0bWwoXCI8aT4je190ICdObyBDb21tZW50J308L2k+XCIpXG4gICAgICAgICAgdGhpcy5wdWJsaXNoKCdhbm5vdGF0aW9uVmlld2VyVGV4dEZpZWxkJywgW2ZpZWxkLCBhbm5vdGF0aW9uXSlcbiAgICAgIH0pXG4gICAgICAuZWxlbWVudC5hcHBlbmRUbyhAd3JhcHBlcikuYmluZCh7XG4gICAgICAgIFwibW91c2VvdmVyXCI6IHRoaXMuY2xlYXJWaWV3ZXJIaWRlVGltZXJcbiAgICAgICAgXCJtb3VzZW91dFwiOiAgdGhpcy5zdGFydFZpZXdlckhpZGVUaW1lclxuICAgICAgfSlcbiAgICB0aGlzXG5cbiAgIyBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBBbm5vdGF0b3IuRWRpdG9yIGFuZCBhc3NpZ25zIGl0IHRvIEBlZGl0b3IuXG4gICMgQXBwZW5kcyB0aGlzIHRvIHRoZSBAd3JhcHBlciBhbmQgc2V0cyB1cCBldmVudCBsaXN0ZW5lcnMuXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gIF9zZXR1cEVkaXRvcjogLT5cbiAgICBAZWRpdG9yID0gbmV3IEFubm90YXRvci5FZGl0b3IoKVxuICAgIEBlZGl0b3IuaGlkZSgpXG4gICAgICAub24oJ2hpZGUnLCB0aGlzLm9uRWRpdG9ySGlkZSlcbiAgICAgIC5vbignc2F2ZScsIHRoaXMub25FZGl0b3JTdWJtaXQpXG4gICAgICAuYWRkRmllbGQoe1xuICAgICAgICB0eXBlOiAndGV4dGFyZWEnLFxuICAgICAgICBsYWJlbDogX3QoJ0NvbW1lbnRzJykgKyAnXFx1MjAyNidcbiAgICAgICAgbG9hZDogKGZpZWxkLCBhbm5vdGF0aW9uKSAtPlxuICAgICAgICAgICQoZmllbGQpLmZpbmQoJ3RleHRhcmVhJykudmFsKGFubm90YXRpb24udGV4dCB8fCAnJylcbiAgICAgICAgc3VibWl0OiAoZmllbGQsIGFubm90YXRpb24pIC0+XG4gICAgICAgICAgYW5ub3RhdGlvbi50ZXh0ID0gJChmaWVsZCkuZmluZCgndGV4dGFyZWEnKS52YWwoKVxuICAgICAgfSlcblxuICAgIEBlZGl0b3IuZWxlbWVudC5hcHBlbmRUbyhAd3JhcHBlcilcbiAgICB0aGlzXG5cbiAgIyBTZXRzIHVwIHRoZSBzZWxlY3Rpb24gZXZlbnQgbGlzdGVuZXJzIHRvIHdhdGNoIG1vdXNlIGFjdGlvbnMgb24gdGhlIGRvY3VtZW50LlxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICBfc2V0dXBEb2N1bWVudEV2ZW50czogLT5cbiAgICAkKGRvY3VtZW50KS5iaW5kKHtcbiAgICAgIFwibW91c2V1cFwiOiAgIHRoaXMuY2hlY2tGb3JFbmRTZWxlY3Rpb25cbiAgICAgIFwibW91c2Vkb3duXCI6IHRoaXMuY2hlY2tGb3JTdGFydFNlbGVjdGlvblxuICAgIH0pXG4gICAgdGhpc1xuXG4gICMgU2V0cyB1cCBhbnkgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBDU1MgZm9yIHRoZSBBbm5vdGF0b3IuXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gIF9zZXR1cER5bmFtaWNTdHlsZTogLT5cbiAgICBzdHlsZSA9ICQoJyNhbm5vdGF0b3ItZHluYW1pYy1zdHlsZScpXG5cbiAgICBpZiAoIXN0eWxlLmxlbmd0aClcbiAgICAgIHN0eWxlID0gJCgnPHN0eWxlIGlkPVwiYW5ub3RhdG9yLWR5bmFtaWMtc3R5bGVcIj48L3N0eWxlPicpLmFwcGVuZFRvKGRvY3VtZW50LmhlYWQpXG5cbiAgICBzZWwgPSAnKicgKyAoXCI6bm90KC5hbm5vdGF0b3ItI3t4fSlcIiBmb3IgeCBpbiBbJ2FkZGVyJywgJ291dGVyJywgJ25vdGljZScsICdmaWx0ZXInXSkuam9pbignJylcblxuICAgICMgdXNlIHRoZSBtYXhpbXVtIHotaW5kZXggaW4gdGhlIHBhZ2VcbiAgICBtYXggPSBVdGlsLm1heFpJbmRleCgkKGRvY3VtZW50LmJvZHkpLmZpbmQoc2VsKSlcblxuICAgICMgYnV0IGRvbid0IGdvIHNtYWxsZXIgdGhhbiAxMDEwLCBiZWNhdXNlIHRoaXMgaXNuJ3QgYnVsbGV0cHJvb2YgLS1cbiAgICAjIGR5bmFtaWMgZWxlbWVudHMgaW4gdGhlIHBhZ2UgKG5vdGlmaWNhdGlvbnMsIGRpYWxvZ3MsIGV0Yy4pIG1heSB3ZWxsXG4gICAgIyBoYXZlIGhpZ2ggei1pbmRpY2VzIHRoYXQgd2UgY2FuJ3QgY2F0Y2ggdXNpbmcgdGhlIGFib3ZlIG1ldGhvZC5cbiAgICBtYXggPSBNYXRoLm1heChtYXgsIDEwMDApXG5cbiAgICBzdHlsZS50ZXh0IFtcbiAgICAgIFwiLmFubm90YXRvci1hZGRlciwgLmFubm90YXRvci1vdXRlciwgLmFubm90YXRvci1ub3RpY2Uge1wiXG4gICAgICBcIiAgei1pbmRleDogI3ttYXggKyAyMH07XCJcbiAgICAgIFwifVwiXG4gICAgICBcIi5hbm5vdGF0b3ItZmlsdGVyIHtcIlxuICAgICAgXCIgIHotaW5kZXg6ICN7bWF4ICsgMTB9O1wiXG4gICAgICBcIn1cIlxuICAgIF0uam9pbihcIlxcblwiKVxuXG4gICAgdGhpc1xuXG4gICMgUHVibGljOiBMb2FkIGFuZCBkcmF3IGFubm90YXRpb25zIGZyb20gYSBnaXZlbiBxdWVyeS5cbiAgI1xuICAjIHF1ZXJ5IC0gdGhlIHF1ZXJ5IHRvIHBhc3MgdG8gdGhlIGJhY2tlbmRcbiAgI1xuICAjIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBsb2FkaW5nIGlzIGNvbXBsZXRlLlxuICBsb2FkOiAocXVlcnkpIC0+XG4gICAgQGFubm90YXRpb25zLmxvYWQocXVlcnkpXG4gICAgICAudGhlbiAoYW5ub3RhdGlvbnMsIG1ldGEpID0+XG4gICAgICAgIHRoaXMubG9hZEFubm90YXRpb25zKGFubm90YXRpb25zKVxuXG4gICMgUHVibGljOiBEZXN0cm95IHRoZSBjdXJyZW50IEFubm90YXRvciBpbnN0YW5jZSwgdW5iaW5kaW5nIGFsbCBldmVudHMgYW5kXG4gICMgZGlzcG9zaW5nIG9mIGFsbCByZWxldmFudCBlbGVtZW50cy5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgZGVzdHJveTogLT5cbiAgICAkKGRvY3VtZW50KS51bmJpbmQoe1xuICAgICAgXCJtb3VzZXVwXCI6ICAgdGhpcy5jaGVja0ZvckVuZFNlbGVjdGlvblxuICAgICAgXCJtb3VzZWRvd25cIjogdGhpcy5jaGVja0ZvclN0YXJ0U2VsZWN0aW9uXG4gICAgfSlcblxuICAgICQoJyNhbm5vdGF0b3ItZHluYW1pYy1zdHlsZScpLnJlbW92ZSgpXG5cbiAgICBAYWRkZXIucmVtb3ZlKClcbiAgICBAdmlld2VyLmRlc3Ryb3koKVxuICAgIEBlZGl0b3IuZGVzdHJveSgpXG5cbiAgICBAd3JhcHBlci5maW5kKCcuYW5ub3RhdG9yLWhsJykuZWFjaCAtPlxuICAgICAgJCh0aGlzKS5jb250ZW50cygpLmluc2VydEJlZm9yZSh0aGlzKVxuICAgICAgJCh0aGlzKS5yZW1vdmUoKVxuXG4gICAgQHdyYXBwZXIuY29udGVudHMoKS5pbnNlcnRCZWZvcmUoQHdyYXBwZXIpXG4gICAgQHdyYXBwZXIucmVtb3ZlKClcbiAgICBAZWxlbWVudC5kYXRhKCdhbm5vdGF0b3InLCBudWxsKVxuXG4gICAgZm9yIG5hbWUsIHBsdWdpbiBvZiBAcGx1Z2luc1xuICAgICAgQHBsdWdpbnNbbmFtZV0uZGVzdHJveSgpXG5cbiAgICB0aGlzLnJlbW92ZUV2ZW50cygpXG4gICAgaWR4ID0gQW5ub3RhdG9yLl9pbnN0YW5jZXMuaW5kZXhPZih0aGlzKVxuICAgIGlmIGlkeCAhPSAtMVxuICAgICAgQW5ub3RhdG9yLl9pbnN0YW5jZXMuc3BsaWNlKGlkeCwgMSlcblxuICAjIFB1YmxpYzogR2V0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gZXhjbHVkaW5nIGFueSBub2RlcyB0aGF0IGZhbGwgb3V0c2lkZSBvZlxuICAjIHRoZSBAd3JhcHBlci4gVGhlbiByZXR1cm5zIGFuZCBBcnJheSBvZiBOb3JtYWxpemVkUmFuZ2UgaW5zdGFuY2VzLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBBIHNlbGVjdGlvbiBpbnNpZGUgQHdyYXBwZXJcbiAgIyAgIGFubm90YXRpb24uZ2V0U2VsZWN0ZWRSYW5nZXMoKVxuICAjICAgIyA9PiBSZXR1cm5zIFtOb3JtYWxpemVkUmFuZ2VdXG4gICNcbiAgIyAgICMgQSBzZWxlY3Rpb24gb3V0c2lkZSBvZiBAd3JhcHBlclxuICAjICAgYW5ub3RhdGlvbi5nZXRTZWxlY3RlZFJhbmdlcygpXG4gICMgICAjID0+IFJldHVybnMgW11cbiAgI1xuICAjIFJldHVybnMgQXJyYXkgb2YgTm9ybWFsaXplZFJhbmdlIGluc3RhbmNlcy5cbiAgZ2V0U2VsZWN0ZWRSYW5nZXM6IC0+XG4gICAgc2VsZWN0aW9uID0gVXRpbC5nZXRHbG9iYWwoKS5nZXRTZWxlY3Rpb24oKVxuXG4gICAgcmFuZ2VzID0gW11cbiAgICByYW5nZXNUb0lnbm9yZSA9IFtdXG4gICAgdW5sZXNzIHNlbGVjdGlvbi5pc0NvbGxhcHNlZFxuICAgICAgcmFuZ2VzID0gZm9yIGkgaW4gWzAuLi5zZWxlY3Rpb24ucmFuZ2VDb3VudF1cbiAgICAgICAgciA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpXG4gICAgICAgIGJyb3dzZXJSYW5nZSA9IG5ldyBSYW5nZS5Ccm93c2VyUmFuZ2UocilcbiAgICAgICAgbm9ybWVkUmFuZ2UgPSBicm93c2VyUmFuZ2Uubm9ybWFsaXplKCkubGltaXQoQHdyYXBwZXJbMF0pXG5cbiAgICAgICAgIyBJZiB0aGUgbmV3IHJhbmdlIGZhbGxzIGZ1bGx5IG91dHNpZGUgdGhlIHdyYXBwZXIsIHdlXG4gICAgICAgICMgc2hvdWxkIGFkZCBpdCBiYWNrIHRvIHRoZSBkb2N1bWVudCBidXQgbm90IHJldHVybiBpdCBmcm9tXG4gICAgICAgICMgdGhpcyBtZXRob2RcbiAgICAgICAgcmFuZ2VzVG9JZ25vcmUucHVzaChyKSBpZiBub3JtZWRSYW5nZSBpcyBudWxsXG5cbiAgICAgICAgbm9ybWVkUmFuZ2VcblxuICAgICAgIyBCcm93c2VyUmFuZ2Ujbm9ybWFsaXplKCkgbW9kaWZpZXMgdGhlIERPTSBzdHJ1Y3R1cmUgYW5kIGRlc2VsZWN0cyB0aGVcbiAgICAgICMgdW5kZXJseWluZyB0ZXh0IGFzIGEgcmVzdWx0LiBTbyBoZXJlIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgcmFuZ2VzIGFuZFxuICAgICAgIyByZWFwcGx5IHRoZSBuZXcgb25lcy5cbiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuXG4gICAgZm9yIHIgaW4gcmFuZ2VzVG9JZ25vcmVcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyKVxuXG4gICAgIyBSZW1vdmUgYW55IHJhbmdlcyB0aGF0IGZlbGwgb3V0c2lkZSBvZiBAd3JhcHBlci5cbiAgICAkLmdyZXAgcmFuZ2VzLCAocmFuZ2UpIC0+XG4gICAgICAjIEFkZCB0aGUgbm9ybWVkIHJhbmdlIGJhY2sgdG8gdGhlIHNlbGVjdGlvbiBpZiBpdCBleGlzdHMuXG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UudG9SYW5nZSgpKSBpZiByYW5nZVxuICAgICAgcmFuZ2VcblxuXG4gICMgUHVibGljOiBJbml0aWFsaXNlcyBhbiBhbm5vdGF0aW9uIGZyb20gYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uLiBJdCBmaW5kc1xuICAjIHRoZSBzZWxlY3RlZCByYW5nZSBhbmQgaGlnbGlnaHRzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIERPTS5cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdCB0byBpbml0aWFsaXNlLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBDcmVhdGUgYSBicmFuZCBuZXcgYW5ub3RhdGlvbiBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGV4dC5cbiAgIyAgIGFubm90YXRpb24gPSBhbm5vdGF0b3Iuc2V0dXBBbm5vdGF0aW9uKHtyYW5nZXM6IGFubm90YXRvci5zZWxlY3RlZFJhbmdlc30pXG4gICMgICAjIGFubm90YXRpb24gaGFzIG5vdyBiZWVuIGFzc2lnbmVkIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmFuZ2VcbiAgIyAgICMgYW5kIGEgaGlnaGxpZ2h0IGFwcGVuZGVkIHRvIHRoZSBET00uXG4gICNcbiAgIyAgICMgQWRkIGFuIGV4aXN0aW5nIGFubm90YXRpb24gdGhhdCBoYXMgYmVlbiBzdG9yZWQgZWxzZXdlcmUgdG8gdGhlIERPTS5cbiAgIyAgIGFubm90YXRpb24gPSBnZXRTdG9yZWRBbm5vdGF0aW9uV2l0aFNlcmlhbGl6ZWRSYW5nZXMoKVxuICAjICAgYW5ub3RhdGlvbiA9IGFubm90YXRvci5zZXR1cEFubm90YXRpb24oYW5ub3RhdGlvbilcbiAgI1xuICAjIFJldHVybnMgdGhlIGluaXRpYWxpc2VkIGFubm90YXRpb24uXG4gIHNldHVwQW5ub3RhdGlvbjogKGFubm90YXRpb24pIC0+XG4gICAgcm9vdCA9IEB3cmFwcGVyWzBdXG5cbiAgICBub3JtZWRSYW5nZXMgPSBbXVxuICAgIGZvciByIGluIGFubm90YXRpb24ucmFuZ2VzXG4gICAgICB0cnlcbiAgICAgICAgbm9ybWVkUmFuZ2VzLnB1c2goUmFuZ2Uuc25pZmYocikubm9ybWFsaXplKHJvb3QpKVxuICAgICAgY2F0Y2ggZVxuICAgICAgICBpZiBlIGluc3RhbmNlb2YgUmFuZ2UuUmFuZ2VFcnJvclxuICAgICAgICAgIHRoaXMucHVibGlzaCgncmFuZ2VOb3JtYWxpemVGYWlsJywgW2Fubm90YXRpb24sIHIsIGVdKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgIyBPaCBKYXZhc2NyaXB0LCB3aHkgeW91IHNvIGNyYXA/IFRoaXMgd2lsbCBsb3NlIHRoZSB0cmFjZWJhY2suXG4gICAgICAgICAgdGhyb3cgZVxuXG4gICAgYW5ub3RhdGlvbi5xdW90ZSAgICAgID0gW11cbiAgICBhbm5vdGF0aW9uLnJhbmdlcyAgICAgPSBbXVxuICAgIGFubm90YXRpb24uX2xvY2FsID0ge31cbiAgICBhbm5vdGF0aW9uLl9sb2NhbC5oaWdobGlnaHRzID0gW11cblxuICAgIGZvciBub3JtZWQgaW4gbm9ybWVkUmFuZ2VzXG4gICAgICBhbm5vdGF0aW9uLnF1b3RlLnB1c2ggICAgICAkLnRyaW0obm9ybWVkLnRleHQoKSlcbiAgICAgIGFubm90YXRpb24ucmFuZ2VzLnB1c2ggICAgIG5vcm1lZC5zZXJpYWxpemUoQHdyYXBwZXJbMF0sICcuYW5ub3RhdG9yLWhsJylcbiAgICAgICQubWVyZ2UgYW5ub3RhdGlvbi5fbG9jYWwuaGlnaGxpZ2h0cywgdGhpcy5oaWdobGlnaHRSYW5nZShub3JtZWQpXG5cbiAgICAjIEpvaW4gYWxsIHRoZSBxdW90ZXMgaW50byBvbmUgc3RyaW5nLlxuICAgIGFubm90YXRpb24ucXVvdGUgPSBhbm5vdGF0aW9uLnF1b3RlLmpvaW4oJyAvICcpXG5cbiAgICAjIFNhdmUgdGhlIGFubm90YXRpb24gZGF0YSBvbiBlYWNoIGhpZ2hsaWdodGVyIGVsZW1lbnQuXG4gICAgJChhbm5vdGF0aW9uLl9sb2NhbC5oaWdobGlnaHRzKS5kYXRhKCdhbm5vdGF0aW9uJywgYW5ub3RhdGlvbilcblxuICAgIGFubm90YXRpb25cblxuICAjIFB1YmxpYzogRGVsZXRlcyB0aGUgYW5ub3RhdGlvbiBieSByZW1vdmluZyB0aGUgaGlnaGxpZ2h0IGZyb20gdGhlIERPTS5cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdCB0byBkZWxldGUuXG4gICNcbiAgIyBSZXR1cm5zIGRlbGV0ZWQgYW5ub3RhdGlvbi5cbiAgY2xlYW51cEFubm90YXRpb246IChhbm5vdGF0aW9uKSAtPlxuICAgIGlmIGFubm90YXRpb24uX2xvY2FsPy5oaWdobGlnaHRzP1xuICAgICAgZm9yIGggaW4gYW5ub3RhdGlvbi5fbG9jYWwuaGlnaGxpZ2h0cyB3aGVuIGgucGFyZW50Tm9kZT9cbiAgICAgICAgJChoKS5yZXBsYWNlV2l0aChoLmNoaWxkTm9kZXMpXG4gICAgICBkZWxldGUgYW5ub3RhdGlvbi5fbG9jYWwuaGlnaGxpZ2h0c1xuXG4gICAgYW5ub3RhdGlvblxuXG4gICMgUHVibGljOiBMb2FkcyBhbiBBcnJheSBvZiBhbm5vdGF0aW9ucyBpbnRvIHRoZSBAZWxlbWVudC4gQnJlYWtzIHRoZSB0YXNrXG4gICMgaW50byBjaHVua3Mgb2YgMTAgYW5ub3RhdGlvbnMuXG4gICNcbiAgIyBhbm5vdGF0aW9ucyAtIEFuIEFycmF5IG9mIGFubm90YXRpb24gT2JqZWN0cy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGxvYWRBbm5vdGF0aW9uc0Zyb21TdG9yZSAoYW5ub3RhdGlvbnMpIC0+XG4gICMgICAgIGFubm90YXRvci5sb2FkQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gIGxvYWRBbm5vdGF0aW9uczogKGFubm90YXRpb25zPVtdKSAtPlxuICAgIGxvYWRlciA9IChhbm5MaXN0PVtdKSA9PlxuICAgICAgbm93ID0gYW5uTGlzdC5zcGxpY2UoMCwxMClcblxuICAgICAgZm9yIG4gaW4gbm93XG4gICAgICAgIHRoaXMuc2V0dXBBbm5vdGF0aW9uKG4pXG5cbiAgICAgICMgSWYgdGhlcmUgYXJlIG1vcmUgdG8gZG8sIGRvIHRoZW0gYWZ0ZXIgYSAxMG1zIGJyZWFrIChmb3IgYnJvd3NlclxuICAgICAgIyByZXNwb25zaXZlbmVzcykuXG4gICAgICBpZiBhbm5MaXN0Lmxlbmd0aCA+IDBcbiAgICAgICAgc2V0VGltZW91dCgoLT4gbG9hZGVyKGFubkxpc3QpKSwgMTApXG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMucHVibGlzaCAnYW5ub3RhdGlvbnNMb2FkZWQnLCBbY2xvbmVdXG5cbiAgICBjbG9uZSA9IGFubm90YXRpb25zLnNsaWNlKClcbiAgICBsb2FkZXIgYW5ub3RhdGlvbnNcblxuICAgIHRoaXNcblxuICAjIFB1YmxpYzogQ2FsbHMgdGhlIFN0b3JlI2R1bXBBbm5vdGF0aW9ucygpIG1ldGhvZC5cbiAgI1xuICAjIFJldHVybnMgZHVtcGVkIGFubm90YXRpb25zIEFycmF5IG9yIGZhbHNlIGlmIFN0b3JlIGlzIG5vdCBsb2FkZWQuXG4gIGR1bXBBbm5vdGF0aW9uczogKCkgLT5cbiAgICBpZiBAcGx1Z2luc1snU3RvcmUnXVxuICAgICAgQHBsdWdpbnNbJ1N0b3JlJ10uZHVtcEFubm90YXRpb25zKClcbiAgICBlbHNlXG4gICAgICBjb25zb2xlLndhcm4oX3QoXCJDYW4ndCBkdW1wIGFubm90YXRpb25zIHdpdGhvdXQgU3RvcmUgcGx1Z2luLlwiKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICMgUHVibGljOiBXcmFwcyB0aGUgRE9NIE5vZGVzIHdpdGhpbiB0aGUgcHJvdmlkZWQgcmFuZ2Ugd2l0aCBhIGhpZ2hsaWdodFxuICAjIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBjbGFzc8KgYW5kIHJldHVybnMgdGhlIGhpZ2hsaWdodCBFbGVtZW50cy5cbiAgI1xuICAjIG5vcm1lZFJhbmdlIC0gQSBOb3JtYWxpemVkUmFuZ2UgdG8gYmUgaGlnaGxpZ2h0ZWQuXG4gICMgY3NzQ2xhc3MgLSBBIENTUyBjbGFzcyB0byB1c2UgZm9yIHRoZSBoaWdobGlnaHQgKGRlZmF1bHQ6ICdhbm5vdGF0b3ItaGwnKVxuICAjXG4gICMgUmV0dXJucyBhbiBhcnJheSBvZiBoaWdobGlnaHQgRWxlbWVudHMuXG4gIGhpZ2hsaWdodFJhbmdlOiAobm9ybWVkUmFuZ2UsIGNzc0NsYXNzPSdhbm5vdGF0b3ItaGwnKSAtPlxuICAgIHdoaXRlID0gL15cXHMqJC9cblxuICAgIGhsID0gJChcIjxzcGFuIGNsYXNzPScje2Nzc0NsYXNzfSc+PC9zcGFuPlwiKVxuXG4gICAgIyBJZ25vcmUgdGV4dCBub2RlcyB0aGF0IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuIFRoaXMgcHJldmVudHNcbiAgICAjIHNwYW5zIGJlaW5nIGluamVjdGVkIGJldHdlZW4gZWxlbWVudHMgdGhhdCBjYW4gb25seSBjb250YWluIGEgcmVzdHJpY3RlZFxuICAgICMgc3Vic2V0IG9mIG5vZGVzIHN1Y2ggYXMgdGFibGUgcm93cyBhbmQgbGlzdHMuIFRoaXMgZG9lcyBtZWFuIHRoYXQgdGhlcmVcbiAgICAjIG1heSBiZSB0aGUgb2RkIGFiYW5kb25lZCB3aGl0ZXNwYWNlIG5vZGUgaW4gYSBwYXJhZ3JhcGggdGhhdCBpcyBza2lwcGVkXG4gICAgIyBidXQgYmV0dGVyIHRoYW4gYnJlYWtpbmcgdGFibGUgbGF5b3V0cy5cbiAgICBmb3Igbm9kZSBpbiBub3JtZWRSYW5nZS50ZXh0Tm9kZXMoKSB3aGVuIG5vdCB3aGl0ZS50ZXN0KG5vZGUubm9kZVZhbHVlKVxuICAgICAgJChub2RlKS53cmFwQWxsKGhsKS5wYXJlbnQoKS5zaG93KClbMF1cblxuICAjIFB1YmxpYzogaGlnaGxpZ2h0IGEgbGlzdCBvZiByYW5nZXNcbiAgI1xuICAjIG5vcm1lZFJhbmdlcyAtIEFuIGFycmF5IG9mIE5vcm1hbGl6ZWRSYW5nZXMgdG8gYmUgaGlnaGxpZ2h0ZWQuXG4gICMgY3NzQ2xhc3MgLSBBIENTUyBjbGFzcyB0byB1c2UgZm9yIHRoZSBoaWdobGlnaHQgKGRlZmF1bHQ6ICdhbm5vdGF0b3ItaGwnKVxuICAjXG4gICMgUmV0dXJucyBhbiBhcnJheSBvZiBoaWdobGlnaHQgRWxlbWVudHMuXG4gIGhpZ2hsaWdodFJhbmdlczogKG5vcm1lZFJhbmdlcywgY3NzQ2xhc3M9J2Fubm90YXRvci1obCcpIC0+XG4gICAgaGlnaGxpZ2h0cyA9IFtdXG4gICAgZm9yIHIgaW4gbm9ybWVkUmFuZ2VzXG4gICAgICAkLm1lcmdlIGhpZ2hsaWdodHMsIHRoaXMuaGlnaGxpZ2h0UmFuZ2UociwgY3NzQ2xhc3MpXG4gICAgaGlnaGxpZ2h0c1xuXG4gICMgUHVibGljOiBSZWdpc3RlcnMgYSBwbHVnaW4gd2l0aCB0aGUgQW5ub3RhdG9yLiBBIHBsdWdpbiBjYW4gb25seSBiZVxuICAjIHJlZ2lzdGVyZWQgb25jZS4gVGhlIHBsdWdpbiB3aWxsIGJlIGluc3RhbnRpYXRlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyLlxuICAjXG4gICMgMS4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbiB3aWxsIGJlIGNyZWF0ZWQgKHByb3ZpZGluZyB0aGUgQGVsZW1lbnQgYW5kXG4gICMgICAgb3B0aW9ucyBhcyBwYXJhbXMpIHRoZW4gYXNzaWduZWQgdG8gdGhlIEBwbHVnaW5zIHJlZ2lzdHJ5LlxuICAjIDIuIFRoZSBjdXJyZW50IEFubm90YXRvciBpbnN0YW5jZSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBwbHVnaW4uXG4gICMgMy4gVGhlIFBsdWdpbiNwbHVnaW5Jbml0KCkgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGlmIGl0IGV4aXN0cy5cbiAgI1xuICAjIG5hbWUgICAgLSBQbHVnaW4gdG8gaW5zdGFudGlhdGUuIE11c3QgYmUgaW4gdGhlIEFubm90YXRvci5QbHVnaW5zIG5hbWVzcGFjZS5cbiAgIyBvcHRpb25zIC0gQW55IG9wdGlvbnMgdG8gYmUgcHJvdmlkZWQgdG8gdGhlIHBsdWdpbiBjb25zdHJ1Y3Rvci5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGFubm90YXRvclxuICAjICAgICAuYWRkUGx1Z2luKCdUYWdzJylcbiAgIyAgICAgLmFkZFBsdWdpbignU3RvcmUnLCB7XG4gICMgICAgICAgcHJlZml4OiAnL3N0b3JlJ1xuICAjICAgICB9KVxuICAjICAgICAuYWRkUGx1Z2luKCdQZXJtaXNzaW9ucycsIHtcbiAgIyAgICAgICB1c2VyOiAnQmlsbCdcbiAgIyAgICAgfSlcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nLlxuICBhZGRQbHVnaW46IChuYW1lLCBvcHRpb25zKSAtPlxuICAgIGlmIEBwbHVnaW5zW25hbWVdXG4gICAgICBjb25zb2xlLmVycm9yIF90KFwiWW91IGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YgYW55IHBsdWdpbi5cIilcbiAgICBlbHNlXG4gICAgICBrbGFzcyA9IEFubm90YXRvci5QbHVnaW5bbmFtZV1cbiAgICAgIGlmIHR5cGVvZiBrbGFzcyBpcyAnZnVuY3Rpb24nXG4gICAgICAgIEBwbHVnaW5zW25hbWVdID0gbmV3IGtsYXNzKEBlbGVtZW50WzBdLCBvcHRpb25zKVxuICAgICAgICBAcGx1Z2luc1tuYW1lXS5hbm5vdGF0b3IgPSB0aGlzXG4gICAgICAgIEBwbHVnaW5zW25hbWVdLnBsdWdpbkluaXQ/KClcbiAgICAgIGVsc2VcbiAgICAgICAgY29uc29sZS5lcnJvciBfdChcIkNvdWxkIG5vdCBsb2FkIFwiKSArIG5hbWUgKyBfdChcIiBwbHVnaW4uIEhhdmUgeW91IGluY2x1ZGVkIHRoZSBhcHByb3ByaWF0ZSA8c2NyaXB0PiB0YWc/XCIpXG4gICAgdGhpcyAjIGFsbG93IGNoYWluaW5nXG5cbiAgIyBQdWJsaWM6IFdhaXRzIGZvciB0aGUgQGVkaXRvciB0byBzdWJtaXQgb3IgaGlkZSwgcmV0dXJuaW5nIGEgcHJvbWlzZSB0aGF0XG4gICMgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGFubm90YXRpb24gd2FzIHNhdmVkIG9yXG4gICMgY2FuY2VsbGVkLlxuICBlZGl0QW5ub3RhdGlvbjogKGFubm90YXRpb24sIHBvc2l0aW9uKSAtPlxuICAgIGRmZCA9ICQuRGVmZXJyZWQoKVxuICAgIHJlc29sdmUgPSBkZmQucmVzb2x2ZS5iaW5kKGRmZCwgYW5ub3RhdGlvbilcbiAgICByZWplY3QgPSBkZmQucmVqZWN0LmJpbmQoZGZkLCBhbm5vdGF0aW9uKVxuXG4gICAgdGhpcy5zaG93RWRpdG9yKGFubm90YXRpb24sIHBvc2l0aW9uKVxuICAgIHRoaXMuc3Vic2NyaWJlKCdhbm5vdGF0aW9uRWRpdG9yU3VibWl0JywgcmVzb2x2ZSlcbiAgICB0aGlzLm9uY2UgJ2Fubm90YXRpb25FZGl0b3JIaWRkZW4nLCA9PlxuICAgICAgdGhpcy51bnN1YnNjcmliZSgnYW5ub3RhdGlvbkVkaXRvclN1Ym1pdCcsIHJlc29sdmUpXG4gICAgICByZWplY3QoKSBpZiBkZmQuc3RhdGUoKSBpcyAncGVuZGluZydcblxuICAgIGRmZC5wcm9taXNlKClcblxuICAjIFB1YmxpYzogTG9hZHMgdGhlIEBlZGl0b3Igd2l0aCB0aGUgcHJvdmlkZWQgYW5ub3RhdGlvbiBhbmQgdXBkYXRlcyBpdHNcbiAgIyBwb3NpdGlvbiBpbiB0aGUgd2luZG93LlxuICAjXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gdG8gbG9hZCBpbnRvIHRoZSBlZGl0b3IuXG4gICMgbG9jYXRpb24gICAtIFBvc2l0aW9uIHRvIHNldCB0aGUgRWRpdG9yIGluIHRoZSBmb3JtIHt0b3A6IHksIGxlZnQ6IHh9XG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBhbm5vdGF0b3Iuc2hvd0VkaXRvcih7dGV4dDogXCJteSBjb21tZW50XCJ9LCB7dG9wOiAzNCwgbGVmdDogMjM0fSlcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nLlxuICBzaG93RWRpdG9yOiAoYW5ub3RhdGlvbiwgbG9jYXRpb24pID0+XG4gICAgQGVkaXRvci5lbGVtZW50LmNzcyhsb2NhdGlvbilcbiAgICBAZWRpdG9yLmxvYWQoYW5ub3RhdGlvbilcbiAgICB0aGlzLnB1Ymxpc2goJ2Fubm90YXRpb25FZGl0b3JTaG93bicsIFtAZWRpdG9yLCBhbm5vdGF0aW9uXSlcbiAgICB0aGlzXG5cbiAgIyBDYWxsYmFjayBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIEBlZGl0b3IgZmlyZXMgdGhlIFwiaGlkZVwiIGV2ZW50LiBJdHNlbGZcbiAgIyBwdWJsaXNoZXMgdGhlICdhbm5vdGF0aW9uRWRpdG9ySGlkZGVuJyBldmVudCBhbmQgcmVzZXRzIHRoZSBAaWdub3JlTW91c2V1cFxuICAjIHByb3BlcnR5IHRvIGFsbG93IGxpc3RlbmluZyB0byBtb3VzZSBldmVudHMuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIG9uRWRpdG9ySGlkZTogPT5cbiAgICB0aGlzLnB1Ymxpc2goJ2Fubm90YXRpb25FZGl0b3JIaWRkZW4nLCBbQGVkaXRvcl0pXG4gICAgQGlnbm9yZU1vdXNldXAgPSBmYWxzZVxuXG4gICMgQ2FsbGJhY2sgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBAZWRpdG9yIGZpcmVzIHRoZSBcInNhdmVcIiBldmVudC4gSXRzZWxmXG4gICMgcHVibGlzaGVzIHRoZSAnYW5ub3RhdGlvbkVkaXRvclN1Ym1pdCcgZXZlbnQgYW5kIGNyZWF0ZXMvdXBkYXRlcyB0aGVcbiAgIyBlZGl0ZWQgYW5ub3RhdGlvbi5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgb25FZGl0b3JTdWJtaXQ6IChhbm5vdGF0aW9uKSA9PlxuICAgIHRoaXMucHVibGlzaCgnYW5ub3RhdGlvbkVkaXRvclN1Ym1pdCcsIFtAZWRpdG9yLCBhbm5vdGF0aW9uXSlcblxuICAjIFB1YmxpYzogTG9hZHMgdGhlIEB2aWV3ZXIgd2l0aCBhbiBBcnJheSBvZiBhbm5vdGF0aW9ucyBhbmQgcG9zaXRpb25zIGl0XG4gICMgYXQgdGhlIGxvY2F0aW9uIHByb3ZpZGVkLiBDYWxscyB0aGUgJ2Fubm90YXRpb25WaWV3ZXJTaG93bicgZXZlbnQuXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gQXJyYXkgb2YgYW5ub3RhdGlvbnMgdG8gbG9hZCBpbnRvIHRoZSB2aWV3ZXIuXG4gICMgbG9jYXRpb24gICAtIFBvc2l0aW9uIHRvIHNldCB0aGUgVmlld2VyIGluIHRoZSBmb3JtIHt0b3A6IHksIGxlZnQ6IHh9XG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBhbm5vdGF0b3Iuc2hvd1ZpZXdlcihcbiAgIyAgICBbe3RleHQ6IFwibXkgY29tbWVudFwifSwge3RleHQ6IFwibXkgb3RoZXIgY29tbWVudFwifV0sXG4gICMgICAge3RvcDogMzQsIGxlZnQ6IDIzNH0pXG4gICMgICApXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZy5cbiAgc2hvd1ZpZXdlcjogKGFubm90YXRpb25zLCBsb2NhdGlvbikgPT5cbiAgICBAdmlld2VyLmVsZW1lbnQuY3NzKGxvY2F0aW9uKVxuICAgIEB2aWV3ZXIubG9hZChhbm5vdGF0aW9ucylcblxuICAgIHRoaXMucHVibGlzaCgnYW5ub3RhdGlvblZpZXdlclNob3duJywgW0B2aWV3ZXIsIGFubm90YXRpb25zXSlcblxuICAjIEFubm90YXRvciNlbGVtZW50IGV2ZW50IGNhbGxiYWNrLiBBbGxvd3MgMjUwbXMgZm9yIG1vdXNlIHBvaW50ZXIgdG8gZ2V0IGZyb21cbiAgIyBhbm5vdGF0aW9uIGhpZ2hsaWdodCB0byBAdmlld2VyIHRvIG1hbmlwdWxhdGUgYW5ub3RhdGlvbnMuIElmIHRpbWVyIGV4cGlyZXNcbiAgIyB0aGUgQHZpZXdlciBpcyBoaWRkZW4uXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHN0YXJ0Vmlld2VySGlkZVRpbWVyOiA9PlxuICAgICMgRG9uJ3QgZG8gdGhpcyBpZiB0aW1lciBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBhbm90aGVyIGFubm90YXRpb24uXG4gICAgaWYgbm90IEB2aWV3ZXJIaWRlVGltZXJcbiAgICAgIEB2aWV3ZXJIaWRlVGltZXIgPSBzZXRUaW1lb3V0IEB2aWV3ZXIuaGlkZSwgMjUwXG5cbiAgIyBWaWV3ZXIjZWxlbWVudCBldmVudCBjYWxsYmFjay4gQ2xlYXJzIHRoZSB0aW1lciBzZXQgYnlcbiAgIyBBbm5vdGF0b3Ijc3RhcnRWaWV3ZXJIaWRlVGltZXIoKSB3aGVuIHRoZSBAdmlld2VyIGlzIG1vdXNlZCBvdmVyLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBjbGVhclZpZXdlckhpZGVUaW1lcjogKCkgPT5cbiAgICBjbGVhclRpbWVvdXQoQHZpZXdlckhpZGVUaW1lcilcbiAgICBAdmlld2VySGlkZVRpbWVyID0gZmFsc2VcblxuICAjIEFubm90YXRvciNlbGVtZW50IGNhbGxiYWNrLiBTZXRzIHRoZSBAbW91c2VJc0Rvd24gcHJvcGVydHkgdXNlZCB0b1xuICAjIGRldGVybWluZSBpZiBhIHNlbGVjdGlvbiBtYXkgaGF2ZSBzdGFydGVkIHRvIHRydWUuIEFsc28gY2FsbHNcbiAgIyBBbm5vdGF0b3Ijc3RhcnRWaWV3ZXJIaWRlVGltZXIoKSB0byBoaWRlIHRoZSBBbm5vdGF0b3Ijdmlld2VyLlxuICAjXG4gICMgZXZlbnQgLSBBIG1vdXNlZG93biBFdmVudCBvYmplY3QuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIGNoZWNrRm9yU3RhcnRTZWxlY3Rpb246IChldmVudCkgPT5cbiAgICB1bmxlc3MgZXZlbnQgYW5kIHRoaXMuaXNBbm5vdGF0b3IoZXZlbnQudGFyZ2V0KVxuICAgICAgdGhpcy5zdGFydFZpZXdlckhpZGVUaW1lcigpXG4gICAgQG1vdXNlSXNEb3duID0gdHJ1ZVxuXG4gICMgQW5ub3RhdG9yI2VsZW1lbnQgY2FsbGJhY2suIENoZWNrcyB0byBzZWUgaWYgYSBzZWxlY3Rpb24gaGFzIGJlZW4gbWFkZVxuICAjIG9uIG1vdXNldXAgYW5kIGlmIHNvIGRpc3BsYXlzIHRoZSBBbm5vdGF0b3IjYWRkZXIuIElmIEBpZ25vcmVNb3VzZXVwIGlzXG4gICMgc2V0IHdpbGwgZG8gbm90aGluZy4gQWxzbyByZXNldHMgdGhlIEBtb3VzZUlzRG93biBwcm9wZXJ0eS5cbiAgI1xuICAjIGV2ZW50IC0gQSBtb3VzZXVwIEV2ZW50IG9iamVjdC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgY2hlY2tGb3JFbmRTZWxlY3Rpb246IChldmVudCkgPT5cbiAgICBAbW91c2VJc0Rvd24gPSBmYWxzZVxuXG4gICAgIyBUaGlzIHByZXZlbnRzIHRoZSBub3RlIGltYWdlIGZyb20ganVtcGluZyBhd2F5IG9uIHRoZSBtb3VzZXVwXG4gICAgIyBvZiBhIGNsaWNrIG9uIGljb24uXG4gICAgaWYgQGlnbm9yZU1vdXNldXBcbiAgICAgIHJldHVyblxuXG4gICAgIyBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByYW5nZXMuXG4gICAgQHNlbGVjdGVkUmFuZ2VzID0gdGhpcy5nZXRTZWxlY3RlZFJhbmdlcygpXG5cbiAgICBmb3IgcmFuZ2UgaW4gQHNlbGVjdGVkUmFuZ2VzXG4gICAgICBjb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvclxuICAgICAgaWYgJChjb250YWluZXIpLmhhc0NsYXNzKCdhbm5vdGF0b3ItaGwnKVxuICAgICAgICBjb250YWluZXIgPSAkKGNvbnRhaW5lcikucGFyZW50cygnW2NsYXNzIT1hbm5vdGF0b3ItaGxdJylbMF1cbiAgICAgIHJldHVybiBpZiB0aGlzLmlzQW5ub3RhdG9yKGNvbnRhaW5lcilcblxuICAgIGlmIGV2ZW50IGFuZCBAc2VsZWN0ZWRSYW5nZXMubGVuZ3RoXG4gICAgICBAYWRkZXJcbiAgICAgICAgLmNzcyhVdGlsLm1vdXNlUG9zaXRpb24oZXZlbnQsIEB3cmFwcGVyWzBdKSlcbiAgICAgICAgLnNob3coKVxuICAgIGVsc2VcbiAgICAgIEBhZGRlci5oaWRlKClcblxuICAjIFB1YmxpYzogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvdmlkZWQgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSBhbm5vdGF0b3IgcGx1Z2luLlxuICAjIFVzZWZ1bCBmb3IgaWdub3JpbmcgbW91c2UgYWN0aW9ucyBvbiB0aGUgYW5ub3RhdG9yIGVsZW1lbnRzLlxuICAjIE5PVEU6IFRoZSBAd3JhcHBlciBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBjaGVjay5cbiAgI1xuICAjIGVsZW1lbnQgLSBBbiBFbGVtZW50IG9yIFRleHROb2RlIHRvIGNoZWNrLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuICAjICAgYW5ub3RhdG9yLmlzQW5ub3RhdG9yKHNwYW4pICMgPT4gUmV0dXJucyBmYWxzZVxuICAjXG4gICMgICBhbm5vdGF0b3IuaXNBbm5vdGF0b3IoYW5ub3RhdG9yLnZpZXdlci5lbGVtZW50KSAjID0+IFJldHVybnMgdHJ1ZVxuICAjXG4gICMgUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIGEgY2hpbGQgb2YgYW4gYW5ub3RhdG9yIGVsZW1lbnQuXG4gIGlzQW5ub3RhdG9yOiAoZWxlbWVudCkgLT5cbiAgICAhISQoZWxlbWVudCkucGFyZW50cygpLmFkZEJhY2soKS5maWx0ZXIoJ1tjbGFzc149YW5ub3RhdG9yLV0nKS5ub3QoQHdyYXBwZXIpLmxlbmd0aFxuXG4gIGNvbmZpZ3VyZTogKEByZWdpc3RyeSkgLT5cbiAgICByZWdpc3RyeS5pbmNsdWRlKEFubm90YXRpb25Qcm92aWRlcilcblxuICBydW46IChAcmVnaXN0cnkpIC0+XG4gICAgIyBTZXQgdXAgdGhlIGNvcmUgaW50ZXJmYWNlIGNvbXBvbmVudHNcbiAgICB0aGlzLl9zZXR1cERvY3VtZW50RXZlbnRzKCkgdW5sZXNzIEBvcHRpb25zLnJlYWRPbmx5XG4gICAgdGhpcy5fc2V0dXBXcmFwcGVyKCkuX3NldHVwVmlld2VyKCkuX3NldHVwRWRpdG9yKClcbiAgICB0aGlzLl9zZXR1cER5bmFtaWNTdHlsZSgpXG5cbiAgICAjIENyZWF0ZSBhZGRlclxuICAgIHRoaXMuYWRkZXIgPSAkKHRoaXMuaHRtbC5hZGRlcikuYXBwZW5kVG8oQHdyYXBwZXIpLmhpZGUoKVxuXG4gICAgIyBEbyBpbml0aWFsIGxvYWRcbiAgICBpZiBAb3B0aW9ucy5sb2FkUXVlcnkgdGhlbiB0aGlzLmxvYWQoQG9wdGlvbnMubG9hZFF1ZXJ5KVxuXG4gICMgQW5ub3RhdG9yI2VsZW1lbnQgY2FsbGJhY2suIERpc3BsYXlzIHZpZXdlciB3aXRoIGFsbCBhbm5vdGF0aW9uc1xuICAjIGFzc29jaWF0ZWQgd2l0aCBoaWdobGlnaHQgRWxlbWVudHMgdW5kZXIgdGhlIGN1cnNvci5cbiAgI1xuICAjIGV2ZW50IC0gQSBtb3VzZW92ZXIgRXZlbnQgb2JqZWN0LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBvbkhpZ2hsaWdodE1vdXNlb3ZlcjogKGV2ZW50KSA9PlxuICAgICMgQ2FuY2VsIGFueSBwZW5kaW5nIGhpZGluZyBvZiB0aGUgdmlld2VyLlxuICAgIHRoaXMuY2xlYXJWaWV3ZXJIaWRlVGltZXIoKVxuXG4gICAgIyBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSBtYWtpbmcgYSBzZWxlY3Rpb24gb3JcbiAgICAjIGFscmVhZHkgZGlzcGxheWluZyB0aGUgdmlld2VyXG4gICAgcmV0dXJuIGZhbHNlIGlmIEBtb3VzZUlzRG93biBvciBAdmlld2VyLmlzU2hvd24oKVxuXG4gICAgYW5ub3RhdGlvbnMgPSAkKGV2ZW50LnRhcmdldClcbiAgICAgIC5wYXJlbnRzKCcuYW5ub3RhdG9yLWhsJylcbiAgICAgIC5hZGRCYWNrKClcbiAgICAgIC5tYXAgLT4gcmV0dXJuICQodGhpcykuZGF0YShcImFubm90YXRpb25cIilcblxuICAgIHRoaXMuc2hvd1ZpZXdlcigkLm1ha2VBcnJheShhbm5vdGF0aW9ucyksIFV0aWwubW91c2VQb3NpdGlvbihldmVudCwgQHdyYXBwZXJbMF0pKVxuXG4gICMgQW5ub3RhdG9yI2VsZW1lbnQgY2FsbGJhY2suIFNldHMgQGlnbm9yZU1vdXNldXAgdG8gdHJ1ZSB0byBwcmV2ZW50XG4gICMgdGhlIGFubm90YXRpb24gc2VsZWN0aW9uIGV2ZW50cyBmaXJpbmcgd2hlbiB0aGUgYWRkZXIgaXMgY2xpY2tlZC5cbiAgI1xuICAjIGV2ZW50IC0gQSBtb3VzZWRvd24gRXZlbnQgb2JqZWN0XG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIG9uQWRkZXJNb3VzZWRvd246IChldmVudCkgPT5cbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKVxuICAgIEBpZ25vcmVNb3VzZXVwID0gdHJ1ZVxuXG4gICMgQW5ub3RhdG9yI2VsZW1lbnQgY2FsbGJhY2suIERpc3BsYXlzIHRoZSBAZWRpdG9yIGluIHBsYWNlIG9mIHRoZSBAYWRkZXIgYW5kXG4gICMgbG9hZHMgaW4gYSBuZXdseSBjcmVhdGVkIGFubm90YXRpb24gT2JqZWN0LiBUaGUgY2xpY2sgZXZlbnQgaXMgdXNlZCBhcyB3ZWxsXG4gICMgYXMgdGhlIG1vdXNlZG93biBzbyB0aGF0IHdlIGdldCB0aGUgOmFjdGl2ZSBzdGF0ZSBvbiB0aGUgQGFkZGVyIHdoZW4gY2xpY2tlZFxuICAjXG4gICMgZXZlbnQgLSBBIG1vdXNlZG93biBFdmVudCBvYmplY3RcbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgb25BZGRlckNsaWNrOiAoZXZlbnQpID0+XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KClcblxuICAgICMgSGlkZSB0aGUgYWRkZXJcbiAgICBwb3NpdGlvbiA9IEBhZGRlci5wb3NpdGlvbigpXG4gICAgQGFkZGVyLmhpZGUoKVxuICAgIGFubm90YXRpb24gPSB7cmFuZ2VzOiBAc2VsZWN0ZWRSYW5nZXN9XG5cbiAgICAkLndoZW4oYW5ub3RhdGlvbilcblxuICAgICAgLmRvbmUgKGFubm90YXRpb24pID0+XG4gICAgICAgIHRoaXMucHVibGlzaCgnYmVmb3JlQW5ub3RhdGlvbkNyZWF0ZWQnLCBbYW5ub3RhdGlvbl0pXG5cbiAgICAgICMgU2V0IHVwIHRoZSBhbm5vdGF0aW9uXG4gICAgICAudGhlbiAoYW5ub3RhdGlvbikgPT5cbiAgICAgICAgdGhpcy5zZXR1cEFubm90YXRpb24oYW5ub3RhdGlvbilcblxuICAgICAgIyBTaG93IGEgdGVtcG9yYXJ5IGhpZ2hsaWdodCBzbyB0aGUgdXNlciBjYW4gc2VlIHdoYXQgdGhleSBzZWxlY3RlZFxuICAgICAgLmRvbmUgKGFubm90YXRpb24pID0+XG4gICAgICAgICQoYW5ub3RhdGlvbi5fbG9jYWwuaGlnaGxpZ2h0cykuYWRkQ2xhc3MoJ2Fubm90YXRvci1obC10ZW1wb3JhcnknKVxuXG4gICAgICAjIEVkaXQgdGhlIGFubm90YXRpb25cbiAgICAgIC50aGVuIChhbm5vdGF0aW9uKSA9PlxuICAgICAgICB0aGlzLmVkaXRBbm5vdGF0aW9uKGFubm90YXRpb24sIHBvc2l0aW9uKVxuICAgICAgLnRoZW4gKGFubm90YXRpb24pID0+XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnMuY3JlYXRlKGFubm90YXRpb24pXG4gICAgICAgICAgIyBIYW5kbGUgc3RvcmFnZSBlcnJvcnNcbiAgICAgICAgICAuZmFpbChoYW5kbGVFcnJvcilcblxuICAgICAgIyBDbGVhbiB1cCB0aGUgaGlnaGxpZ2h0c1xuICAgICAgLmRvbmUgKGFubm90YXRpb24pID0+XG4gICAgICAgICQoYW5ub3RhdGlvbi5fbG9jYWwuaGlnaGxpZ2h0cykucmVtb3ZlQ2xhc3MoJ2Fubm90YXRvci1obC10ZW1wb3JhcnknKVxuXG4gICAgICAuZG9uZSAoYW5ub3RhdGlvbikgPT5cbiAgICAgICAgdGhpcy5wdWJsaXNoKCdhbm5vdGF0aW9uQ3JlYXRlZCcsIFthbm5vdGF0aW9uXSlcblxuICAgICAgIyBDbGVhbiB1cCAoaWYsIGZvciBleGFtcGxlLCBlZGl0aW5nIHdhcyBjYW5jZWxsZWQsIG9yIHN0b3JhZ2UgZmFpbGVkKVxuICAgICAgLmZhaWwodGhpcy5jbGVhbnVwQW5ub3RhdGlvbilcblxuICAjIEFubm90YXRvciN2aWV3ZXIgY2FsbGJhY2sgZnVuY3Rpb24uIERpc3BsYXlzIHRoZSBBbm5vdGF0b3IjZWRpdG9yIGluIHRoZVxuICAjIHBvc2l0aW9ucyBvZiB0aGUgQW5ub3RhdG9yI3ZpZXdlciBhbmQgbG9hZHMgdGhlIHBhc3NlZCBhbm5vdGF0aW9uIGZvclxuICAjIGVkaXRpbmcuXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBPYmplY3QgZm9yIGVkaXRpbmcuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIG9uRWRpdEFubm90YXRpb246IChhbm5vdGF0aW9uKSA9PlxuICAgIHBvc2l0aW9uID0gQHZpZXdlci5lbGVtZW50LnBvc2l0aW9uKClcbiAgICBAdmlld2VyLmhpZGUoKVxuXG4gICAgJC53aGVuKGFubm90YXRpb24pXG5cbiAgICAgIC5kb25lIChhbm5vdGF0aW9uKSA9PlxuICAgICAgICB0aGlzLnB1Ymxpc2goJ2JlZm9yZUFubm90YXRpb25VcGRhdGVkJywgW2Fubm90YXRpb25dKVxuXG4gICAgICAudGhlbiAoYW5ub3RhdGlvbikgPT5cbiAgICAgICAgdGhpcy5lZGl0QW5ub3RhdGlvbihhbm5vdGF0aW9uLCBwb3NpdGlvbilcbiAgICAgIC50aGVuIChhbm5vdGF0aW9uKSA9PlxuICAgICAgICB0aGlzLmFubm90YXRpb25zLnVwZGF0ZShhbm5vdGF0aW9uKVxuICAgICAgICAgICMgSGFuZGxlIHN0b3JhZ2UgZXJyb3JzXG4gICAgICAgICAgLmZhaWwoaGFuZGxlRXJyb3IpXG5cbiAgICAgIC5kb25lIChhbm5vdGF0aW9uKSA9PlxuICAgICAgICB0aGlzLnB1Ymxpc2goJ2Fubm90YXRpb25VcGRhdGVkJywgW2Fubm90YXRpb25dKVxuXG4jIENyZWF0ZSBuYW1lc3BhY2UgZm9yIEFubm90YXRvciBwbHVnaW5zXG5jbGFzcyBBbm5vdGF0b3IuUGx1Z2luIGV4dGVuZHMgRGVsZWdhdG9yXG4gIGNvbnN0cnVjdG9yOiAoZWxlbWVudCwgb3B0aW9ucykgLT5cbiAgICBzdXBlclxuXG4gIHBsdWdpbkluaXQ6IC0+XG5cbiAgZGVzdHJveTogLT5cbiAgICB0aGlzLnJlbW92ZUV2ZW50cygpXG5cbiMgU25pZmYgdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQgYW5kIGF0dGVtcHQgdG8gYWRkIG1pc3NpbmcgZnVuY3Rpb25hbGl0eS5cbmcgPSBVdGlsLmdldEdsb2JhbCgpXG5cbmlmIG5vdCBnLmRvY3VtZW50Py5ldmFsdWF0ZT9cbiAgJC5nZXRTY3JpcHQoJ2h0dHA6Ly9hc3NldHMuYW5ub3RhdGVpdC5vcmcvdmVuZG9yL3hwYXRoLm1pbi5qcycpXG5cbmlmIG5vdCBnLmdldFNlbGVjdGlvbj9cbiAgJC5nZXRTY3JpcHQoJ2h0dHA6Ly9hc3NldHMuYW5ub3RhdGVpdC5vcmcvdmVuZG9yL2llcmFuZ2UubWluLmpzJylcblxuaWYgbm90IGcuSlNPTj9cbiAgJC5nZXRTY3JpcHQoJ2h0dHA6Ly9hc3NldHMuYW5ub3RhdGVpdC5vcmcvdmVuZG9yL2pzb24yLm1pbi5qcycpXG5cbiMgRW5zdXJlIHRoZSBOb2RlIGNvbnN0YW50cyBhcmUgZGVmaW5lZFxuaWYgbm90IGcuTm9kZT9cbiAgZy5Ob2RlID1cbiAgICBFTEVNRU5UX05PREUgICAgICAgICAgICAgICAgOiAgMVxuICAgIEFUVFJJQlVURV9OT0RFICAgICAgICAgICAgICA6ICAyXG4gICAgVEVYVF9OT0RFICAgICAgICAgICAgICAgICAgIDogIDNcbiAgICBDREFUQV9TRUNUSU9OX05PREUgICAgICAgICAgOiAgNFxuICAgIEVOVElUWV9SRUZFUkVOQ0VfTk9ERSAgICAgICA6ICA1XG4gICAgRU5USVRZX05PREUgICAgICAgICAgICAgICAgIDogIDZcbiAgICBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiAgN1xuICAgIENPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICA6ICA4XG4gICAgRE9DVU1FTlRfTk9ERSAgICAgICAgICAgICAgIDogIDlcbiAgICBET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgOiAxMFxuICAgIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICA6IDExXG4gICAgTk9UQVRJT05fTk9ERSAgICAgICAgICAgICAgIDogMTJcblxuXG4jIEV4cG9ydCBvdGhlciBtb2R1bGVzIGZvciB1c2UgaW4gcGx1Z2lucy5cbkFubm90YXRvci5EZWxlZ2F0b3IgPSBEZWxlZ2F0b3JcbkFubm90YXRvci5SYW5nZSA9IFJhbmdlXG5Bbm5vdGF0b3IuVXRpbCA9IFV0aWxcbkFubm90YXRvci5XaWRnZXQgPSBXaWRnZXRcbkFubm90YXRvci5WaWV3ZXIgPSBWaWV3ZXJcbkFubm90YXRvci5FZGl0b3IgPSBFZGl0b3JcbkFubm90YXRvci5Ob3RpZmljYXRpb24gPSBOb3RpZmljYXRpb25cblxuIyBBdHRhY2ggbm90aWZpY2F0aW9uIG1ldGhvZHMgdG8gdGhlIEFubm90YXRpb24gb2JqZWN0XG5ub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uXG5Bbm5vdGF0b3Iuc2hvd05vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbi5zaG93XG5Bbm5vdGF0b3IuaGlkZU5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbi5oaWRlXG5cbiMgRXhwb3NlIGEgZ2xvYmFsIGluc3RhbmNlIHJlZ2lzdHJ5XG5Bbm5vdGF0b3IuX2luc3RhbmNlcyA9IFtdXG5cbiMgQmluZCBnZXR0ZXh0IGhlbHBlciBzbyBwbHVnaW5zIGNhbiB1c2UgbG9jYWxpc2F0aW9uLlxuQW5ub3RhdG9yLl90ID0gX3RcblxuIyBSZXR1cm5zIHRydWUgaWYgdGhlIEFubm90YXRvciBjYW4gYmUgdXNlZCBpbiB0aGUgY3VycmVudCBicm93c2VyLlxuQW5ub3RhdG9yLnN1cHBvcnRlZCA9IC0+ICgtPiAhIXRoaXMuZ2V0U2VsZWN0aW9uKSgpXG5cbiMgUmVzdG9yZXMgdGhlIEFubm90YXRvciBwcm9wZXJ0eSBvbiB0aGUgZ2xvYmFsIG9iamVjdCB0byBpdCdzXG4jIHByZXZpb3VzIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBBbm5vdGF0b3IuXG5Bbm5vdGF0b3Iubm9Db25mbGljdCA9IC0+XG4gIFV0aWwuZ2V0R2xvYmFsKCkuQW5ub3RhdG9yID0gX0Fubm90YXRvclxuICB0aGlzXG5cbiMgQ3JlYXRlIGdsb2JhbCBhY2Nlc3MgZm9yIEFubm90YXRvclxuJC5mbi5hbm5vdGF0b3IgPSAob3B0aW9ucykgLT5cbiAgYXJncyA9IEFycmF5OjpzbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcbiAgdGhpcy5lYWNoIC0+XG4gICAgIyBjaGVjayB0aGUgZGF0YSgpIGNhY2hlLCBpZiBpdCdzIHRoZXJlIHdlJ2xsIGNhbGwgdGhlIG1ldGhvZCByZXF1ZXN0ZWRcbiAgICBpbnN0YW5jZSA9ICQuZGF0YSh0aGlzLCAnYW5ub3RhdG9yJylcbiAgICBpZiBpbnN0YW5jZVxuICAgICAgb3B0aW9ucyAmJiBpbnN0YW5jZVtvcHRpb25zXS5hcHBseShpbnN0YW5jZSwgYXJncylcbiAgICBlbHNlXG4gICAgICBpbnN0YW5jZSA9IG5ldyBBbm5vdGF0b3IodGhpcywgb3B0aW9ucylcbiAgICAgICQuZGF0YSh0aGlzLCAnYW5ub3RhdG9yJywgaW5zdGFuY2UpXG5cblxuIyBFeHBvcnQgQW5ub3RhdG9yIG9iamVjdC5cbm1vZHVsZS5leHBvcnRzID0gQW5ub3RhdG9yXG4iLCJVdGlsID0gcmVxdWlyZSAnLi91dGlsJ1xuXG5cbiMgUHVibGljOiBEZWxlZ2F0b3IgaXMgdGhlIGJhc2UgY2xhc3MgdGhhdCBhbGwgb2YgQW5ub3RhdG9ycyBvYmplY3RzIGluaGVyaXRcbiMgZnJvbS4gSXQgcHJvdmlkZXMgYmFzaWMgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIGluc3RhbmNlIG9wdGlvbnMsIGV2ZW50XG4jIGRlbGVnYXRpb24gYW5kIHB1Yi9zdWIgbWV0aG9kcy5cbmNsYXNzIERlbGVnYXRvclxuICAjIFB1YmxpYzogRXZlbnRzIG9iamVjdC4gVGhpcyBjb250YWlucyBhIGtleS9wYWlyIGhhc2ggb2YgZXZlbnRzL21ldGhvZHMgdGhhdFxuICAjIHNob3VsZCBiZSBib3VuZC4gU2VlIERlbGVnYXRvciNhZGRFdmVudHMoKSBmb3IgdXNhZ2UuXG4gIGV2ZW50czoge31cblxuICAjIFB1YmxpYzogT3B0aW9ucyBvYmplY3QuIEV4dGVuZGVkIG9uIGluaXRpYWxpc2F0aW9uLlxuICBvcHRpb25zOiB7fVxuXG4gICMgQSBqUXVlcnkgb2JqZWN0IHdyYXBwaW5nIHRoZSBET00gRWxlbWVudCBwcm92aWRlZCBvbiBpbml0aWFsaXNhdGlvbi5cbiAgZWxlbWVudDogbnVsbFxuXG4gICMgUHVibGljOiBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGluc3RhbmNlLiBCaW5kcyB0aGUgQGV2ZW50c1xuICAjIGhhc2ggYW5kIGV4dGVuZHMgdGhlIEBvcHRpb25zIG9iamVjdC5cbiAgI1xuICAjIGVsZW1lbnQgLSBUaGUgRE9NIGVsZW1lbnQgdGhhdCB0aGlzIGludGFuY2UgcmVwcmVzZW50cy5cbiAgIyBvcHRpb25zIC0gQW4gT2JqZWN0IGxpdGVyYWwgb2Ygb3B0aW9ucy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGVsZW1lbnQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215LWVsZW1lbnQnKVxuICAjICAgaW5zdGFuY2UgPSBuZXcgRGVsZWdhdG9yKGVsZW1lbnQsIHtcbiAgIyAgICAgb3B0aW9uOiAnbXktb3B0aW9uJ1xuICAjICAgfSlcbiAgI1xuICAjIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgRGVsZWdhdG9yLlxuICBjb25zdHJ1Y3RvcjogKGVsZW1lbnQsIG9wdGlvbnMpIC0+XG4gICAgQG9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgQG9wdGlvbnMsIG9wdGlvbnMpXG4gICAgQGVsZW1lbnQgPSAkKGVsZW1lbnQpXG5cbiAgICAjIERlbGVnYXRvciBjcmVhdGVzIGNsb3N1cmVzIGZvciBlYWNoIGV2ZW50IGl0IGJpbmRzLiBUaGlzIGlzIGEgcHJpdmF0ZVxuICAgICMgcmVnaXN0cnkgb2YgY3JlYXRlZCBjbG9zdXJlcywgdXNlZCB0byBlbmFibGUgZXZlbnQgdW5iaW5kaW5nLlxuICAgIEBfY2xvc3VyZXMgPSB7fVxuXG4gICAgdGhpcy5hZGRFdmVudHMoKVxuXG4gICMgUHVibGljOiBiaW5kcyB0aGUgZnVuY3Rpb24gbmFtZXMgaW4gdGhlIEBldmVudHMgT2JqZWN0IHRvIHRoZWlyIGV2ZW50cy5cbiAgI1xuICAjIFRoZSBAZXZlbnRzIE9iamVjdCBzaG91bGQgYmUgYSBzZXQgb2Yga2V5L3ZhbHVlIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlXG4gICMgZXZlbnQgbmFtZSB3aXRoIG9wdGlvbmFsIENTUyBzZWxlY3Rvci4gVGhlIHZhbHVlIHNob3VsZCBiZSBhIFN0cmluZyBtZXRob2RcbiAgIyBuYW1lIG9uIHRoZSBjdXJyZW50IGNsYXNzLlxuICAjXG4gICMgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGRlZmF1bHQgRGVsZWdhdG9yIGNvbnN0cnVjdG9yIGFuZCBzbyBzaG91bGRuJ3QgdXN1YWxseVxuICAjIG5lZWQgdG8gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBUaGlzIHdpbGwgYmluZCB0aGUgY2xpY2tlZEVsZW1lbnQoKSBtZXRob2QgdG8gdGhlIGNsaWNrIGV2ZW50IG9uIEBlbGVtZW50LlxuICAjICAgQG9wdGlvbnMgPSB7XCJjbGlja1wiOiBcImNsaWNrZWRFbGVtZW50XCJ9XG4gICNcbiAgIyAgICMgVGhpcyB3aWxsIGRlbGVnYXRlIHRoZSBzdWJtaXRGb3JtKCkgbWV0aG9kIHRvIHRoZSBzdWJtaXQgZXZlbnQgb24gdGhlXG4gICMgICAjIGZvcm0gd2l0aGluIHRoZSBAZWxlbWVudC5cbiAgIyAgIEBvcHRpb25zID0ge1wiZm9ybSBzdWJtaXRcIjogXCJzdWJtaXRGb3JtXCJ9XG4gICNcbiAgIyAgICMgVGhpcyB3aWxsIGJpbmQgdGhlIHVwZGF0ZUFubm90YXRpb25TdG9yZSgpIG1ldGhvZCB0byB0aGUgY3VzdG9tXG4gICMgICAjIGFubm90YXRpb246c2F2ZSBldmVudC4gTk9URTogQmVjYXVzZSB0aGlzIGlzIGEgY3VzdG9tIGV2ZW50IHRoZVxuICAjICAgIyBEZWxlZ2F0b3Ijc3Vic2NyaWJlKCkgbWV0aG9kIHdpbGwgYmUgdXNlZCBhbmQgdXBkYXRlQW5ub3RhdGlvblN0b3JlKClcbiAgIyAgICMgd2lsbCBub3QgcmVjaWV2ZSBhbiBldmVudCBwYXJhbWV0ZXIgbGlrZSB0aGUgcHJldmlvdXMgdHdvIGV4YW1wbGVzLlxuICAjICAgQG9wdGlvbnMgPSB7XCJhbm5vdGF0aW9uOnNhdmVcIjogXCJ1cGRhdGVBbm5vdGF0aW9uU3RvcmVcIn1cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgYWRkRXZlbnRzOiAtPlxuICAgIGZvciBldmVudCBpbiBEZWxlZ2F0b3IuX3BhcnNlRXZlbnRzKEBldmVudHMpXG4gICAgICB0aGlzLl9hZGRFdmVudChldmVudC5zZWxlY3RvciwgZXZlbnQuZXZlbnQsIGV2ZW50LmZ1bmN0aW9uTmFtZSlcblxuICAjIFB1YmxpYzogdW5iaW5kcyBmdW5jdGlvbnMgcHJldmlvdXNseSBib3VuZCB0byBldmVudHMgYnkgYWRkRXZlbnRzKCkuXG4gICNcbiAgIyBUaGUgQGV2ZW50cyBPYmplY3Qgc2hvdWxkIGJlIGEgc2V0IG9mIGtleS92YWx1ZSBwYWlycyB3aGVyZSB0aGUga2V5IGlzIHRoZVxuICAjIGV2ZW50IG5hbWUgd2l0aCBvcHRpb25hbCBDU1Mgc2VsZWN0b3IuIFRoZSB2YWx1ZSBzaG91bGQgYmUgYSBTdHJpbmcgbWV0aG9kXG4gICMgbmFtZSBvbiB0aGUgY3VycmVudCBjbGFzcy5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgcmVtb3ZlRXZlbnRzOiAtPlxuICAgIGZvciBldmVudCBpbiBEZWxlZ2F0b3IuX3BhcnNlRXZlbnRzKEBldmVudHMpXG4gICAgICB0aGlzLl9yZW1vdmVFdmVudChldmVudC5zZWxlY3RvciwgZXZlbnQuZXZlbnQsIGV2ZW50LmZ1bmN0aW9uTmFtZSlcblxuICAjIEJpbmRzIGFuIGV2ZW50IHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gcmVwcmVzZW50ZWQgYnkgYSBTdHJpbmcuIEEgc2VsZWN0b3JcbiAgIyBjYW4gYmUgcHJvdmlkZWQgaW4gb3JkZXIgdG8gd2F0Y2ggZm9yIGV2ZW50cyBvbiBhIGNoaWxkIGVsZW1lbnQuXG4gICNcbiAgIyBUaGUgZXZlbnQgY2FuIGJlIGFueSBzdGFuZGFyZCBldmVudCBzdXBwb3J0ZWQgYnkgalF1ZXJ5IG9yIGEgY3VzdG9tIFN0cmluZy5cbiAgIyBJZiBhIGN1c3RvbSBzdHJpbmcgaXMgdXNlZCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBub3QgcmVjZWl2ZSBhbiBldmVudFxuICAjIG9iamVjdCBhcyBpdHMgZmlyc3QgcGFyYW1ldGVyLlxuICAjXG4gICMgc2VsZWN0b3IgICAgIC0gU2VsZWN0b3IgU3RyaW5nIG1hdGNoaW5nIGNoaWxkIGVsZW1lbnRzLiAoZGVmYXVsdDogJycpXG4gICMgZXZlbnQgICAgICAgIC0gVGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuXG4gICMgZnVuY3Rpb25OYW1lIC0gQSBTdHJpbmcgZnVuY3Rpb24gbmFtZSB0byBiaW5kIHRvIHRoZSBldmVudC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgTGlzdGVucyBmb3IgYWxsIGNsaWNrIGV2ZW50cyBvbiBpbnN0YW5jZS5lbGVtZW50LlxuICAjICAgaW5zdGFuY2UuX2FkZEV2ZW50KCcnLCAnY2xpY2snLCAnb25DbGljaycpXG4gICNcbiAgIyAgICMgRGVsZWdhdGVzIHRoZSBpbnN0YW5jZS5vbklucHV0Rm9jdXMoKSBtZXRob2QgdG8gZm9jdXMgZXZlbnRzIG9uIGFsbFxuICAjICAgIyBmb3JtIGlucHV0cyB3aXRoaW4gaW5zdGFuY2UuZWxlbWVudC5cbiAgIyAgIGluc3RhbmNlLl9hZGRFdmVudCgnZm9ybSA6aW5wdXQnLCAnZm9jdXMnLCAnb25JbnB1dEZvY3VzJylcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmLlxuICBfYWRkRXZlbnQ6IChzZWxlY3RvciwgZXZlbnQsIGZ1bmN0aW9uTmFtZSkgLT5cbiAgICBjbG9zdXJlID0gPT4gdGhpc1tmdW5jdGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuICAgIGlmIHNlbGVjdG9yID09ICcnIGFuZCBEZWxlZ2F0b3IuX2lzQ3VzdG9tRXZlbnQoZXZlbnQpXG4gICAgICB0aGlzLnN1YnNjcmliZShldmVudCwgY2xvc3VyZSlcbiAgICBlbHNlXG4gICAgICBAZWxlbWVudC5kZWxlZ2F0ZShzZWxlY3RvciwgZXZlbnQsIGNsb3N1cmUpXG5cbiAgICBAX2Nsb3N1cmVzW1wiI3tzZWxlY3Rvcn0vI3tldmVudH0vI3tmdW5jdGlvbk5hbWV9XCJdID0gY2xvc3VyZVxuXG4gICAgdGhpc1xuXG4gICMgVW5iaW5kcyBhIGZ1bmN0aW9uIHByZXZpb3VzbHkgYm91bmQgdG8gYW4gZXZlbnQgYnkgdGhlIF9hZGRFdmVudCBtZXRob2QuXG4gICNcbiAgIyBUYWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgYXMgX2FkZEV2ZW50KCksIGFuZCBhbiBldmVudCB3aWxsIG9ubHkgYmVcbiAgIyBzdWNjZXNzZnVsbHkgdW5ib3VuZCBpZiB0aGUgYXJndW1lbnRzIHRvIHJlbW92ZUV2ZW50KCkgYXJlIGV4YWN0bHkgdGhlIHNhbWVcbiAgIyBhcyB0aGUgb3JpZ2luYWwgYXJndW1lbnRzIHRvIF9hZGRFdmVudCgpLiBUaGlzIHdvdWxkIHVzdWFsbHkgYmUgY2FsbGVkIGJ5XG4gICMgX3JlbW92ZUV2ZW50cygpLlxuICAjXG4gICMgc2VsZWN0b3IgICAgIC0gU2VsZWN0b3IgU3RyaW5nIG1hdGNoaW5nIGNoaWxkIGVsZW1lbnRzLiAoZGVmYXVsdDogJycpXG4gICMgZXZlbnQgICAgICAgIC0gVGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuXG4gICMgZnVuY3Rpb25OYW1lIC0gQSBTdHJpbmcgZnVuY3Rpb24gbmFtZSB0byBiaW5kIHRvIHRoZSBldmVudC5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmLlxuICBfcmVtb3ZlRXZlbnQ6IChzZWxlY3RvciwgZXZlbnQsIGZ1bmN0aW9uTmFtZSkgLT5cbiAgICBjbG9zdXJlID0gQF9jbG9zdXJlc1tcIiN7c2VsZWN0b3J9LyN7ZXZlbnR9LyN7ZnVuY3Rpb25OYW1lfVwiXVxuXG4gICAgaWYgc2VsZWN0b3IgPT0gJycgYW5kIERlbGVnYXRvci5faXNDdXN0b21FdmVudChldmVudClcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoZXZlbnQsIGNsb3N1cmUpXG4gICAgZWxzZVxuICAgICAgQGVsZW1lbnQudW5kZWxlZ2F0ZShzZWxlY3RvciwgZXZlbnQsIGNsb3N1cmUpXG5cbiAgICBkZWxldGUgQF9jbG9zdXJlc1tcIiN7c2VsZWN0b3J9LyN7ZXZlbnR9LyN7ZnVuY3Rpb25OYW1lfVwiXVxuXG4gICAgdGhpc1xuXG4gICMgUHVibGljOiBGaXJlcyBhbiBldmVudCBhbmQgY2FsbHMgYWxsIHN1YnNjcmliZWQgY2FsbGJhY2tzIHdpdGggcGFyYW1ldGVyc1xuICAjIHByb3ZpZGVkLiBUaGlzIGlzIGVzc2VudGlhbGx5IGFuIGFsaWFzIHRvIEJhY2tib25lLkV2ZW50cyAudHJpZ2dlcigpXG4gICMgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIGFuIEFycmF5IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICMgcmF0aGVyIHRoYW4gdXNpbmcgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLlxuICBwdWJsaXNoOiAobmFtZSwgYXJncz1bXSkgLT5cbiAgICB0aGlzLnRyaWdnZXIuYXBwbHkodGhpcywgW25hbWUsIGFyZ3MuLi5dKVxuXG4gICMgUHVibGljOiBBbiBhbGlhcyBmb3IgLm9uKCkgZnJvbSBCYWNrYm9uZS5FdmVudHNcbiAgc3Vic2NyaWJlOiAoZXZlbnQsIGNhbGxiYWNrLCBjb250ZXh0PXRoaXMpIC0+XG4gICAgdGhpcy5vbihldmVudCwgY2FsbGJhY2ssIGNvbnRleHQpXG5cbiAgIyBQdWJsaWM6IEFuIGFsaWFzIGZvciAub2ZmKCkgZnJvbSBCYWNrYm9uZS5FdmVudHNcbiAgdW5zdWJzY3JpYmU6IChldmVudCwgY2FsbGJhY2ssIGNvbnRleHQ9dGhpcykgLT5cbiAgICB0aGlzLm9mZihldmVudCwgY2FsbGJhY2ssIGNvbnRleHQpXG5cblxuIyBQYXJzZSB0aGUgQGV2ZW50cyBvYmplY3Qgb2YgYSBEZWxlZ2F0b3IgaW50byBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmdcbiMgc3RyaW5nLXZhbHVlZCBcInNlbGVjdG9yXCIsIFwiZXZlbnRcIiwgYW5kIFwiZnVuY1wiIGtleXMuXG5EZWxlZ2F0b3IuX3BhcnNlRXZlbnRzID0gKGV2ZW50c09iaikgLT5cbiAgICBldmVudHMgPSBbXVxuICAgIGZvciBzZWwsIGZ1bmN0aW9uTmFtZSBvZiBldmVudHNPYmpcbiAgICAgIFtzZWxlY3Rvci4uLiwgZXZlbnRdID0gc2VsLnNwbGl0ICcgJ1xuICAgICAgZXZlbnRzLnB1c2goe1xuICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3Iuam9pbignICcpLFxuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lXG4gICAgICB9KVxuICAgIHJldHVybiBldmVudHNcblxuXG4jIE5hdGl2ZSBqUXVlcnkgZXZlbnRzIHRoYXQgc2hvdWxkIHJlY2lldmUgYW4gZXZlbnQgb2JqZWN0LiBQbHVnaW5zIGNhblxuIyBhZGQgdGhlaXIgb3duIG1ldGhvZHMgdG8gdGhpcyBpZiByZXF1aXJlZC5cbkRlbGVnYXRvci5uYXRpdmVzID0gZG8gLT5cbiAgc3BlY2lhbHMgPSAoa2V5IGZvciBvd24ga2V5LCB2YWwgb2YgJC5ldmVudC5zcGVjaWFsKVxuICBcIlwiXCJcbiAgYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2tcbiAgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmVcbiAgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvclxuICBcIlwiXCIuc3BsaXQoL1teYS16XSsvKS5jb25jYXQoc3BlY2lhbHMpXG5cblxuIyBDaGVja3MgdG8gc2VlIGlmIHRoZSBwcm92aWRlZCBldmVudCBpcyBhIERPTSBldmVudCBzdXBwb3J0ZWQgYnkgalF1ZXJ5IG9yXG4jIGEgY3VzdG9tIHVzZXIgZXZlbnQuXG4jXG4jIGV2ZW50IC0gU3RyaW5nIGV2ZW50IG5hbWUuXG4jXG4jIEV4YW1wbGVzXG4jXG4jICAgRGVsZWdhdG9yLl9pc0N1c3RvbUV2ZW50KCdjbGljaycpICAgICAgICAgICAgICAjID0+IGZhbHNlXG4jICAgRGVsZWdhdG9yLl9pc0N1c3RvbUV2ZW50KCdtb3VzZWRvd24nKSAgICAgICAgICAjID0+IGZhbHNlXG4jICAgRGVsZWdhdG9yLl9pc0N1c3RvbUV2ZW50KCdhbm5vdGF0aW9uOmNyZWF0ZWQnKSAjID0+IHRydWVcbiNcbiMgUmV0dXJucyB0cnVlIGlmIGV2ZW50IGlzIGEgY3VzdG9tIHVzZXIgZXZlbnQuXG5EZWxlZ2F0b3IuX2lzQ3VzdG9tRXZlbnQgPSAoZXZlbnQpIC0+XG4gIFtldmVudF0gPSBldmVudC5zcGxpdCgnLicpXG4gICQuaW5BcnJheShldmVudCwgRGVsZWdhdG9yLm5hdGl2ZXMpID09IC0xXG5cblxuIyBNaXggaW4gYmFja2JvbmUgZXZlbnRzXG5CYWNrYm9uZUV2ZW50cyA9IHJlcXVpcmUgJ2JhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lJ1xuQmFja2JvbmVFdmVudHMubWl4aW4oRGVsZWdhdG9yOjopXG5cbiMgRXhwb3J0IERlbGVnYXRvciBvYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gRGVsZWdhdG9yXG4iLCJVdGlsID0gcmVxdWlyZSAnLi91dGlsJ1xuV2lkZ2V0ID0gcmVxdWlyZSAnLi93aWRnZXQnXG5cblxuX3QgPSBVdGlsLlRyYW5zbGF0aW9uU3RyaW5nXG5cblxuIyBQdWJsaWM6IENyZWF0ZXMgYW4gZWxlbWVudCBmb3IgZWRpdGluZyBhbm5vdGF0aW9ucy5cbmNsYXNzIEVkaXRvciBleHRlbmRzIFdpZGdldFxuXG4gICMgRXZlbnRzIHRvIGJlIGJvdW5kIHRvIEBlbGVtZW50LlxuICBldmVudHM6XG4gICAgXCJmb3JtIHN1Ym1pdFwiOiAgICAgICAgICAgICAgICAgXCJzdWJtaXRcIlxuICAgIFwiLmFubm90YXRvci1zYXZlIGNsaWNrXCI6ICAgICAgIFwic3VibWl0XCJcbiAgICBcIi5hbm5vdGF0b3ItY2FuY2VsIGNsaWNrXCI6ICAgICBcImhpZGVcIlxuICAgIFwiLmFubm90YXRvci1jYW5jZWwgbW91c2VvdmVyXCI6IFwib25DYW5jZWxCdXR0b25Nb3VzZW92ZXJcIlxuICAgIFwidGV4dGFyZWEga2V5ZG93blwiOiAgICAgICAgICAgIFwicHJvY2Vzc0tleXByZXNzXCJcblxuICAjIENsYXNzZXMgdG8gdG9nZ2xlIHN0YXRlLlxuICBjbGFzc2VzOlxuICAgIGhpZGU6ICAnYW5ub3RhdG9yLWhpZGUnXG4gICAgZm9jdXM6ICdhbm5vdGF0b3ItZm9jdXMnXG5cbiAgIyBIVE1MIHRlbXBsYXRlIGZvciBAZWxlbWVudC5cbiAgaHRtbDogXCJcIlwiXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbm5vdGF0b3Itb3V0ZXIgYW5ub3RhdG9yLWVkaXRvclwiPlxuICAgICAgICAgIDxmb3JtIGNsYXNzPVwiYW5ub3RhdG9yLXdpZGdldFwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwiYW5ub3RhdG9yLWxpc3RpbmdcIj48L3VsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFubm90YXRvci1jb250cm9sc1wiPlxuICAgICAgICAgICAgICA8YSBocmVmPVwiI2NhbmNlbFwiIGNsYXNzPVwiYW5ub3RhdG9yLWNhbmNlbFwiPlwiXCJcIiArIF90KCdDYW5jZWwnKSArIFwiXCJcIjwvYT5cbiAgICAgICAgICAgICAgPGEgaHJlZj1cIiNzYXZlXCIgY2xhc3M9XCJhbm5vdGF0b3Itc2F2ZSBhbm5vdGF0b3ItZm9jdXNcIj5cIlwiXCIgKyBfdCgnU2F2ZScpICsgXCJcIlwiPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXCJcIlwiXG5cbiAgb3B0aW9uczoge30gIyBDb25maWd1cmF0aW9uIG9wdGlvbnNcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgRWRpdG9yIG9iamVjdC4gVGhpcyB3aWxsIGNyZWF0ZSB0aGVcbiAgIyBAZWxlbWVudCBmcm9tIHRoZSBAaHRtbCBzdHJpbmcgYW5kIHNldCB1cCBhbGwgZXZlbnRzLlxuICAjXG4gICMgb3B0aW9ucyAtIEFuIE9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcgb3B0aW9ucy4gVGhlcmUgYXJlIGN1cnJlbnRseSBub1xuICAjICAgICAgICAgICBvcHRpb25zIGltcGxlbWVudGVkLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBDcmVhdGVzIGEgbmV3IGVkaXRvciwgYWRkcyBhIGN1c3RvbSBmaWVsZCBhbmRcbiAgIyAgICMgbG9hZHMgYW4gYW5ub3RhdGlvbiBmb3IgZWRpdGluZy5cbiAgIyAgIGVkaXRvciA9IG5ldyBBbm5vdGF0b3IuRWRpdG9yXG4gICMgICBlZGl0b3IuYWRkRmllbGQoe1xuICAjICAgICBsYWJlbDogJ015IGN1c3RvbSBpbnB1dCBmaWVsZCcsXG4gICMgICAgIHR5cGU6ICAndGV4dGFyZWEnXG4gICMgICAgIGxvYWQ6ICBzb21lTG9hZENhbGxiYWNrXG4gICMgICAgIHNhdmU6ICBzb21lU2F2ZUNhbGxiYWNrXG4gICMgICB9KVxuICAjICAgZWRpdG9yLmxvYWQoYW5ub3RhdGlvbilcbiAgI1xuICAjIFJldHVybnMgYSBuZXcgRWRpdG9yIGluc3RhbmNlLlxuICBjb25zdHJ1Y3RvcjogKG9wdGlvbnMpIC0+XG4gICAgc3VwZXIgJChAaHRtbClbMF0sIG9wdGlvbnNcblxuICAgIEBmaWVsZHMgPSBbXVxuICAgIEBhbm5vdGF0aW9uID0ge31cblxuICAjIFB1YmxpYzogRGlzcGxheXMgdGhlIEVkaXRvciBhbmQgZmlyZXMgYSBcInNob3dcIiBldmVudC5cbiAgIyBDYW4gYmUgdXNlZCBhcyBhbiBldmVudCBjYWxsYmFjayBhbmQgd2lsbCBjYWxsIEV2ZW50I3ByZXZlbnREZWZhdWx0KClcbiAgIyBvbiB0aGUgc3VwcGxpZWQgZXZlbnQuXG4gICNcbiAgIyBldmVudCAtIEV2ZW50IG9iamVjdCBwcm92aWRlZCBpZiBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50XG4gICMgICAgICAgICBsaXN0ZW5lciAoZGVmYXVsdDp1bmRlZmluZWQpXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIERpc3BsYXlzIHRoZSBlZGl0b3IuXG4gICMgICBlZGl0b3Iuc2hvdygpXG4gICNcbiAgIyAgICMgRGlzcGxheXMgdGhlIGVkaXRvciBvbiBjbGljayAocHJldmVudHMgZGVmYXVsdCBhY3Rpb24pLlxuICAjICAgJCgnYS5zaG93LWVkaXRvcicpLmJpbmQoJ2NsaWNrJywgZWRpdG9yLnNob3cpXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZi5cbiAgc2hvdzogKGV2ZW50KSA9PlxuICAgIFV0aWwucHJldmVudEV2ZW50RGVmYXVsdCBldmVudFxuXG4gICAgQGVsZW1lbnQucmVtb3ZlQ2xhc3MoQGNsYXNzZXMuaGlkZSlcbiAgICBAZWxlbWVudC5maW5kKCcuYW5ub3RhdG9yLXNhdmUnKS5hZGRDbGFzcyhAY2xhc3Nlcy5mb2N1cylcblxuICAgICMgaW52ZXJ0IGlmIG5lY2Vzc2FyeVxuICAgIHRoaXMuY2hlY2tPcmllbnRhdGlvbigpXG5cbiAgICAjIGdpdmUgbWFpbiB0ZXh0YXJlYSBmb2N1c1xuICAgIEBlbGVtZW50LmZpbmQoXCI6aW5wdXQ6Zmlyc3RcIikuZm9jdXMoKVxuXG4gICAgdGhpcy5zZXR1cERyYWdnYWJsZXMoKVxuXG4gICAgdGhpcy5wdWJsaXNoKCdzaG93JylcblxuXG4gICMgUHVibGljOiBIaWRlcyB0aGUgRWRpdG9yIGFuZCBmaXJlcyBhIFwiaGlkZVwiIGV2ZW50LiBDYW4gYmUgdXNlZCBhcyBhbiBldmVudFxuICAjIGNhbGxiYWNrIGFuZCB3aWxsIGNhbGwgRXZlbnQjcHJldmVudERlZmF1bHQoKSBvbiB0aGUgc3VwcGxpZWQgZXZlbnQuXG4gICNcbiAgIyBldmVudCAtIEV2ZW50IG9iamVjdCBwcm92aWRlZCBpZiBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50XG4gICMgICAgICAgICBsaXN0ZW5lciAoZGVmYXVsdDp1bmRlZmluZWQpXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIEhpZGVzIHRoZSBlZGl0b3IuXG4gICMgICBlZGl0b3IuaGlkZSgpXG4gICNcbiAgIyAgICMgSGlkZSB0aGUgZWRpdG9yIG9uIGNsaWNrIChwcmV2ZW50cyBkZWZhdWx0IGFjdGlvbikuXG4gICMgICAkKCdhLmhpZGUtZWRpdG9yJykuYmluZCgnY2xpY2snLCBlZGl0b3IuaGlkZSlcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmLlxuICBoaWRlOiAoZXZlbnQpID0+XG4gICAgVXRpbC5wcmV2ZW50RXZlbnREZWZhdWx0IGV2ZW50XG5cbiAgICBAZWxlbWVudC5hZGRDbGFzcyhAY2xhc3Nlcy5oaWRlKVxuICAgIHRoaXMucHVibGlzaCgnaGlkZScpXG5cbiAgIyBQdWJsaWM6IExvYWRzIGFuIGFubm90YXRpb24gaW50byB0aGUgRWRpdG9yIGFuZCBkaXNwbGF5cyBpdCBzZXR0aW5nXG4gICMgRWRpdG9yI2Fubm90YXRpb24gdG8gdGhlIHByb3ZpZGVkIGFubm90YXRpb24uIEl0IGZpcmVzIHRoZSBcImxvYWRcIiBldmVudFxuICAjIHByb3ZpZGluZyB0aGUgY3VycmVudCBhbm5vdGF0aW9uIHN1YnNjcmliZXJzIGNhbiBtb2RpZnkgdGhlIGFubm90YXRpb25cbiAgIyBiZWZvcmUgaXQgdXBkYXRlcyB0aGUgZWRpdG9yIGZpZWxkcy5cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdCB0byBkaXNwbGF5IGZvciBlZGl0aW5nLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBEaXBsYXlzIHRoZSBlZGl0b3Igd2l0aCB0aGUgYW5ub3RhdGlvbiBsb2FkZWQuXG4gICMgICBlZGl0b3IubG9hZCh7dGV4dDogJ015IEFubm90YXRpb24nfSlcbiAgI1xuICAjICAgZWRpdG9yLm9uKCdsb2FkJywgKGFubm90YXRpb24pIC0+XG4gICMgICAgIGNvbnNvbGUubG9nIGFubm90YXRpb24udGV4dFxuICAjICAgKS5sb2FkKHt0ZXh0OiAnTXkgQW5ub3RhdGlvbid9KVxuICAjICAgIyA9PiBPdXRwdXRzIFwiTXkgQW5ub3RhdGlvblwiXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZi5cbiAgbG9hZDogKGFubm90YXRpb24pID0+XG4gICAgQGFubm90YXRpb24gPSBhbm5vdGF0aW9uXG5cbiAgICB0aGlzLnB1Ymxpc2goJ2xvYWQnLCBbQGFubm90YXRpb25dKVxuXG4gICAgZm9yIGZpZWxkIGluIEBmaWVsZHNcbiAgICAgIGZpZWxkLmxvYWQoZmllbGQuZWxlbWVudCwgQGFubm90YXRpb24pXG5cbiAgICB0aGlzLnNob3coKVxuXG4gICMgUHVibGljOiBIaWRlcyB0aGUgRWRpdG9yIGFuZCBwYXNzZXMgdGhlIGFubm90YXRpb24gdG8gYWxsIHJlZ2lzdGVyZWQgZmllbGRzXG4gICMgc28gdGhleSBjYW4gdXBkYXRlIGl0cyBzdGF0ZS4gSXQgdGhlbiBmaXJlcyB0aGUgXCJzYXZlXCIgZXZlbnQgc28gdGhhdCBvdGhlclxuICAjIHBhcnRpZXMgY2FuIGZ1cnRoZXIgbW9kaWZ5IHRoZSBhbm5vdGF0aW9uLlxuICAjIENhbiBiZSB1c2VkIGFzIGFuIGV2ZW50IGNhbGxiYWNrIGFuZCB3aWxsIGNhbGwgRXZlbnQjcHJldmVudERlZmF1bHQoKSBvbiB0aGVcbiAgIyBzdXBwbGllZCBldmVudC5cbiAgI1xuICAjIGV2ZW50IC0gRXZlbnQgb2JqZWN0IHByb3ZpZGVkIGlmIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnRcbiAgIyAgICAgICAgIGxpc3RlbmVyIChkZWZhdWx0OnVuZGVmaW5lZClcbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgU3VibWl0cyB0aGUgZWRpdG9yLlxuICAjICAgZWRpdG9yLnN1Ym1pdCgpXG4gICNcbiAgIyAgICMgU3VibWl0cyB0aGUgZWRpdG9yIG9uIGNsaWNrIChwcmV2ZW50cyBkZWZhdWx0IGFjdGlvbikuXG4gICMgICAkKCdidXR0b24uc3VibWl0LWVkaXRvcicpLmJpbmQoJ2NsaWNrJywgZWRpdG9yLnN1Ym1pdClcbiAgI1xuICAjICAgIyBBcHBlbmRzIFwiQ29tbWVudDogXCIgdG8gdGhlIGFubm90YXRpb24gY29tbWVudCB0ZXh0LlxuICAjICAgZWRpdG9yLm9uKCdzYXZlJywgKGFubm90YXRpb24pIC0+XG4gICMgICAgIGFubm90YXRpb24udGV4dCA9IFwiQ29tbWVudDogXCIgKyBhbm5vdGF0aW9uLnRleHRcbiAgIyAgICkuc3VibWl0KClcbiAgI1xuICAjIFJldHVybnMgaXRzZWxmLlxuICBzdWJtaXQ6IChldmVudCkgPT5cbiAgICBVdGlsLnByZXZlbnRFdmVudERlZmF1bHQgZXZlbnRcblxuICAgIGZvciBmaWVsZCBpbiBAZmllbGRzXG4gICAgICBmaWVsZC5zdWJtaXQoZmllbGQuZWxlbWVudCwgQGFubm90YXRpb24pXG5cbiAgICB0aGlzLnB1Ymxpc2goJ3NhdmUnLCBbQGFubm90YXRpb25dKVxuXG4gICAgdGhpcy5oaWRlKClcblxuICAjIFB1YmxpYzogQWRkcyBhbiBhZGRpb25hbCBmb3JtIGZpZWxkIHRvIHRoZSBlZGl0b3IuIENhbGxiYWNrcyBjYW4gYmUgcHJvdmlkZWRcbiAgIyB0byB1cGRhdGUgdGhlIHZpZXcgYW5kIGFub3RhdGlvbnMgb24gbG9hZCBhbmQgc3VibWlzc2lvbi5cbiAgI1xuICAjIG9wdGlvbnMgLSBBbiBvcHRpb25zIE9iamVjdC4gT3B0aW9ucyBhcmUgYXMgZm9sbG93czpcbiAgIyAgICAgICAgICAgaWQgICAgIC0gQSB1bmlxdWUgaWQgZm9yIHRoZSBmb3JtIGVsZW1lbnQgd2lsbCBhbHNvIGJlIHNldCBhcyB0aGVcbiAgIyAgICAgICAgICAgICAgICAgICAgXCJmb3JcIiBhdHRydWJ1dGUgb2YgYSBsYWJlbCBpZiB0aGVyZSBpcyBvbmUuIERlZmF1bHRzIHRvXG4gICMgICAgICAgICAgICAgICAgICAgIGEgdGltZXN0YW1wLiAoZGVmYXVsdDogXCJhbm5vdGF0b3ItZmllbGQte3RpbWVzdGFtcH1cIilcbiAgIyAgICAgICAgICAgdHlwZSAgIC0gSW5wdXQgdHlwZSBTdHJpbmcuIE9uZSBvZiBcImlucHV0XCIsIFwidGV4dGFyZWFcIixcbiAgIyAgICAgICAgICAgICAgICAgICAgXCJjaGVja2JveFwiLCBcInNlbGVjdFwiIChkZWZhdWx0OiBcImlucHV0XCIpXG4gICMgICAgICAgICAgIGxhYmVsICAtIExhYmVsIHRvIGRpc3BsYXkgZWl0aGVyIGluIGEgbGFiZWwgRWxlbWVudCBvciBhcyBwbGFjZS1cbiAgIyAgICAgICAgICAgICAgICAgICAgaG9sZGVyIHRleHQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlLiAoZGVmYXVsdDogXCJcIilcbiAgIyAgICAgICAgICAgbG9hZCAgIC0gQ2FsbGJhY2sgRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBsb2FkZWQgd2l0aCBhXG4gICMgICAgICAgICAgICAgICAgICAgIG5ldyBhbm5vdGF0aW9uLiBSZWNpZXZlcyB0aGUgZmllbGQgPGxpPiBlbGVtZW50IGFuZCB0aGVcbiAgIyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiB0byBiZSBsb2FkZWQuXG4gICMgICAgICAgICAgIHN1Ym1pdCAtIENhbGxiYWNrIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBlZGl0b3IgaXMgc3VibWl0dGVkLlxuICAjICAgICAgICAgICAgICAgICAgICBSZWNpZXZlcyB0aGUgZmllbGQgPGxpPiBlbGVtZW50IGFuZCB0aGUgYW5ub3RhdGlvbiB0byBiZVxuICAjICAgICAgICAgICAgICAgICAgICB1cGRhdGVkLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBBZGQgYSBuZXcgaW5wdXQgZWxlbWVudC5cbiAgIyAgIGVkaXRvci5hZGRGaWVsZCh7XG4gICMgICAgIGxhYmVsOiBcIlRhZ3NcIixcbiAgI1xuICAjICAgICAjIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBsb2FkZWQgdXNlIGl0IHRvIHVwZGF0ZSB5b3VyIGlucHV0LlxuICAjICAgICBsb2FkOiAoZmllbGQsIGFubm90YXRpb24pIC0+XG4gICMgICAgICAgIyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgYW5ub3RhdGlvbi5cbiAgIyAgICAgICB2YWx1ZSA9IGdldFRhZ1N0cmluZyhhbm5vdGF0aW9uLnRhZ3MpXG4gICMgICAgICAgJChmaWVsZCkuZmluZCgnaW5wdXQnKS52YWwodmFsdWUpXG4gICNcbiAgIyAgICAgIyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBlZGl0b3IgaXMgc3VibWl0dGVkIHVzZSBpdCB0byByZXRyaWV2ZSBkYXRhXG4gICMgICAgICMgZnJvbSB5b3VyIGlucHV0IGFuZCBzYXZlIGl0IHRvIHRoZSBhbm5vdGF0aW9uLlxuICAjICAgICBzdWJtaXQ6IChmaWVsZCwgYW5ub3RhdGlvbikgLT5cbiAgIyAgICAgICB2YWx1ZSA9ICQoZmllbGQpLmZpbmQoJ2lucHV0JykudmFsKClcbiAgIyAgICAgICBhbm5vdGF0aW9uLnRhZ3MgPSBnZXRUYWdzRnJvbVN0cmluZyh2YWx1ZSlcbiAgIyAgIH0pXG4gICNcbiAgIyAgICMgQWRkIGEgbmV3IGNoZWNrYm94IGVsZW1lbnQuXG4gICMgICBlZGl0b3IuYWRkRmllbGQoe1xuICAjICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAjICAgICBpZDogJ2Fubm90YXRvci1maWVsZC1teS1jaGVja2JveCcsXG4gICMgICAgIGxhYmVsOiAnQWxsb3cgYW55b25lIHRvIHNlZSB0aGlzIGFubm90YXRpb24nLFxuICAjICAgICBsb2FkOiAoZmllbGQsIGFubm90YXRpb24pIC0+XG4gICMgICAgICAgIyBDaGVjayB3aGF0IHN0YXRlIG9mIGlucHV0IHNob3VsZCBiZS5cbiAgIyAgICAgICBpZiBjaGVja2VkXG4gICMgICAgICAgICAkKGZpZWxkKS5maW5kKCdpbnB1dCcpLmF0dHIoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpXG4gICMgICAgICAgZWxzZVxuICAjICAgICAgICAgJChmaWVsZCkuZmluZCgnaW5wdXQnKS5yZW1vdmVBdHRyKCdjaGVja2VkJylcblxuICAjICAgICBzdWJtaXQ6IChmaWVsZCwgYW5ub3RhdGlvbikgLT5cbiAgIyAgICAgICBjaGVja2VkID0gJChmaWVsZCkuZmluZCgnaW5wdXQnKS5pcygnOmNoZWNrZWQnKVxuICAjICAgICAgICMgRG8gc29tZXRoaW5nLlxuICAjICAgfSlcbiAgI1xuICAjIFJldHVybnMgdGhlIGNyZWF0ZWQgPGxpPiBFbGVtZW50LlxuICBhZGRGaWVsZDogKG9wdGlvbnMpIC0+XG4gICAgZmllbGQgPSAkLmV4dGVuZCh7XG4gICAgICBpZDogICAgICdhbm5vdGF0b3ItZmllbGQtJyArIFV0aWwudXVpZCgpXG4gICAgICB0eXBlOiAgICdpbnB1dCdcbiAgICAgIGxhYmVsOiAgJydcbiAgICAgIGxvYWQ6ICAgLT5cbiAgICAgIHN1Ym1pdDogLT5cbiAgICB9LCBvcHRpb25zKVxuXG4gICAgaW5wdXQgPSBudWxsXG4gICAgZWxlbWVudCA9ICQoJzxsaSBjbGFzcz1cImFubm90YXRvci1pdGVtXCIgLz4nKVxuICAgIGZpZWxkLmVsZW1lbnQgPSBlbGVtZW50WzBdXG5cbiAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpXG4gICAgICB3aGVuICd0ZXh0YXJlYScgICAgICAgICAgdGhlbiBpbnB1dCA9ICQoJzx0ZXh0YXJlYSAvPicpXG4gICAgICB3aGVuICdpbnB1dCcsICdjaGVja2JveCcgdGhlbiBpbnB1dCA9ICQoJzxpbnB1dCAvPicpXG4gICAgICB3aGVuICdzZWxlY3QnIHRoZW4gaW5wdXQgPSAkKCc8c2VsZWN0IC8+JylcblxuICAgIGVsZW1lbnQuYXBwZW5kKGlucHV0KVxuXG4gICAgaW5wdXQuYXR0cih7XG4gICAgICBpZDogZmllbGQuaWRcbiAgICAgIHBsYWNlaG9sZGVyOiBmaWVsZC5sYWJlbFxuICAgIH0pXG5cbiAgICBpZiBmaWVsZC50eXBlID09ICdjaGVja2JveCdcbiAgICAgIGlucHV0WzBdLnR5cGUgPSAnY2hlY2tib3gnXG4gICAgICBlbGVtZW50LmFkZENsYXNzKCdhbm5vdGF0b3ItY2hlY2tib3gnKVxuICAgICAgZWxlbWVudC5hcHBlbmQoJCgnPGxhYmVsIC8+Jywge2ZvcjogZmllbGQuaWQsIGh0bWw6IGZpZWxkLmxhYmVsfSkpXG5cbiAgICBAZWxlbWVudC5maW5kKCd1bDpmaXJzdCcpLmFwcGVuZChlbGVtZW50KVxuXG4gICAgQGZpZWxkcy5wdXNoIGZpZWxkXG5cbiAgICBmaWVsZC5lbGVtZW50XG5cbiAgY2hlY2tPcmllbnRhdGlvbjogLT5cbiAgICBzdXBlclxuXG4gICAgbGlzdCA9IEBlbGVtZW50LmZpbmQoJ3VsJylcbiAgICBjb250cm9scyA9IEBlbGVtZW50LmZpbmQoJy5hbm5vdGF0b3ItY29udHJvbHMnKVxuXG4gICAgaWYgQGVsZW1lbnQuaGFzQ2xhc3MoQGNsYXNzZXMuaW52ZXJ0LnkpXG4gICAgICBjb250cm9scy5pbnNlcnRCZWZvcmUobGlzdClcbiAgICBlbHNlIGlmIGNvbnRyb2xzLmlzKCc6Zmlyc3QtY2hpbGQnKVxuICAgICAgY29udHJvbHMuaW5zZXJ0QWZ0ZXIobGlzdClcblxuICAgIHRoaXNcblxuICAjIEV2ZW50IGNhbGxiYWNrLiBMaXN0ZW5zIGZvciB0aGUgZm9sbG93aW5nIHNwZWNpYWwga2V5cHJlc3Nlcy5cbiAgIyAtIGVzY2FwZTogSGlkZXMgdGhlIGVkaXRvclxuICAjIC0gZW50ZXI6ICBTdWJtaXRzIHRoZSBlZGl0b3JcbiAgI1xuICAjIGV2ZW50IC0gQSBrZXlkb3duIEV2ZW50IG9iamVjdC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZ1xuICBwcm9jZXNzS2V5cHJlc3M6IChldmVudCkgPT5cbiAgICBpZiBldmVudC5rZXlDb2RlIGlzIDI3ICMgXCJFc2NhcGVcIiBrZXkgPT4gYWJvcnQuXG4gICAgICB0aGlzLmhpZGUoKVxuICAgIGVsc2UgaWYgZXZlbnQua2V5Q29kZSBpcyAxMyBhbmQgIWV2ZW50LnNoaWZ0S2V5XG4gICAgICAjIElmIFwicmV0dXJuXCIgd2FzIHByZXNzZWQgd2l0aG91dCB0aGUgc2hpZnQga2V5LCB3ZSdyZSBkb25lLlxuICAgICAgdGhpcy5zdWJtaXQoKVxuXG4gICMgRXZlbnQgY2FsbGJhY2suIFJlbW92ZXMgdGhlIGZvY3VzIGNsYXNzIGZyb20gdGhlIHN1Ym1pdCBidXR0b24gd2hlbiB0aGVcbiAgIyBjYW5jZWwgYnV0dG9uIGlzIGhvdmVyZWQuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmdcbiAgb25DYW5jZWxCdXR0b25Nb3VzZW92ZXI6ID0+XG4gICAgQGVsZW1lbnQuZmluZCgnLicgKyBAY2xhc3Nlcy5mb2N1cykucmVtb3ZlQ2xhc3MoQGNsYXNzZXMuZm9jdXMpXG5cbiAgIyBTZXRzIHVwIG1vdXNlIGV2ZW50cyBmb3IgcmVzaXppbmcgYW5kIGRyYWdnaW5nIHRoZSBlZGl0b3Igd2luZG93LlxuICAjIHdpbmRvdyBldmVudHMgYXJlIGJvdW5kIG9ubHkgd2hlbiBuZWVkZWQgYW5kIHRocm90dGxlZCB0byBvbmx5IHVwZGF0ZVxuICAjIHRoZSBwb3NpdGlvbnMgYXQgbW9zdCA2MCB0aW1lcyBhIHNlY29uZC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgc2V0dXBEcmFnZ2FibGVzOiAoKSAtPlxuICAgIEBlbGVtZW50LmZpbmQoJy5hbm5vdGF0b3ItcmVzaXplJykucmVtb3ZlKClcblxuICAgICMgRmluZCB0aGUgZmlyc3QvbGFzdCBpdGVtIGVsZW1lbnQgZGVwZW5kaW5nIG9uIG9yaWVudGF0aW9uXG4gICAgaWYgQGVsZW1lbnQuaGFzQ2xhc3MoQGNsYXNzZXMuaW52ZXJ0LnkpXG4gICAgICBjb3JuZXJJdGVtID0gQGVsZW1lbnQuZmluZCgnLmFubm90YXRvci1pdGVtOmxhc3QnKVxuICAgIGVsc2VcbiAgICAgIGNvcm5lckl0ZW0gPSBAZWxlbWVudC5maW5kKCcuYW5ub3RhdG9yLWl0ZW06Zmlyc3QnKVxuXG4gICAgaWYgY29ybmVySXRlbVxuICAgICAgJCgnPHNwYW4gY2xhc3M9XCJhbm5vdGF0b3ItcmVzaXplXCI+PC9zcGFuPicpLmFwcGVuZFRvKGNvcm5lckl0ZW0pXG5cbiAgICBtb3VzZWRvd24gPSBudWxsXG4gICAgY2xhc3NlcyAgID0gQGNsYXNzZXNcbiAgICBlZGl0b3IgICAgPSBAZWxlbWVudFxuICAgIHRleHRhcmVhICA9IG51bGxcbiAgICByZXNpemUgICAgPSBlZGl0b3IuZmluZCgnLmFubm90YXRvci1yZXNpemUnKVxuICAgIGNvbnRyb2xzICA9IGVkaXRvci5maW5kKCcuYW5ub3RhdG9yLWNvbnRyb2xzJylcbiAgICB0aHJvdHRsZSAgPSBmYWxzZVxuXG4gICAgb25Nb3VzZWRvd24gPSAoZXZlbnQpIC0+XG4gICAgICBpZiBldmVudC50YXJnZXQgPT0gdGhpc1xuICAgICAgICBtb3VzZWRvd24gPSB7XG4gICAgICAgICAgZWxlbWVudDogdGhpc1xuICAgICAgICAgIHRvcDogICAgIGV2ZW50LnBhZ2VZXG4gICAgICAgICAgbGVmdDogICAgZXZlbnQucGFnZVhcbiAgICAgICAgfVxuXG4gICAgICAgICMgRmluZCB0aGUgZmlyc3QgdGV4dCBhcmVhIGlmIHRoZXJlIGlzIG9uZS5cbiAgICAgICAgdGV4dGFyZWEgPSBlZGl0b3IuZmluZCgndGV4dGFyZWE6Zmlyc3QnKVxuXG4gICAgICAgICQod2luZG93KS5iaW5kKHtcbiAgICAgICAgICAnbW91c2V1cC5hbm5vdGF0b3ItZWRpdG9yLXJlc2l6ZSc6ICAgb25Nb3VzZXVwXG4gICAgICAgICAgJ21vdXNlbW92ZS5hbm5vdGF0b3ItZWRpdG9yLXJlc2l6ZSc6IG9uTW91c2Vtb3ZlXG4gICAgICAgIH0pXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgIG9uTW91c2V1cCA9IC0+XG4gICAgICBtb3VzZWRvd24gPSBudWxsXG4gICAgICAkKHdpbmRvdykudW5iaW5kICcuYW5ub3RhdG9yLWVkaXRvci1yZXNpemUnXG5cbiAgICBvbk1vdXNlbW92ZSA9IChldmVudCkgPT5cbiAgICAgIGlmIG1vdXNlZG93biBhbmQgdGhyb3R0bGUgPT0gZmFsc2VcbiAgICAgICAgZGlmZiA9IHtcbiAgICAgICAgICB0b3A6ICBldmVudC5wYWdlWSAtIG1vdXNlZG93bi50b3BcbiAgICAgICAgICBsZWZ0OiBldmVudC5wYWdlWCAtIG1vdXNlZG93bi5sZWZ0XG4gICAgICAgIH1cblxuICAgICAgICBpZiBtb3VzZWRvd24uZWxlbWVudCA9PSByZXNpemVbMF1cbiAgICAgICAgICBoZWlnaHQgPSB0ZXh0YXJlYS5vdXRlckhlaWdodCgpXG4gICAgICAgICAgd2lkdGggID0gdGV4dGFyZWEub3V0ZXJXaWR0aCgpXG5cbiAgICAgICAgICBkaXJlY3Rpb25YID0gaWYgZWRpdG9yLmhhc0NsYXNzKGNsYXNzZXMuaW52ZXJ0LngpIHRoZW4gLTEgZWxzZSAgMVxuICAgICAgICAgIGRpcmVjdGlvblkgPSBpZiBlZGl0b3IuaGFzQ2xhc3MoY2xhc3Nlcy5pbnZlcnQueSkgdGhlbiAgMSBlbHNlIC0xXG5cbiAgICAgICAgICB0ZXh0YXJlYS5oZWlnaHQgaGVpZ2h0ICsgKGRpZmYudG9wICAqIGRpcmVjdGlvblkpXG4gICAgICAgICAgdGV4dGFyZWEud2lkdGggIHdpZHRoICArIChkaWZmLmxlZnQgKiBkaXJlY3Rpb25YKVxuXG4gICAgICAgICAgIyBPbmx5IHVwZGF0ZSB0aGUgbW91c2Vkb3duIG9iamVjdCBpZiB0aGUgZGltZW5zaW9uc1xuICAgICAgICAgICMgaGF2ZSBjaGFuZ2VkLCBvdGhlcndpc2UgdGhleSBoYXZlIHJlYWNoZWQgdGhlaXIgbWluaW11bVxuICAgICAgICAgICMgdmFsdWVzLlxuICAgICAgICAgIG1vdXNlZG93bi50b3AgID0gZXZlbnQucGFnZVkgdW5sZXNzIHRleHRhcmVhLm91dGVySGVpZ2h0KCkgPT0gaGVpZ2h0XG4gICAgICAgICAgbW91c2Vkb3duLmxlZnQgPSBldmVudC5wYWdlWCB1bmxlc3MgdGV4dGFyZWEub3V0ZXJXaWR0aCgpICA9PSB3aWR0aFxuXG4gICAgICAgIGVsc2UgaWYgbW91c2Vkb3duLmVsZW1lbnQgPT0gY29udHJvbHNbMF1cbiAgICAgICAgICBlZGl0b3IuY3NzKHtcbiAgICAgICAgICAgIHRvcDogIHBhcnNlSW50KGVkaXRvci5jc3MoJ3RvcCcpLCAxMCkgICsgZGlmZi50b3BcbiAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KGVkaXRvci5jc3MoJ2xlZnQnKSwgMTApICsgZGlmZi5sZWZ0XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIG1vdXNlZG93bi50b3AgID0gZXZlbnQucGFnZVlcbiAgICAgICAgICBtb3VzZWRvd24ubGVmdCA9IGV2ZW50LnBhZ2VYXG5cbiAgICAgICAgdGhyb3R0bGUgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KC0+XG4gICAgICAgICAgdGhyb3R0bGUgPSBmYWxzZVxuICAgICAgICAsIDEwMDAvNjApXG5cbiAgICByZXNpemUuYmluZCAgICdtb3VzZWRvd24nLCBvbk1vdXNlZG93blxuICAgIGNvbnRyb2xzLmJpbmQgJ21vdXNlZG93bicsIG9uTW91c2Vkb3duXG5cblxuIyBFeHBvcnQgdGhlIEVkaXRvciBvYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gRWRpdG9yXG4iLCJEZWxlZ2F0b3IgPSByZXF1aXJlICcuL2NsYXNzJ1xuVXRpbCA9IHJlcXVpcmUgJy4vdXRpbCdcblxuXG4jIFB1YmxpYzogQSBzaW1wbGUgbm90aWZpY2F0aW9uIHN5c3RlbSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgaW5mb3JtYXRpb24sXG4jIHdhcm5pbmdzIGFuZCBlcnJvcnMgdG8gdGhlIHVzZXIuIERpc3BsYXkgb2Ygbm90aWZpY2F0aW9ucyBhcmUgY29udHJvbGxlZFxuIyBjbXBsZXRlbHkgYnkgQ1NTIGJ5IGFkZGluZy9yZW1vdmluZyB0aGUgQG9wdGlvbnMuY2xhc3Nlcy5zaG93IGNsYXNzLiBUaGlzXG4jIGFsbG93cyBzdHlsaW5nL2FuaW1hdGlvbiB1c2luZyBDU1MgcmF0aGVyIHRoYW4gaGFyZGNvZGluZyBzdHlsZXMuXG5jbGFzcyBOb3RpZmljYXRpb24gZXh0ZW5kcyBEZWxlZ2F0b3JcblxuICAjIFNldHMgZXZlbnRzIHRvIGJlIGJvdW5kIHRvIHRoZSBAZWxlbWVudC5cbiAgZXZlbnRzOlxuICAgIFwiY2xpY2tcIjogXCJoaWRlXCJcblxuICAjIERlZmF1bHQgb3B0aW9ucy5cbiAgb3B0aW9uczpcbiAgICBodG1sOiBcIjxkaXYgY2xhc3M9J2Fubm90YXRvci1ub3RpY2UnPjwvZGl2PlwiXG4gICAgY2xhc3NlczpcbiAgICAgIHNob3c6ICAgIFwiYW5ub3RhdG9yLW5vdGljZS1zaG93XCJcbiAgICAgIGluZm86ICAgIFwiYW5ub3RhdG9yLW5vdGljZS1pbmZvXCJcbiAgICAgIHN1Y2Nlc3M6IFwiYW5ub3RhdG9yLW5vdGljZS1zdWNjZXNzXCJcbiAgICAgIGVycm9yOiAgIFwiYW5ub3RhdG9yLW5vdGljZS1lcnJvclwiXG5cbiAgIyBQdWJsaWM6IENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgIE5vdGlmaWNhdGlvbiBhbmQgYXBwZW5kcyBpdCB0byB0aGVcbiAgIyBkb2N1bWVudCBib2R5LlxuICAjXG4gICMgb3B0aW9ucyAtIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQuXG4gICMgICAgICAgICAgIGNsYXNzZXMgLSBBIE9iamVjdCBsaXRlcmFsIG9mIGNsYXNzZXMgdXNlZCB0byBkZXRlcm1pbmUgc3RhdGUuXG4gICMgICAgICAgICAgIGh0bWwgICAgLSBBbiBIVE1MIHN0cmluZyB1c2VkIHRvIGNyZWF0ZSB0aGUgbm90aWZpY2F0aW9uLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBEaXNwbGF5cyBhIG5vdGlmaWNhdGlvbiB3aXRoIHRoZSB0ZXh0IFwiSGVsbG8gV29ybGRcIlxuICAjICAgbm90aWZpY2F0aW9uID0gbmV3IEFubm90YXRvci5Ob3RpZmljYXRpb25cbiAgIyAgIG5vdGlmaWNhdGlvbi5zaG93KFwiSGVsbG8gV29ybGRcIilcbiAgI1xuICAjIFJldHVybnNcbiAgY29uc3RydWN0b3I6IChvcHRpb25zKSAtPlxuICAgIHN1cGVyICQoQG9wdGlvbnMuaHRtbClbMF0sIG9wdGlvbnNcblxuICAjIFB1YmxpYzogRGlzcGxheXMgdGhlIGFubm90YXRpb24gd2l0aCBtZXNzYWdlIGFuZCBvcHRpb25hbCBzdGF0dXMuIFRoZVxuICAjIG1lc3NhZ2Ugd2lsbCBoaWRlIGl0c2VsZiBhZnRlciA1IHNlY29uZHMgb3IgaWYgdGhlIHVzZXIgY2xpY2tzIG9uIGl0LlxuICAjXG4gICMgbWVzc2FnZSAtIEEgbWVzc2FnZSBTdHJpbmcgdG8gZGlzcGxheSAoSFRNTCB3aWxsIGJlIGVzY2FwZWQpLlxuICAjIHN0YXR1cyAgLSBBIHN0YXR1cyBjb25zdGFudC4gVGhpcyB3aWxsIGFwcGx5IGEgY2xhc3MgdG8gdGhlIGVsZW1lbnQgZm9yXG4gICMgICAgICAgICAgIHN0eWxpbmcuIChkZWZhdWx0OiBBbm5vdGF0b3IuTm90aWZpY2F0aW9uLklORk8pXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIERpc3BsYXlzIGEgbm90aWZpY2F0aW9uIHdpdGggdGhlIHRleHQgXCJIZWxsbyBXb3JsZFwiXG4gICMgICBub3RpZmljYXRpb24uc2hvdyhcIkhlbGxvIFdvcmxkXCIpXG4gICNcbiAgIyAgICMgRGlzcGxheXMgYSBub3RpZmljYXRpb24gd2l0aCB0aGUgdGV4dCBcIkFuIGVycm9yIGhhcyBvY2N1cnJlZFwiXG4gICMgICBub3RpZmljYXRpb24uc2hvdyhcIkFuIGVycm9yIGhhcyBvY2N1cnJlZFwiLCBBbm5vdGF0b3IuTm90aWZpY2F0aW9uLkVSUk9SKVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYuXG4gIHNob3c6IChtZXNzYWdlLCBzdGF0dXM9Tm90aWZpY2F0aW9uLklORk8pID0+XG4gICAgQGN1cnJlbnRTdGF0dXMgPSBzdGF0dXNcbiAgICB0aGlzLl9hcHBlbmRFbGVtZW50KClcblxuICAgICQoQGVsZW1lbnQpXG4gICAgICAuYWRkQ2xhc3MoQG9wdGlvbnMuY2xhc3Nlcy5zaG93KVxuICAgICAgLmFkZENsYXNzKEBvcHRpb25zLmNsYXNzZXNbQGN1cnJlbnRTdGF0dXNdKVxuICAgICAgLmh0bWwoVXRpbC5lc2NhcGUobWVzc2FnZSB8fCBcIlwiKSlcblxuICAgIHNldFRpbWVvdXQgdGhpcy5oaWRlLCA1MDAwXG4gICAgdGhpc1xuXG4gICMgUHVibGljOiBIaWRlcyB0aGUgbm90aWZpY2F0aW9uLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgIyBIaWRlcyB0aGUgbm90aWZpY2F0aW9uLlxuICAjICAgbm90aWZpY2F0aW9uLmhpZGUoKVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYuXG4gIGhpZGU6ID0+XG4gICAgQGN1cnJlbnRTdGF0dXMgPz0gQW5ub3RhdG9yLk5vdGlmaWNhdGlvbi5JTkZPXG4gICAgJChAZWxlbWVudClcbiAgICAgIC5yZW1vdmVDbGFzcyhAb3B0aW9ucy5jbGFzc2VzLnNob3cpXG4gICAgICAucmVtb3ZlQ2xhc3MoQG9wdGlvbnMuY2xhc3Nlc1tAY3VycmVudFN0YXR1c10pXG4gICAgdGhpc1xuXG4gICMgUHJpdmF0ZTogRW5zdXJlcyB0aGUgbm90aWZpY2F0aW9uIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGRvY3VtZW50XG4gICMgd2hlbiBpdCBpcyBuZWVkZWQuXG4gIF9hcHBlbmRFbGVtZW50OiAtPlxuICAgIGlmIG5vdCBAZWxlbWVudC5wYXJlbnROb2RlP1xuICAgICAgJChAZWxlbWVudCkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSlcblxuIyBDb25zdGFudHMgZm9yIGNvbnRyb2xsaW5nIHRoZSBkaXNwbGF5IG9mIHRoZSBub3RpZmljYXRpb24uIEVhY2ggY29uc3RhbnRcbiMgYWRkcyBhIGRpZmZlcmVudCBjbGFzcyB0byB0aGUgTm90aWZpY2F0aW9uI2VsZW1lbnQuXG5Ob3RpZmljYXRpb24uSU5GTyAgICA9ICdpbmZvJ1xuTm90aWZpY2F0aW9uLlNVQ0NFU1MgPSAnc3VjY2Vzcydcbk5vdGlmaWNhdGlvbi5FUlJPUiAgID0gJ2Vycm9yJ1xuXG4jIEV4cG9ydCBOb3RpZmljYXRpb24gb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IE5vdGlmaWNhdGlvblxuIiwiQW5ub3RhdG9yID0gcmVxdWlyZSgnYW5ub3RhdG9yJylcblxuXG4jIFB1YmxpYzogQ3JlYXRlcyBhIERhdGUgb2JqZWN0IGZyb20gYW4gSVNPODYwMSBmb3JtYXR0ZWQgZGF0ZSBTdHJpbmcuXG4jXG4jIHN0cmluZyAtIElTTzg2MDEgZm9ybWF0dGVkIGRhdGUgU3RyaW5nLlxuI1xuIyBSZXR1cm5zIERhdGUgaW5zdGFuY2UuXG5jcmVhdGVEYXRlRnJvbUlTTzg2MDEgPSAoc3RyaW5nKSAtPlxuICByZWdleHAgPSAoXG4gICAgXCIoWzAtOV17NH0pKC0oWzAtOV17Mn0pKC0oWzAtOV17Mn0pXCIgK1xuICAgIFwiKFQoWzAtOV17Mn0pOihbMC05XXsyfSkoOihbMC05XXsyfSkoXFxcXC4oWzAtOV0rKSk/KT9cIiArXG4gICAgXCIoWnwoKFstK10pKFswLTldezJ9KTooWzAtOV17Mn0pKSk/KT8pPyk/XCJcbiAgKVxuXG4gIGQgPSBzdHJpbmcubWF0Y2gobmV3IFJlZ0V4cChyZWdleHApKVxuXG4gIG9mZnNldCA9IDBcbiAgZGF0ZSA9IG5ldyBEYXRlKGRbMV0sIDAsIDEpXG5cbiAgZGF0ZS5zZXRNb250aChkWzNdIC0gMSkgaWYgZFszXVxuICBkYXRlLnNldERhdGUoZFs1XSkgaWYgZFs1XVxuICBkYXRlLnNldEhvdXJzKGRbN10pIGlmIGRbN11cbiAgZGF0ZS5zZXRNaW51dGVzKGRbOF0pIGlmIGRbOF1cbiAgZGF0ZS5zZXRTZWNvbmRzKGRbMTBdKSBpZiBkWzEwXVxuICBkYXRlLnNldE1pbGxpc2Vjb25kcyhOdW1iZXIoXCIwLlwiICsgZFsxMl0pICogMTAwMCkgaWYgZFsxMl1cblxuICBpZiBkWzE0XVxuICAgIG9mZnNldCA9IChOdW1iZXIoZFsxNl0pICogNjApICsgTnVtYmVyKGRbMTddKVxuICAgIG9mZnNldCAqPSAoKGRbMTVdID09ICctJykgPyAxIDogLTEpXG5cbiAgb2Zmc2V0IC09IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKVxuICB0aW1lID0gKE51bWJlcihkYXRlKSArIChvZmZzZXQgKiA2MCAqIDEwMDApKVxuXG4gIGRhdGUuc2V0VGltZShOdW1iZXIodGltZSkpXG4gIGRhdGVcblxuYmFzZTY0RGVjb2RlID0gKGRhdGEpIC0+XG4gIGlmIGF0b2I/XG4gICAgIyBHZWNrbyBhbmQgV2Via2l0IHByb3ZpZGUgbmF0aXZlIGNvZGUgZm9yIHRoaXNcbiAgICBhdG9iKGRhdGEpXG4gIGVsc2VcbiAgICAjIEFkYXB0ZWQgZnJvbSBNSVQvQlNEIGxpY2Vuc2VkIGNvZGUgYXQgaHR0cDovL3BocGpzLm9yZy9mdW5jdGlvbnMvYmFzZTY0X2RlY29kZVxuICAgICMgdmVyc2lvbiAxMTA5LjIwMTVcbiAgICBiNjQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCJcbiAgICBpID0gMFxuICAgIGFjID0gMFxuICAgIGRlYyA9IFwiXCJcbiAgICB0bXBfYXJyID0gW11cblxuICAgIGlmIG5vdCBkYXRhXG4gICAgICByZXR1cm4gZGF0YVxuXG4gICAgZGF0YSArPSAnJ1xuXG4gICAgd2hpbGUgaSA8IGRhdGEubGVuZ3RoXG4gICAgICAjIHVucGFjayBmb3VyIGhleGV0cyBpbnRvIHRocmVlIG9jdGV0cyB1c2luZyBpbmRleCBwb2ludHMgaW4gYjY0XG4gICAgICBoMSA9IGI2NC5pbmRleE9mKGRhdGEuY2hhckF0KGkrKykpXG4gICAgICBoMiA9IGI2NC5pbmRleE9mKGRhdGEuY2hhckF0KGkrKykpXG4gICAgICBoMyA9IGI2NC5pbmRleE9mKGRhdGEuY2hhckF0KGkrKykpXG4gICAgICBoNCA9IGI2NC5pbmRleE9mKGRhdGEuY2hhckF0KGkrKykpXG5cbiAgICAgIGJpdHMgPSBoMSA8PCAxOCB8IGgyIDw8IDEyIHwgaDMgPDwgNiB8IGg0XG5cbiAgICAgIG8xID0gYml0cyA+PiAxNiAmIDB4ZmZcbiAgICAgIG8yID0gYml0cyA+PiA4ICYgMHhmZlxuICAgICAgbzMgPSBiaXRzICYgMHhmZlxuXG4gICAgICBpZiBoMyA9PSA2NFxuICAgICAgICB0bXBfYXJyW2FjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZShvMSlcbiAgICAgIGVsc2UgaWYgaDQgPT0gNjRcbiAgICAgICAgdG1wX2FyclthYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUobzEsIG8yKVxuICAgICAgZWxzZVxuICAgICAgICB0bXBfYXJyW2FjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZShvMSwgbzIsIG8zKVxuXG4gICAgdG1wX2Fyci5qb2luKCcnKVxuXG5iYXNlNjRVcmxEZWNvZGUgPSAoZGF0YSkgLT5cbiAgbSA9IGRhdGEubGVuZ3RoICUgNFxuICBpZiBtICE9IDBcbiAgICBmb3IgaSBpbiBbMC4uLjQgLSBtXVxuICAgICAgZGF0YSArPSAnPSdcbiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLS9nLCAnKycpXG4gIGRhdGEgPSBkYXRhLnJlcGxhY2UoL18vZywgJy8nKVxuICBiYXNlNjREZWNvZGUoZGF0YSlcblxucGFyc2VUb2tlbiA9ICh0b2tlbikgLT5cbiAgW2hlYWQsIHBheWxvYWQsIHNpZ10gPSB0b2tlbi5zcGxpdCgnLicpXG4gIEpTT04ucGFyc2UoYmFzZTY0VXJsRGVjb2RlKHBheWxvYWQpKVxuXG4jIFB1YmxpYzogU3VwcG9ydHMgdGhlIFN0b3JlIHBsdWdpbiBieSBwcm92aWRpbmcgQXV0aGVudGljYXRpb24gaGVhZGVycy5cbmNsYXNzIEFubm90YXRvci5QbHVnaW4uQXV0aCBleHRlbmRzIEFubm90YXRvci5QbHVnaW5cbiAgIyBVc2VyIG9wdGlvbnMgdGhhdCBjYW4gYmUgcHJvdmlkZWQuXG4gIG9wdGlvbnM6XG5cbiAgICAjIEFuIGF1dGhlbnRpY2F0aW9uIHRva2VuLiBVc2VkIHRvIHNraXAgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBmb3IgYVxuICAgICMgYSB0b2tlbi5cbiAgICB0b2tlbjogbnVsbFxuXG4gICAgIyBUaGUgVVJMIG9uIHRoZSBsb2NhbCBzZXJ2ZXIgdG8gcmVxdWVzdCBhbiBhdXRoZW50aWNhdGlvbiB0b2tlbi5cbiAgICB0b2tlblVybDogJy9hdXRoL3Rva2VuJ1xuXG4gICAgIyBJZiB0cnVlIHdpbGwgdHJ5IGFuZCBmZXRjaCBhIHRva2VuIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsaXNlZC5cbiAgICBhdXRvRmV0Y2g6IHRydWVcbiAgICBcbiAgICAjIEhUVFAgbWV0aG9kIHRvIHVzZSBmb3IgZmV0Y2hpbmcgdGhlIHRva2VuXG4gICAgcmVxdWVzdE1ldGhvZDogJ0dFVCdcbiAgICBcbiAgICAjIGRhdGEgdG8gc2VuZCB3aGVuIGZldGNoaW5nIHRoZSB0b2tlblxuICAgIHJlcXVlc3REYXRhOiBudWxsXG4gICAgXG4gICAgIyBjYWxsYmFjayB3aGVuIGxvZ2luIHJlcXVpcmVkXG4gICAgdW5hdXRob3JpemVkQ2FsbGJhY2s6IG51bGxcblxuICAjIFB1YmxpYzogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBdXRoIHBsdWdpbi5cbiAgI1xuICAjIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBiaW5kIGFsbCBldmVudHMgdG8uIFVzdWFsbHkgdGhlIEFubm90YXRvciNlbGVtZW50LlxuICAjIG9wdGlvbnMgLSBBbiBPYmplY3QgbGl0ZXJhbCBjb250YWluaW5nIHVzZXIgb3B0aW9ucy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHBsdWdpbiA9IG5ldyBBbm5vdGF0b3IuUGx1Z2luLkF1dGgoYW5ub3RhdG9yLmVsZW1lbnQsIHtcbiAgIyAgICAgdG9rZW5Vcmw6ICcvbXkvY3VzdG9tL3BhdGgnXG4gICMgICB9KVxuICAjXG4gICMgUmV0dXJucyBpbnN0YW5jZSBvZiBBdXRoLlxuICBjb25zdHJ1Y3RvcjogKGVsZW1lbnQsIG9wdGlvbnMpIC0+XG4gICAgc3VwZXJcblxuICAgICMgTGlzdCBvZiBmdW5jdGlvbnMgdG8gYmUgZXhlY3V0ZWQgd2hlbiB3ZSBoYXZlIGEgdmFsaWQgdG9rZW4uXG4gICAgQHdhaXRpbmdGb3JUb2tlbiA9IFtdXG5cbiAgIyBQdWJsaWM6IEluaXRpYWxpc2VzIHRoZSBwbHVnaW4uXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHBsdWdpbkluaXQ6IC0+XG4gICAgaWYgQG9wdGlvbnMudG9rZW5cbiAgICAgIHRoaXMuc2V0VG9rZW4oQG9wdGlvbnMudG9rZW4pXG4gICAgZWxzZVxuICAgICAgdGhpcy5yZXF1ZXN0VG9rZW4oKVxuXG4gICMgUHVibGljOiBNYWtlcyBhIHJlcXVlc3QgdG8gdGhlIGxvY2FsIHNlcnZlciBmb3IgYW4gYXV0aGVudGljYXRpb24gdG9rZW4uXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBhdXRoLnJlcXVlc3RUb2tlbigpXG4gICNcbiAgIyBSZXR1cm5zIGpxWEhSIG9iamVjdC5cbiAgcmVxdWVzdFRva2VuOiAtPlxuICAgIEByZXF1ZXN0SW5Qcm9ncmVzcyA9IHRydWVcblxuICAgICQuYWpheFxuICAgICAgdXJsOiBAb3B0aW9ucy50b2tlblVybFxuICAgICAgZGF0YVR5cGU6ICd0ZXh0J1xuICAgICAgZGF0YTogQG9wdGlvbnMucmVxdWVzdERhdGFcbiAgICAgIHR5cGU6IEBvcHRpb25zLnJlcXVlc3RNZXRob2RcbiAgICAgIHhockZpZWxkczpcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlICMgU2VuZCBhbnkgYXV0aCBjb29raWVzIHRvIHRoZSBiYWNrZW5kXG5cbiAgICAjIG9uIHN1Y2Nlc3MsIHNldCB0aGUgYXV0aCB0b2tlblxuICAgIC5kb25lIChkYXRhLCBzdGF0dXMsIHhocikgPT5cbiAgICAgIHRoaXMuc2V0VG9rZW4oZGF0YSlcblxuICAgICMgb24gZmFpbHVyZSwgcmVsYXkgYW55IG1lc3NhZ2UgZ2l2ZW4gYnkgdGhlIHNlcnZlciB0byB0aGUgdXNlciB3aXRoIGEgbm90aWZpY2F0aW9uXG4gICAgLmZhaWwgKHhociwgc3RhdHVzLCBlcnIpID0+XG4gICAgICBpZiB4aHIuc3RhdHVzID09IDQwMVxuICAgICAgICBjYWxsYmFjayA9IEBvcHRpb25zLnVuYXV0aG9yaXplZENhbGxiYWNrIFxuICAgICAgICBpZiBjYWxsYmFjaz8gYW5kIGNhbGxiYWNrKHRoaXMpXG4gICAgICAgICAgIyB0cnkgYWdhaW4gaW4gMXMgaWYgY2FsbGJhY2sgcmV0dXJucyB0cnVlXG4gICAgICAgICAgQHJldHJ5VGltZW91dCA9IHNldFRpbWVvdXQgKCgpID0+IHRoaXMucmVxdWVzdFRva2VuKCkpLCAxMDAwXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgXG4gICAgICBtc2cgPSBBbm5vdGF0b3IuX3QoXCJDb3VsZG4ndCBnZXQgYXV0aCB0b2tlbjpcIilcbiAgICAgIGNvbnNvbGUuZXJyb3IgXCIje21zZ30gI3tlcnJ9XCIsIHhoclxuICAgICAgQW5ub3RhdG9yLnNob3dOb3RpZmljYXRpb24oXCIje21zZ30gI3t4aHIucmVzcG9uc2VUZXh0fVwiLCBBbm5vdGF0b3IuTm90aWZpY2F0aW9uLkVSUk9SKVxuXG4gICAgIyBhbHdheXMgcmVzZXQgdGhlIHJlcXVlc3RJblByb2dyZXNzIGluZGljYXRvclxuICAgIC5hbHdheXMgPT5cbiAgICAgIEByZXF1ZXN0SW5Qcm9ncmVzcyA9IGZhbHNlXG5cbiAgIyBQdWJsaWM6IFNldHMgdGhlIEB0b2tlbiBhbmQgY2hlY2tzIGl0J3MgdmFsaWRpdHkuIElmIHRoZSB0b2tlbiBpcyBpbnZhbGlkXG4gICMgcmVxdWVzdHMgYSBuZXcgb25lIGZyb20gdGhlIHNlcnZlci5cbiAgI1xuICAjIHRva2VuIC0gQSB0b2tlbiBzdHJpbmcuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBhdXRoLnNldFRva2VuKCdleUpoLi4uOWpRM0knKVxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBzZXRUb2tlbjogKHRva2VuKSAtPlxuICAgIEB0b2tlbiA9IHRva2VuXG4gICAgIyBQYXJzZSB0aGUgdG9rZW4gd2l0aG91dCB2ZXJpZnlpbmcgaXRzIGF1dGhlbnRpY2l0eTpcbiAgICBAX3Vuc2FmZVRva2VuID0gcGFyc2VUb2tlbih0b2tlbilcblxuICAgIGlmIHRoaXMuaGF2ZVZhbGlkVG9rZW4oKVxuICAgICAgaWYgQG9wdGlvbnMuYXV0b0ZldGNoXG4gICAgICAgICMgU2V0IHRpbWVvdXQgdG8gZmV0Y2ggbmV3IHRva2VuIDIgc2Vjb25kcyBiZWZvcmUgY3VycmVudCB0b2tlbiBleHBpcnlcbiAgICAgICAgQHJlZnJlc2hUaW1lb3V0ID0gc2V0VGltZW91dCAoKCkgPT4gdGhpcy5yZXF1ZXN0VG9rZW4oKSksICh0aGlzLnRpbWVUb0V4cGlyeSgpIC0gMikgKiAxMDAwXG5cbiAgICAgICMgU2V0IGhlYWRlcnMgZmllbGQgb24gdGhpcy5lbGVtZW50XG4gICAgICB0aGlzLnVwZGF0ZUhlYWRlcnMoKVxuXG4gICAgICAjIFJ1biBjYWxsYmFja3Mgd2FpdGluZyBmb3IgdG9rZW5cbiAgICAgIHdoaWxlIEB3YWl0aW5nRm9yVG9rZW4ubGVuZ3RoID4gMFxuICAgICAgICBAd2FpdGluZ0ZvclRva2VuLnBvcCgpKEBfdW5zYWZlVG9rZW4pXG5cbiAgICBlbHNlXG4gICAgICBjb25zb2xlLndhcm4gQW5ub3RhdG9yLl90KFwiRGlkbid0IGdldCBhIHZhbGlkIHRva2VuLlwiKVxuICAgICAgaWYgQG9wdGlvbnMuYXV0b0ZldGNoXG4gICAgICAgIGNvbnNvbGUud2FybiBBbm5vdGF0b3IuX3QoXCJHZXR0aW5nIGEgbmV3IHRva2VuIGluIDEwcy5cIilcbiAgICAgICAgc2V0VGltZW91dCAoKCkgPT4gdGhpcy5yZXF1ZXN0VG9rZW4oKSksIDEwICogMTAwMFxuXG4gICMgUHVibGljOiBDaGVja3MgdGhlIHZhbGlkaXR5IG9mIHRoZSBjdXJyZW50IHRva2VuLiBOb3RlIHRoYXQgdGhpcyAqZG9lc1xuICAjIG5vdCogY2hlY2sgdGhlIGF1dGhlbnRpY2l0eSBvZiB0aGUgdG9rZW4uXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBhdXRoLmhhdmVWYWxpZFRva2VuKCkgIyA9PiBSZXR1cm5zIHRydWUgaWYgdmFsaWQuXG4gICNcbiAgIyBSZXR1cm5zIHRydWUgaWYgdGhlIHRva2VuIGlzIHZhbGlkLlxuICBoYXZlVmFsaWRUb2tlbjogKCkgLT5cbiAgICBhbGxGaWVsZHMgPSAoXG4gICAgICBAX3Vuc2FmZVRva2VuIGFuZFxuICAgICAgQF91bnNhZmVUb2tlbi5pc3N1ZWRBdCBhbmRcbiAgICAgIEBfdW5zYWZlVG9rZW4udHRsIGFuZFxuICAgICAgQF91bnNhZmVUb2tlbi5jb25zdW1lcktleVxuICAgIClcblxuICAgIGlmIGFsbEZpZWxkcyAmJiB0aGlzLnRpbWVUb0V4cGlyeSgpID4gMFxuICAgICAgcmV0dXJuIHRydWVcbiAgICBlbHNlXG4gICAgICByZXR1cm4gZmFsc2VcblxuICAjIFB1YmxpYzogQ2FsY3VsYXRlcyB0aGUgdGltZSBpbiBzZWNvbmRzIHVudGlsIHRoZSBjdXJyZW50IHRva2VuIGV4cGlyZXMuXG4gICNcbiAgIyBSZXR1cm5zIE51bWJlciBvZiBzZWNvbmRzIHVudGlsIHRva2VuIGV4cGlyZXMuXG4gIHRpbWVUb0V4cGlyeTogLT5cbiAgICBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDBcbiAgICBpc3N1ZSA9IGNyZWF0ZURhdGVGcm9tSVNPODYwMShAX3Vuc2FmZVRva2VuLmlzc3VlZEF0KS5nZXRUaW1lKCkgLyAxMDAwXG5cbiAgICBleHBpcnkgPSBpc3N1ZSArIEBfdW5zYWZlVG9rZW4udHRsXG4gICAgdGltZVRvRXhwaXJ5ID0gZXhwaXJ5IC0gbm93XG5cbiAgICBpZiAodGltZVRvRXhwaXJ5ID4gMCkgdGhlbiB0aW1lVG9FeHBpcnkgZWxzZSAwXG5cbiAgIyBQdWJsaWM6IFVwZGF0ZXMgdGhlIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZSBTdG9yZSByZXF1ZXN0cy5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgdXBkYXRlSGVhZGVyczogLT5cbiAgICBpZiB0aGlzLmFubm90YXRvci5yZWdpc3RyeS5zdG9yZT8uc2V0SGVhZGVyP1xuICAgICAgdGhpcy5hbm5vdGF0b3IucmVnaXN0cnkuc3RvcmUuc2V0SGVhZGVyKCd4LWFubm90YXRvci1hdXRoLXRva2VuJywgQHRva2VuKVxuXG4gICMgUnVucyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgaWYgYSB2YWxpZCB0b2tlbiBpcyBhdmFpbGFibGUuIE90aGVyd2lzZSByZXF1ZXN0c1xuICAjIGEgdG9rZW4gdW50aWwgaXQgcmVjaWV2ZXMgYSB2YWxpZCBvbmUuXG4gICNcbiAgIyBjYWxsYmFjayAtIEEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIGEgdmFsaWQgdG9rZW4gaXMgb2J0YWluZWQuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBhdXRoLndpdGhUb2tlbiAtPlxuICAjICAgICBzdG9yZS5sb2FkQW5ub3RhdGlvbnMoKVxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICB3aXRoVG9rZW46IChjYWxsYmFjaykgLT5cbiAgICBpZiBub3QgY2FsbGJhY2s/XG4gICAgICByZXR1cm5cblxuICAgIGlmIHRoaXMuaGF2ZVZhbGlkVG9rZW4oKVxuICAgICAgY2FsbGJhY2soQF91bnNhZmVUb2tlbilcbiAgICBlbHNlXG4gICAgICB0aGlzLndhaXRpbmdGb3JUb2tlbi5wdXNoKGNhbGxiYWNrKVxuICAgICAgaWYgbm90IEByZXF1ZXN0SW5Qcm9ncmVzc1xuICAgICAgICB0aGlzLnJlcXVlc3RUb2tlbigpXG5cblxubW9kdWxlLmV4cG9ydHMgPSBBbm5vdGF0b3IuUGx1Z2luLkF1dGhcbiIsIkFubm90YXRvciA9IHJlcXVpcmUoJ2Fubm90YXRvcicpXG5cblxuY2xhc3MgQW5ub3RhdG9yLlBsdWdpbi5GaWx0ZXIgZXh0ZW5kcyBBbm5vdGF0b3IuUGx1Z2luXG4gICMgRXZlbnRzIGFuZCBjYWxsYmFja3MgdG8gYmluZCB0byB0aGUgRmlsdGVyI2VsZW1lbnQuXG4gIGV2ZW50czpcbiAgICBcIi5hbm5vdGF0b3ItZmlsdGVyLXByb3BlcnR5IGlucHV0IGZvY3VzXCI6IFwiX29uRmlsdGVyRm9jdXNcIlxuICAgIFwiLmFubm90YXRvci1maWx0ZXItcHJvcGVydHkgaW5wdXQgYmx1clwiOiAgXCJfb25GaWx0ZXJCbHVyXCJcbiAgICBcIi5hbm5vdGF0b3ItZmlsdGVyLXByb3BlcnR5IGlucHV0IGtleXVwXCI6IFwiX29uRmlsdGVyS2V5dXBcIlxuICAgIFwiLmFubm90YXRvci1maWx0ZXItcHJldmlvdXMgY2xpY2tcIjogICAgICAgXCJfb25QcmV2aW91c0NsaWNrXCJcbiAgICBcIi5hbm5vdGF0b3ItZmlsdGVyLW5leHQgY2xpY2tcIjogICAgICAgICAgIFwiX29uTmV4dENsaWNrXCJcbiAgICBcIi5hbm5vdGF0b3ItZmlsdGVyLWNsZWFyIGNsaWNrXCI6ICAgICAgICAgIFwiX29uQ2xlYXJDbGlja1wiXG5cbiAgIyBDb21tb24gY2xhc3NlcyB1c2VkIHRvIGNoYW5nZSBwbHVnaW4gc3RhdGUuXG4gIGNsYXNzZXM6XG4gICAgYWN0aXZlOiAgICdhbm5vdGF0b3ItZmlsdGVyLWFjdGl2ZSdcbiAgICBobDpcbiAgICAgIGhpZGU6ICAgJ2Fubm90YXRvci1obC1maWx0ZXJlZCdcbiAgICAgIGFjdGl2ZTogJ2Fubm90YXRvci1obC1hY3RpdmUnXG5cbiAgIyBIVE1MIHRlbXBsYXRlcyBmb3IgdGhlIHBsdWdpbiBVSS5cbiAgaHRtbDpcbiAgICBlbGVtZW50OiBcIlwiXCJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5ub3RhdG9yLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgPHN0cm9uZz5cIlwiXCIgKyBBbm5vdGF0b3IuX3QoJ05hdmlnYXRlOicpICsgXCJcIlwiPC9zdHJvbmc+XG4gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFubm90YXRvci1maWx0ZXItbmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFubm90YXRvci1maWx0ZXItcHJldmlvdXNcIj5cIlwiXCIgKyBBbm5vdGF0b3IuX3QoJ1ByZXZpb3VzJykgKyBcIlwiXCI8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhbm5vdGF0b3ItZmlsdGVyLW5leHRcIj5cIlwiXCIgKyBBbm5vdGF0b3IuX3QoJ05leHQnKSArIFwiXCJcIjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgPHN0cm9uZz5cIlwiXCIgKyBBbm5vdGF0b3IuX3QoJ0ZpbHRlciBieTonKSArIFwiXCJcIjwvc3Ryb25nPlxuICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgIFwiXCJcIlxuICAgIGZpbHRlcjogIFwiXCJcIlxuICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW5ub3RhdG9yLWZpbHRlci1wcm9wZXJ0eVwiPlxuICAgICAgICAgICAgICAgPGxhYmVsPjwvbGFiZWw+XG4gICAgICAgICAgICAgICA8aW5wdXQvPlxuICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhbm5vdGF0b3ItZmlsdGVyLWNsZWFyXCI+XCJcIlwiICsgQW5ub3RhdG9yLl90KCdDbGVhcicpICsgXCJcIlwiPC9idXR0b24+XG4gICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgIFwiXCJcIlxuXG4gICMgRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgcGx1Z2luLlxuICBvcHRpb25zOlxuICAgICMgQSBDU1Mgc2VsZWN0b3Igb3IgRWxlbWVudCB0byBhcHBlbmQgdGhlIHBsdWdpbiB0b29sYmFyIHRvLlxuICAgIGFwcGVuZFRvOiAnYm9keSdcblxuICAgICMgQW4gYXJyYXkgb2YgZmlsdGVycyBjYW4gYmUgcHJvdmlkZWQgb24gaW5pdGlhbGlzYXRpb24uXG4gICAgZmlsdGVyczogW11cblxuICAgICMgQWRkcyBhIGRlZmF1bHQgZmlsdGVyIG9uIGFubm90YXRpb25zLlxuICAgIGFkZEFubm90YXRpb25GaWx0ZXI6IHRydWVcblxuICAgICMgUHVibGljOiBEZXRlcm1pbmVzIGlmIHRoZSBwcm9wZXJ0eSBpcyBjb250YWluZWQgd2l0aGluIHRoZSBwcm92aWRlZFxuICAgICMgYW5ub3RhdGlvbiBwcm9wZXJ0eS4gRGVmYXVsdCBpcyB0byBzcGxpdCB0aGUgc3RyaW5nIG9uIHNwYWNlcyBhbmQgb25seVxuICAgICMgcmV0dXJuIHRydWUgaWYgYWxsIGtleXdvcmRzIGFyZSBjb250YWluZWQgaW4gdGhlIHN0cmluZy4gVGhpcyBtZXRob2RcbiAgICAjIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSB1c2VyIHdoZW4gaW5pdGlhbGlzaW5nIHRoZSBwbHVnaW4uXG4gICAgI1xuICAgICMgc3RyaW5nICAgLSBBbiBpbnB1dCBTdHJpbmcgZnJvbSB0aGUgZml0bGVyLlxuICAgICMgcHJvcGVydHkgLSBUaGUgYW5ub3RhdGlvbiBwcm9wZXJ5IHRvIHF1ZXJ5LlxuICAgICNcbiAgICAjIEV4YW1wbGVzXG4gICAgI1xuICAgICMgICBwbHVnaW4ub3B0aW9uLmdldEtleXdvcmRzKCdoZWxsbycsICdoZWxsbyB3b3JsZCBob3cgYXJlIHlvdT8nKVxuICAgICMgICAjID0+IFJldHVybnMgdHJ1ZVxuICAgICNcbiAgICAjICAgcGx1Z2luLm9wdGlvbi5nZXRLZXl3b3JkcygnaGVsbG8gYmlsbCcsICdoZWxsbyB3b3JsZCBob3cgYXJlIHlvdT8nKVxuICAgICMgICAjID0+IFJldHVybnMgZmFsc2VcbiAgICAjXG4gICAgIyBSZXR1cm5zIGFuIEFycmF5IG9mIGtleXdvcmQgU3RyaW5ncy5cbiAgICBpc0ZpbHRlcmVkOiAoaW5wdXQsIHByb3BlcnR5KSAtPlxuICAgICAgcmV0dXJuIGZhbHNlIHVubGVzcyBpbnB1dCBhbmQgcHJvcGVydHlcblxuICAgICAgZm9yIGtleXdvcmQgaW4gKGlucHV0LnNwbGl0IC9cXHMrLylcbiAgICAgICAgcmV0dXJuIGZhbHNlIGlmIHByb3BlcnR5LmluZGV4T2Yoa2V5d29yZCkgPT0gLTFcblxuICAgICAgcmV0dXJuIHRydWVcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRmlsdGVyIHBsdWdpbi5cbiAgI1xuICAjIGVsZW1lbnQgLSBUaGUgQW5ub3RhdG9yIGVsZW1lbnQgKHRoaXMgaXMgaWdub3JlZCBieSB0aGUgcGx1Z2luKS5cbiAgIyBvcHRpb25zIC0gQW4gT2JqZWN0IGxpdGVyYWwgb2Ygb3B0aW9ucy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGZpbHRlciA9IG5ldyBBbm5vdGF0b3IuUGx1Z2luLkZpbHRlcihhbm5vdGF0b3IuZWxlbWVudClcbiAgI1xuICAjIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEZpbHRlciBwbHVnaW4uXG4gIGNvbnN0cnVjdG9yOiAoZWxlbWVudCwgb3B0aW9ucykgLT5cbiAgICAjIEFzIG1vc3QgZXZlbnRzIGZvciB0aGlzIHBsdWdpbiBhcmUgcmVsYXRpdmUgdG8gdGhlIHRvb2xiYXIgd2hpY2ggaXNcbiAgICAjIG5vdCBpbnNpZGUgdGhlIEFubm90YXRvciNFbGVtZW50IHdlIG92ZXJyaWRlIHRoZSBlbGVtZW50IHByb3BlcnR5LlxuICAgICMgQW5ub3RhdG9yI0VsZW1lbnQgY2FuIHN0aWxsIGJlIGFjY2Vzc2VkIHZpYSBAYW5ub3RhdG9yLmVsZW1lbnQuXG4gICAgZWxlbWVudCA9ICQoQGh0bWwuZWxlbWVudCkuYXBwZW5kVG8ob3B0aW9ucz8uYXBwZW5kVG8gb3IgQG9wdGlvbnMuYXBwZW5kVG8pXG5cbiAgICBzdXBlciBlbGVtZW50LCBvcHRpb25zXG5cbiAgICBAb3B0aW9ucy5maWx0ZXJzIG9yPSBbXVxuXG4gICAgQGZpbHRlciAgPSAkKEBodG1sLmZpbHRlcilcbiAgICBAZmlsdGVycyA9IFtdXG4gICAgQGN1cnJlbnQgID0gMFxuXG4gICMgUHVibGljOiBBZGRzIG5ldyBmaWx0ZXJzLiBVcGRhdGVzIHRoZSBAaGlnaGxpZ2h0cyBjYWNoZSBhbmQgY3JlYXRlcyBldmVudFxuICAjIGxpc3RlbmVycyBvbiB0aGUgYW5ub3RhdG9yIG9iamVjdC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgcGx1Z2luSW5pdDogLT5cbiAgICBmb3IgZmlsdGVyIGluIEBvcHRpb25zLmZpbHRlcnNcbiAgICAgIHRoaXMuYWRkRmlsdGVyKGZpbHRlcilcblxuICAgIHRoaXMudXBkYXRlSGlnaGxpZ2h0cygpXG4gICAgdGhpcy5fc2V0dXBMaXN0ZW5lcnMoKS5faW5zZXJ0U3BhY2VyKClcblxuICAgIGlmIEBvcHRpb25zLmFkZEFubm90YXRpb25GaWx0ZXIgPT0gdHJ1ZVxuICAgICAgdGhpcy5hZGRGaWx0ZXIge2xhYmVsOiBBbm5vdGF0b3IuX3QoJ0Fubm90YXRpb24nKSwgcHJvcGVydHk6ICd0ZXh0J31cblxuICAjIFB1YmxpYzogcmVtb3ZlIHRoZSBmaWx0ZXIgcGx1Z2luIGluc3RhbmNlIGFuZCB1bmJpbmQgZXZlbnRzLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBkZXN0cm95OiAtPlxuICAgIHN1cGVyXG4gICAgaHRtbCA9ICQoJ2h0bWwnKVxuICAgIGN1cnJlbnRNYXJnaW4gPSBwYXJzZUludChodG1sLmNzcygncGFkZGluZy10b3AnKSwgMTApIHx8IDBcbiAgICBodG1sLmNzcygncGFkZGluZy10b3AnLCBjdXJyZW50TWFyZ2luIC0gQGVsZW1lbnQub3V0ZXJIZWlnaHQoKSlcbiAgICBAZWxlbWVudC5yZW1vdmUoKVxuXG4gICMgQWRkcyBtYXJnaW4gdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGFubm90YXRpb24gdG9vbGJhclxuICAjIGRvZXNuJ3QgY292ZXIgdGhlIHBhZ2Ugd2hlbiBub3Qgc2Nyb2xsZWQuXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZlxuICBfaW5zZXJ0U3BhY2VyOiAtPlxuICAgIGh0bWwgPSAkKCdodG1sJylcbiAgICBjdXJyZW50TWFyZ2luID0gcGFyc2VJbnQoaHRtbC5jc3MoJ3BhZGRpbmctdG9wJyksIDEwKSB8fCAwXG4gICAgaHRtbC5jc3MoJ3BhZGRpbmctdG9wJywgY3VycmVudE1hcmdpbiArIEBlbGVtZW50Lm91dGVySGVpZ2h0KCkpXG4gICAgdGhpc1xuXG4gICMgTGlzdGVucyB0byBhbm5vdGF0aW9uIGNoYW5nZSBldmVudHMgb24gdGhlIEFubm90YXRvciBpbiBvcmRlciB0byByZWZyZXNoXG4gICMgdGhlIEBhbm5vdGF0aW9ucyBjb2xsZWN0aW9uLlxuICAjIFRPRE86IE1ha2UgdGhpcyBtb3JlIGdyYW51bGFyIHNvIHRoZSBlbnRpcmUgY29sbGVjdGlvbiBpc24ndCByZWxvYWRlZCBmb3JcbiAgIyBldmVyeSBzaW5nbGUgY2hhbmdlLlxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYuXG4gIF9zZXR1cExpc3RlbmVyczogLT5cbiAgICBldmVudHMgPSBbXG4gICAgICAnYW5ub3RhdGlvbnNMb2FkZWQnLCAnYW5ub3RhdGlvbkNyZWF0ZWQnLFxuICAgICAgJ2Fubm90YXRpb25VcGRhdGVkJywgJ2Fubm90YXRpb25EZWxldGVkJ1xuICAgIF1cblxuICAgIGZvciBldmVudCBpbiBldmVudHNcbiAgICAgIEBhbm5vdGF0b3Iuc3Vic2NyaWJlIGV2ZW50LCB0aGlzLnVwZGF0ZUhpZ2hsaWdodHNcbiAgICB0aGlzXG5cbiAgIyBQdWJsaWM6IEFkZHMgYSBmaWx0ZXIgdG8gdGhlIHRvb2xiYXIuIFRoZSBmaWx0ZXIgbXVzdCBoYXZlIGJvdGggYSBsYWJlbFxuICAjIGFuZCBhIHByb3BlcnR5IG9mIGFuIGFubm90YXRpb24gb2JqZWN0IHRvIGZpbHRlciBvbi5cbiAgI1xuICAjIG9wdGlvbnMgLSBBbiBPYmplY3QgbGl0ZXJhbCBjb250YWluaW5nIHRoZSBmaWx0ZXJzIG9wdGlvbnMuXG4gICMgICAgICAgICAgIGxhYmVsICAgICAgLSBBIHB1YmxpYyBmYWNpbmcgU3RyaW5nIHRvIHJlcHJlc2VudCB0aGUgZmlsdGVyLlxuICAjICAgICAgICAgICBwcm9wZXJ0eSAgIC0gQW4gYW5ub3RhdGlvbiBwcm9wZXJ0eSBTdHJpbmcgdG8gZmlsdGVyIG9uLlxuICAjICAgICAgICAgICBpc0ZpbHRlcmVkIC0gQSBjYWxsYmFjayBGdW5jdGlvbiB0aGF0IHJlY2lldmVzIHRoZSBmaWVsZCBpbnB1dFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYW5kIHRoZSBhbm5vdGF0aW9uIHByb3BlcnR5IHZhbHVlLiBTZWVcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgIEBvcHRpb25zLmlzRmlsdGVyZWQoKSBmb3IgZGV0YWlscy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgU2V0IHVwIGEgZmlsdGVyIHRvIGZpbHRlciBvbiB0aGUgYW5ub3RhdGlvbi51c2VyIHByb3BlcnR5LlxuICAjICAgZmlsdGVyLmFkZEZpbHRlcih7XG4gICMgICAgIGxhYmVsOiBVc2VyLFxuICAjICAgICBwcm9wZXJ0eTogJ3VzZXInXG4gICMgICB9KVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmcuXG4gIGFkZEZpbHRlcjogKG9wdGlvbnMpIC0+XG4gICAgZmlsdGVyID0gJC5leHRlbmQoe1xuICAgICAgbGFiZWw6ICcnXG4gICAgICBwcm9wZXJ0eTogJydcbiAgICAgIGlzRmlsdGVyZWQ6IEBvcHRpb25zLmlzRmlsdGVyZWRcbiAgICB9LCBvcHRpb25zKVxuXG4gICAgIyBTa2lwIGlmIGEgZmlsdGVyIGZvciB0aGlzIHByb3BlcnR5IGhhcyBiZWVuIGxvYWRlZC5cbiAgICB1bmxlc3MgKGYgZm9yIGYgaW4gQGZpbHRlcnMgd2hlbiBmLnByb3BlcnR5ID09IGZpbHRlci5wcm9wZXJ0eSkubGVuZ3RoXG4gICAgICBmaWx0ZXIuaWQgPSAnYW5ub3RhdG9yLWZpbHRlci0nICsgZmlsdGVyLnByb3BlcnR5XG4gICAgICBmaWx0ZXIuYW5ub3RhdGlvbnMgPSBbXVxuICAgICAgZmlsdGVyLmVsZW1lbnQgPSBAZmlsdGVyLmNsb25lKCkuYXBwZW5kVG8oQGVsZW1lbnQpXG4gICAgICBmaWx0ZXIuZWxlbWVudC5maW5kKCdsYWJlbCcpXG4gICAgICAgIC5odG1sKGZpbHRlci5sYWJlbClcbiAgICAgICAgLmF0dHIoJ2ZvcicsIGZpbHRlci5pZClcbiAgICAgIGZpbHRlci5lbGVtZW50LmZpbmQoJ2lucHV0JylcbiAgICAgICAgLmF0dHIoe1xuICAgICAgICAgIGlkOiBmaWx0ZXIuaWRcbiAgICAgICAgICBwbGFjZWhvbGRlcjogQW5ub3RhdG9yLl90KCdGaWx0ZXIgYnkgJykgKyBmaWx0ZXIubGFiZWwgKyAnXFx1MjAyNidcbiAgICAgICAgfSlcbiAgICAgIGZpbHRlci5lbGVtZW50LmZpbmQoJ2J1dHRvbicpLmhpZGUoKVxuXG4gICAgICAjIEFkZCB0aGUgZmlsdGVyIHRvIHRoZSBlbGVtZW50cyBkYXRhIHN0b3JlLlxuICAgICAgZmlsdGVyLmVsZW1lbnQuZGF0YSAnZmlsdGVyJywgZmlsdGVyXG5cbiAgICAgIEBmaWx0ZXJzLnB1c2ggZmlsdGVyXG5cbiAgICB0aGlzXG5cbiAgIyBQdWJsaWM6IFVwZGF0ZXMgdGhlIGZpbHRlci5hbm5vdGF0aW9ucyBwcm9wZXJ0eS4gVGhlbiB1cGRhdGVzIHRoZSBzdGF0ZVxuICAjIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgRE9NLiBDYWxscyB0aGUgZmlsdGVyLmlzRmlsdGVyZWQoKSBtZXRob2QgdG9cbiAgIyBkZXRlcm1pbmUgaWYgdGhlIGFubm90YXRpb24gc2hvdWxkIHJlbWFpbi5cbiAgI1xuICAjIGZpbHRlciAtIEEgZmlsdGVyIE9iamVjdCBmcm9tIEBmaWx0ZXJzXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBmaWx0ZXIudXBkYXRlRmlsdGVyKG15RmlsdGVyKVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nXG4gIHVwZGF0ZUZpbHRlcjogKGZpbHRlcikgLT5cbiAgICBmaWx0ZXIuYW5ub3RhdGlvbnMgPSBbXVxuXG4gICAgdGhpcy51cGRhdGVIaWdobGlnaHRzKClcbiAgICB0aGlzLnJlc2V0SGlnaGxpZ2h0cygpXG4gICAgaW5wdXQgPSAkLnRyaW0gZmlsdGVyLmVsZW1lbnQuZmluZCgnaW5wdXQnKS52YWwoKVxuXG4gICAgaWYgaW5wdXRcbiAgICAgIGFubm90YXRpb25zID0gQGhpZ2hsaWdodHMubWFwIC0+ICQodGhpcykuZGF0YSgnYW5ub3RhdGlvbicpXG5cbiAgICAgIGZvciBhbm5vdGF0aW9uIGluICQubWFrZUFycmF5KGFubm90YXRpb25zKVxuICAgICAgICBwcm9wZXJ0eSA9IGFubm90YXRpb25bZmlsdGVyLnByb3BlcnR5XVxuICAgICAgICBpZiBmaWx0ZXIuaXNGaWx0ZXJlZCBpbnB1dCwgcHJvcGVydHlcbiAgICAgICAgICBmaWx0ZXIuYW5ub3RhdGlvbnMucHVzaCBhbm5vdGF0aW9uXG5cbiAgICAgIHRoaXMuZmlsdGVySGlnaGxpZ2h0cygpXG5cbiAgIyBQdWJsaWM6IFVwZGF0ZXMgdGhlIEBoaWdobGlnaHRzIHByb3BlcnR5IHdpdGggdGhlIGxhdGVzdCBoaWdobGlnaHRcbiAgIyBlbGVtZW50cyBpbiB0aGUgRE9NLlxuICAjXG4gICMgUmV0dXJucyBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIHRoZSBoaWdobGlnaHQgZWxlbWVudHMuXG4gIHVwZGF0ZUhpZ2hsaWdodHM6ID0+XG4gICAgIyBJZ25vcmUgYW55IGhpZGRlbiBoaWdobGlnaHRzLlxuICAgIEBoaWdobGlnaHRzID0gQGFubm90YXRvci5lbGVtZW50LmZpbmQoJy5hbm5vdGF0b3ItaGw6dmlzaWJsZScpXG4gICAgQGZpbHRlcmVkICAgPSBAaGlnaGxpZ2h0cy5ub3QoQGNsYXNzZXMuaGwuaGlkZSlcblxuICAjIFB1YmxpYzogUnVucyB0aHJvdWdoIGVhY2ggb2YgdGhlIGZpbHRlcnMgYW5kIHJlbW92ZXMgYWxsIGhpZ2hsaWdodHMgbm90XG4gICMgY3VycmVudGx5IGluIHNjb3BlLlxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICBmaWx0ZXJIaWdobGlnaHRzOiAtPlxuICAgIGFjdGl2ZUZpbHRlcnMgPSAkLmdyZXAgQGZpbHRlcnMsIChmaWx0ZXIpIC0+ICEhZmlsdGVyLmFubm90YXRpb25zLmxlbmd0aFxuXG4gICAgZmlsdGVyZWQgPSBhY3RpdmVGaWx0ZXJzWzBdPy5hbm5vdGF0aW9ucyB8fCBbXVxuICAgIGlmIGFjdGl2ZUZpbHRlcnMubGVuZ3RoID4gMVxuICAgICAgIyBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBmaWx0ZXIgdGhlbiBvbmx5IGFubm90YXRpb25zIG1hdGNoZWQgaW4gZXZlcnlcbiAgICAgICMgZmlsdGVyIHNob3VsZCByZW1haW4uXG4gICAgICBhbm5vdGF0aW9ucyA9IFtdXG4gICAgICAkLmVhY2ggYWN0aXZlRmlsdGVycywgLT5cbiAgICAgICAgJC5tZXJnZShhbm5vdGF0aW9ucywgdGhpcy5hbm5vdGF0aW9ucylcblxuICAgICAgdW5pcXVlcyAgPSBbXVxuICAgICAgZmlsdGVyZWQgPSBbXVxuICAgICAgJC5lYWNoIGFubm90YXRpb25zLCAtPlxuICAgICAgICBpZiAkLmluQXJyYXkodGhpcywgdW5pcXVlcykgPT0gLTFcbiAgICAgICAgICB1bmlxdWVzLnB1c2ggdGhpc1xuICAgICAgICBlbHNlXG4gICAgICAgICAgZmlsdGVyZWQucHVzaCB0aGlzXG5cbiAgICBoaWdobGlnaHRzID0gQGhpZ2hsaWdodHNcbiAgICBmb3IgYW5ub3RhdGlvbiwgaW5kZXggaW4gZmlsdGVyZWRcbiAgICAgIGhpZ2hsaWdodHMgPSBoaWdobGlnaHRzLm5vdChhbm5vdGF0aW9uLmhpZ2hsaWdodHMpXG5cbiAgICBoaWdobGlnaHRzLmFkZENsYXNzKEBjbGFzc2VzLmhsLmhpZGUpXG5cbiAgICBAZmlsdGVyZWQgPSBAaGlnaGxpZ2h0cy5ub3QoQGNsYXNzZXMuaGwuaGlkZSlcbiAgICB0aGlzXG5cbiAgIyBQdWJsaWM6IFJlbW92ZXMgaGlkZGVuIGNsYXNzIGZyb20gYWxsIGFubm90YXRpb25zLlxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICByZXNldEhpZ2hsaWdodHM6IC0+XG4gICAgQGhpZ2hsaWdodHMucmVtb3ZlQ2xhc3MoQGNsYXNzZXMuaGwuaGlkZSlcbiAgICBAZmlsdGVyZWQgPSBAaGlnaGxpZ2h0c1xuICAgIHRoaXNcblxuICAjIFVwZGF0ZXMgdGhlIGZpbHRlciBmaWVsZCBvbiBmb2N1cy5cbiAgI1xuICAjIGV2ZW50IC0gQSBmb2N1cyBFdmVudCBvYmplY3QuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmdcbiAgX29uRmlsdGVyRm9jdXM6IChldmVudCkgPT5cbiAgICBpbnB1dCA9ICQoZXZlbnQudGFyZ2V0KVxuICAgIGlucHV0LnBhcmVudCgpLmFkZENsYXNzKEBjbGFzc2VzLmFjdGl2ZSlcbiAgICBpbnB1dC5uZXh0KCdidXR0b24nKS5zaG93KClcblxuICAjIFVwZGF0ZXMgdGhlIGZpbHRlciBmaWVsZCBvbiBibHVyLlxuICAjXG4gICMgZXZlbnQgLSBBIGJsdXIgRXZlbnQgb2JqZWN0LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBfb25GaWx0ZXJCbHVyOiAoZXZlbnQpID0+XG4gICAgdW5sZXNzIGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgaW5wdXQgPSAkKGV2ZW50LnRhcmdldClcbiAgICAgIGlucHV0LnBhcmVudCgpLnJlbW92ZUNsYXNzKEBjbGFzc2VzLmFjdGl2ZSlcbiAgICAgIGlucHV0Lm5leHQoJ2J1dHRvbicpLmhpZGUoKVxuXG4gICMgVXBkYXRlcyB0aGUgZmlsdGVyIGJhc2VkIG9uIHRoZSBpZCBvZiB0aGUgZmlsdGVyIGVsZW1lbnQuXG4gICNcbiAgIyBldmVudCAtIEEga2V5dXAgRXZlbnRcbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgX29uRmlsdGVyS2V5dXA6IChldmVudCkgPT5cbiAgICBmaWx0ZXIgPSAkKGV2ZW50LnRhcmdldCkucGFyZW50KCkuZGF0YSgnZmlsdGVyJylcbiAgICB0aGlzLnVwZGF0ZUZpbHRlciBmaWx0ZXIgaWYgZmlsdGVyXG5cbiAgIyBMb2NhdGVzIHRoZSBuZXh0L3ByZXZpb3VzIGhpZ2hsaWdodGVkIGVsZW1lbnQgaW4gQGhpZ2hsaWdodHMgZnJvbSB0aGVcbiAgIyBjdXJyZW50IG9uZSBvciBnb2VzIHRvIHRoZSB2ZXJ5IGZpcnN0L2xhc3QgZWxlbWVudCByZXNwZWN0aXZlbHkuXG4gICNcbiAgIyBwcmV2aW91cyAtIElmIHRydWUgZmluZHMgdGhlIHByZXZpb3VzbHkgaGlnaGxpZ2h0ZWQgZWxlbWVudC5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmLlxuICBfZmluZE5leHRIaWdobGlnaHQ6IChwcmV2aW91cykgLT5cbiAgICByZXR1cm4gdGhpcyB1bmxlc3MgQGhpZ2hsaWdodHMubGVuZ3RoXG5cbiAgICBvZmZzZXQgICAgICA9IGlmIHByZXZpb3VzIHRoZW4gMCAgICBlbHNlIC0xXG4gICAgcmVzZXRPZmZzZXQgPSBpZiBwcmV2aW91cyB0aGVuIC0xICAgZWxzZSAwXG4gICAgb3BlcmF0b3IgICAgPSBpZiBwcmV2aW91cyB0aGVuICdsdCcgZWxzZSAnZ3QnXG5cbiAgICBhY3RpdmUgID0gQGhpZ2hsaWdodHMubm90KCcuJyArIEBjbGFzc2VzLmhsLmhpZGUpXG4gICAgY3VycmVudCA9IGFjdGl2ZS5maWx0ZXIoJy4nICsgQGNsYXNzZXMuaGwuYWN0aXZlKVxuICAgIGN1cnJlbnQgPSBhY3RpdmUuZXEob2Zmc2V0KSB1bmxlc3MgY3VycmVudC5sZW5ndGhcblxuICAgIGFubm90YXRpb24gPSBjdXJyZW50LmRhdGEgJ2Fubm90YXRpb24nXG5cbiAgICBpbmRleCA9IGFjdGl2ZS5pbmRleCBjdXJyZW50WzBdXG4gICAgbmV4dCAgPSBhY3RpdmUuZmlsdGVyKFwiOiN7b3BlcmF0b3J9KCN7aW5kZXh9KVwiKS5ub3QoYW5ub3RhdGlvbi5oaWdobGlnaHRzKS5lcShyZXNldE9mZnNldClcbiAgICBuZXh0ICA9IGFjdGl2ZS5lcShyZXNldE9mZnNldCkgdW5sZXNzIG5leHQubGVuZ3RoXG5cbiAgICB0aGlzLl9zY3JvbGxUb0hpZ2hsaWdodCBuZXh0LmRhdGEoJ2Fubm90YXRpb24nKS5oaWdobGlnaHRzXG5cbiAgIyBMb2NhdGVzIHRoZSBuZXh0IGhpZ2hsaWdodGVkIGVsZW1lbnQgaW4gQGhpZ2hsaWdodHMgZnJvbSB0aGUgY3VycmVudCBvbmVcbiAgIyBvciBnb2VzIHRvIHRoZSB2ZXJ5IGZpcnN0IGVsZW1lbnQuXG4gICNcbiAgIyBldmVudCAtIEEgY2xpY2sgRXZlbnQuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmdcbiAgX29uTmV4dENsaWNrOiAoZXZlbnQpID0+XG4gICAgdGhpcy5fZmluZE5leHRIaWdobGlnaHQoKVxuXG4gICMgTG9jYXRlcyB0aGUgcHJldmlvdXMgaGlnaGxpZ2h0ZWQgZWxlbWVudCBpbiBAaGlnaGxpZ2h0cyBmcm9tIHRoZSBjdXJyZW50IG9uZVxuICAjIG9yIGdvZXMgdG8gdGhlIHZlcnkgbGFzdCBlbGVtZW50LlxuICAjXG4gICMgZXZlbnQgLSBBIGNsaWNrIEV2ZW50LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nXG4gIF9vblByZXZpb3VzQ2xpY2s6IChldmVudCkgPT5cbiAgICB0aGlzLl9maW5kTmV4dEhpZ2hsaWdodCB0cnVlXG5cbiAgIyBTY3JvbGxzIHRvIHRoZSBoaWdobGlnaHQgcHJvdmlkZWQuIEFuIGFkZHMgYW4gYWN0aXZlIGNsYXNzIHRvIGl0LlxuICAjXG4gICMgaGlnaGxpZ2h0IC0gRWl0aGVyIGhpZ2hsaWdodCBFbGVtZW50IG9yIGFuIEFycmF5IG9mIGVsZW1lbnRzLiBUaGlzIHZhbHVlXG4gICMgICAgICAgICAgICAgaXMgdXN1YWxseSByZXRyaWV2ZWQgZnJvbSBhbm5vdGF0aW9uLmhpZ2hsaWdodHMuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIF9zY3JvbGxUb0hpZ2hsaWdodDogKGhpZ2hsaWdodCkgLT5cbiAgICBoaWdobGlnaHQgPSAkKGhpZ2hsaWdodClcblxuICAgIEBoaWdobGlnaHRzLnJlbW92ZUNsYXNzKEBjbGFzc2VzLmhsLmFjdGl2ZSlcbiAgICBoaWdobGlnaHQuYWRkQ2xhc3MoQGNsYXNzZXMuaGwuYWN0aXZlKVxuXG4gICAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe1xuICAgICAgc2Nyb2xsVG9wOiBoaWdobGlnaHQub2Zmc2V0KCkudG9wIC0gKEBlbGVtZW50LmhlaWdodCgpICsgMjApXG4gICAgfSwgMTUwKVxuXG4gICMgQ2xlYXJzIHRoZSByZWxldmFudCBpbnB1dCB3aGVuIHRoZSBjbGVhciBidXR0b24gaXMgY2xpY2tlZC5cbiAgI1xuICAjIGV2ZW50IC0gQSBjbGljayBFdmVudCBvYmplY3QuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIF9vbkNsZWFyQ2xpY2s6IChldmVudCkgLT5cbiAgICAkKGV2ZW50LnRhcmdldCkucHJldignaW5wdXQnKS52YWwoJycpLmtleXVwKCkuYmx1cigpXG5cblxubW9kdWxlLmV4cG9ydHMgPSBBbm5vdGF0b3IuUGx1Z2luLkZpbHRlclxuIiwiQW5ub3RhdG9yID0gcmVxdWlyZSgnYW5ub3RhdG9yJylcblxuXG4jIFBsdWdpbiB0aGF0IHJlbmRlcnMgYW5ub3RhdGlvbiBjb21tZW50cyBkaXNwbGF5ZWQgaW4gdGhlIFZpZXdlciBpbiBNYXJrZG93bi5cbiMgUmVxdWlyZXMgU2hvd2Rvd24gbGlicmFyeSB0byBiZSBwcmVzZW50IGluIHRoZSBwYWdlIHdoZW4gaW5pdGlhbGlzZWQuXG5jbGFzcyBBbm5vdGF0b3IuUGx1Z2luLk1hcmtkb3duIGV4dGVuZHMgQW5ub3RhdG9yLlBsdWdpblxuICAjIEV2ZW50cyB0byBiZSBib3VuZCB0byB0aGUgQGVsZW1lbnQuXG4gIGV2ZW50czpcbiAgICAnYW5ub3RhdGlvblZpZXdlclRleHRGaWVsZCc6ICd1cGRhdGVUZXh0RmllbGQnXG5cbiAgIyBQdWJsaWM6IEluaXRhaWxpc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBNYXJrZG93biBwbHVnaW4uXG4gICNcbiAgIyBlbGVtZW50IC0gVGhlIEFubm90YXRvciNlbGVtZW50LlxuICAjIG9wdGlvbnMgLSBBbiBvcHRpb25zIE9iamVjdCAodGhlcmUgYXJlIGN1cnJlbnRseSBubyBvcHRpb25zKS5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHBsdWdpbiA9IG5ldyBBbm5vdGF0b3IuUGx1Z2luLk1hcmtkb3duKGFubm90YXRvci5lbGVtZW50KVxuICAjXG4gICMgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBBbm5vdGF0b3IuUGx1Z2luLk1hcmtkb3duLlxuICBjb25zdHJ1Y3RvcjogKGVsZW1lbnQsIG9wdGlvbnMpIC0+XG4gICAgaWYgU2hvd2Rvd24/LmNvbnZlcnRlcj9cbiAgICAgIHN1cGVyXG4gICAgICBAY29udmVydGVyID0gbmV3IFNob3dkb3duLmNvbnZlcnRlcigpXG4gICAgZWxzZVxuICAgICAgY29uc29sZS5lcnJvciBBbm5vdGF0b3IuX3QoXCJUbyB1c2UgdGhlIE1hcmtkb3duIHBsdWdpbiwgeW91IG11c3QgaW5jbHVkZSBTaG93ZG93biBpbnRvIHRoZSBwYWdlIGZpcnN0LlwiKVxuXG4gICMgQW5ub3RhdG9yIGV2ZW50IGNhbGxiYWNrLiBEaXNwbGF5cyB0aGUgYW5ub3RhdGlvbi50ZXh0IGFzIGEgTWFya2Rvd25cbiAgIyByZW5kZXJlZCB2ZXJzaW9uLlxuICAjXG4gICMgZmllbGQgICAgICAtIFRoZSB2aWV3ZXIgZmllbGQgRWxlbWVudC5cbiAgIyBhbm5vdGF0aW9uIC0gVGhlIGFubm90YXRpb24gT2JqZWN0IGJlaW5nIGRpc3BsYXllZC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgTm9ybWFsbHkgY2FsbGVkIGJ5IEFubm90YXRvciN2aWV3ZXIoKVxuICAjICAgcGx1Z2luLnVwZGF0ZVRleHRGaWVsZChmaWVsZCwge3RleHQ6ICdNeSBfbWFya2Rvd25fIGNvbW1lbnQnfSlcbiAgIyAgICQoZmllbGQpLmh0bWwoKSAjID0+IFJldHVybnMgXCJNeSA8ZW0+bWFya2Rvd248L2VtPiBjb21tZW50XCJcbiAgI1xuICAjIFJldHVybnMgbm90aGluZ1xuICB1cGRhdGVUZXh0RmllbGQ6IChmaWVsZCwgYW5ub3RhdGlvbikgPT5cbiAgICAjIEVzY2FwZSBhbnkgSFRNTCBpbiB0aGUgdGV4dCB0byBwcmV2ZW50IFhTUy5cbiAgICB0ZXh0ID0gQW5ub3RhdG9yLlV0aWwuZXNjYXBlKGFubm90YXRpb24udGV4dCB8fCAnJylcbiAgICAkKGZpZWxkKS5odG1sKHRoaXMuY29udmVydCh0ZXh0KSlcblxuICAjIENvbnZlcnRzIHByb3ZpZGVkIHRleHQgaW50byBtYXJrZG93bi5cbiAgI1xuICAjIHRleHQgLSBBIFN0cmluZyBvZiBNYXJrZG93biB0byByZW5kZXIgYXMgSFRNTC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyBwbHVnaW4uY29udmVydCgnVGhpcyBpcyBfdmVyeV8gYmFzaWMgW01hcmtkb3duXShodHRwOi8vZGFyaW5nZmlyZWJhbGwuY29tKScpXG4gICMgIyA9PiBSZXR1cm5zIFwiVGhpcyBpcyA8ZW0+dmVyeTxlbT4gYmFzaWMgPGEgaHJlZj1cImh0dHA6Ly8uLi5cIj5NYXJrZG93bjwvYT5cIlxuICAjXG4gICMgUmV0dXJucyBIVE1MIHN0cmluZy5cbiAgY29udmVydDogKHRleHQpIC0+XG4gICAgQGNvbnZlcnRlci5tYWtlSHRtbCB0ZXh0XG5cblxubW9kdWxlLmV4cG9ydHMgPSBBbm5vdGF0b3IuUGx1Z2luLk1hcmtkb3duXG4iLCJBbm5vdGF0b3IgPSByZXF1aXJlKCdhbm5vdGF0b3InKVxuXG5cbiMgUHVibGljOiBQbHVnaW4gZm9yIHNldHRpbmcgcGVybWlzc2lvbnMgb24gbmV3bHkgY3JlYXRlZCBhbm5vdGF0aW9ucyBhcyB3ZWxsIGFzXG4jIG1hbmFnaW5nIHVzZXIgcGVybWlzc2lvbnMgc3VjaCBhcyB2aWV3aW5nL2VkaXRpbmcvZGVsZXRpbmcgYW5ub3Rpb25zLlxuI1xuIyBlbGVtZW50IC0gQSBET00gRWxlbWVudCB1cG9uIHdoaWNoIGV2ZW50cyBhcmUgYm91bmQuIFdoZW4gaW5pdGlhbGlzZWQgYnlcbiMgICAgICAgICAgIHRoZSBBbm5vdGF0b3IgaXQgaXMgdGhlIEFubm90YXRvciBlbGVtZW50LlxuIyBvcHRpb25zIC0gQW4gT2JqZWN0IGxpdGVyYWwgY29udGFpbmluZyBjdXN0b20gb3B0aW9ucy5cbiNcbiMgRXhhbXBsZXNcbiNcbiMgICBuZXcgQW5ub3RhdG9yLnBsdWdpbi5QZXJtaXNzaW9ucyhhbm5vdGF0b3IuZWxlbWVudCwge1xuIyAgICAgdXNlcjogJ0FsaWNlJ1xuIyAgIH0pXG4jXG4jIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBlcm1pc3Npb25zIE9iamVjdC5cbmNsYXNzIEFubm90YXRvci5QbHVnaW4uUGVybWlzc2lvbnMgZXh0ZW5kcyBBbm5vdGF0b3IuUGx1Z2luXG5cbiAgIyBBIE9iamVjdCBsaXRlcmFsIG9mIGRlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIGNsYXNzLlxuICBvcHRpb25zOlxuXG4gICAgIyBEaXNwbGF5cyBhbiBcIkFueW9uZSBjYW4gdmlldyB0aGlzIGFubm90YXRpb25cIiBjaGVja2JveCBpbiB0aGUgRWRpdG9yLlxuICAgIHNob3dWaWV3UGVybWlzc2lvbnNDaGVja2JveDogdHJ1ZVxuXG4gICAgIyBEaXNwbGF5cyBhbiBcIkFueW9uZSBjYW4gZWRpdCB0aGlzIGFubm90YXRpb25cIiBjaGVja2JveCBpbiB0aGUgRWRpdG9yLlxuICAgIHNob3dFZGl0UGVybWlzc2lvbnNDaGVja2JveDogdHJ1ZVxuXG4gICAgIyBQdWJsaWM6IFVzZWQgYnkgdGhlIHBsdWdpbiB0byBkZXRlcm1pbmUgYSB1bmlxdWUgaWQgZm9yIHRoZSBAdXNlciBwcm9wZXJ0eS5cbiAgICAjIEJ5IGRlZmF1bHQgdGhpcyBhY2NlcHRzIGFuZCByZXR1cm5zIHRoZSB1c2VyIFN0cmluZyBidXQgY2FuIGJlIG92ZXItXG4gICAgIyByaWRkZW4gaW4gdGhlIEBvcHRpb25zIG9iamVjdCBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IuXG4gICAgI1xuICAgICMgdXNlciAtIEEgU3RyaW5nIHVzZXJuYW1lIG9yIG51bGwgaWYgbm8gdXNlciBpcyBzZXQuXG4gICAgI1xuICAgICMgUmV0dXJucyB0aGUgU3RyaW5nIHByb3ZpZGVkIGFzIHVzZXIgb2JqZWN0LlxuICAgIHVzZXJJZDogKHVzZXIpIC0+IHVzZXJcblxuICAgICMgUHVibGljOiBVc2VkIGJ5IHRoZSBwbHVnaW4gdG8gZGV0ZXJtaW5lIGEgZGlzcGxheSBuYW1lIGZvciB0aGUgQHVzZXJcbiAgICAjIHByb3BlcnR5LiBCeSBkZWZhdWx0IHRoaXMgYWNjZXB0cyBhbmQgcmV0dXJucyB0aGUgdXNlciBTdHJpbmcgYnV0IGNhbiBiZVxuICAgICMgb3Zlci1yaWRkZW4gaW4gdGhlIEBvcHRpb25zIG9iamVjdCBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IuXG4gICAgI1xuICAgICMgdXNlciAtIEEgU3RyaW5nIHVzZXJuYW1lIG9yIG51bGwgaWYgbm8gdXNlciBpcyBzZXQuXG4gICAgI1xuICAgICMgUmV0dXJucyB0aGUgU3RyaW5nIHByb3ZpZGVkIGFzIHVzZXIgb2JqZWN0XG4gICAgdXNlclN0cmluZzogKHVzZXIpIC0+IHVzZXJcblxuICAgICMgUHVibGljOiBVc2VkIGJ5IFBlcm1pc3Npb25zI2F1dGhvcml6ZSB0byBkZXRlcm1pbmUgd2hldGhlciBhIHVzZXIgY2FuXG4gICAgIyBwZXJmb3JtIGFuIGFjdGlvbiBvbiBhbiBhbm5vdGF0aW9uLiBPdmVycmlkaW5nIHRoaXMgZnVuY3Rpb24gYWxsb3dzXG4gICAgIyBhIGZhciBtb3JlIGNvbXBsZXggcGVybWlzc2lvbnMgc3lzeWVtLlxuICAgICNcbiAgICAjIEJ5IGRlZmF1bHQgdGhpcyBhdXRob3JpemVzIHRoZSBhY3Rpb24gaWYgYW55IG9mIHRocmVlIHNjZW5hcmlvcyBhcmUgdHJ1ZTpcbiAgICAjXG4gICAgIyAgICAgMSkgdGhlIGFubm90YXRpb24gaGFzIGEgJ3Blcm1pc3Npb25zJyBvYmplY3QsIGFuZCBlaXRoZXIgdGhlIGZpZWxkIGZvclxuICAgICMgICAgICAgIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGlzIG1pc3NpbmcsIGVtcHR5LCBvciBjb250YWlucyB0aGUgdXNlcklkIG9mIHRoZVxuICAgICMgICAgICAgIGN1cnJlbnQgdXNlciwgaS5lLiBAb3B0aW9ucy51c2VySWQoQHVzZXIpXG4gICAgI1xuICAgICMgICAgIDIpIHRoZSBhbm5vdGF0aW9uIGhhcyBhICd1c2VyJyBwcm9wZXJ0eSwgYW5kIEBvcHRpb25zLnVzZXJJZChAdXNlcikgbWF0Y2hlc1xuICAgICMgICAgICAgICdhbm5vdGF0aW9uLnVzZXInXG4gICAgI1xuICAgICMgICAgIDMpIHRoZSBhbm5vdGF0aW9uIGhhcyBubyAncGVybWlzc2lvbnMnIG9yICd1c2VyJyBwcm9wZXJ0aWVzXG4gICAgI1xuICAgICMgYW5ub3RhdGlvbiAtIFRoZSBhbm5vdGF0aW9uIG9uIHdoaWNoIHRoZSBhY3Rpb24gaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICMgYWN0aW9uIC0gVGhlIGFjdGlvbiBiZWluZyByZXF1ZXN0ZWQ6IGUuZy4gJ3VwZGF0ZScsICdkZWxldGUnLlxuICAgICMgdXNlciAtIFRoZSB1c2VyIG9iamVjdCAob3Igc3RyaW5nKSByZXF1ZXN0aW5nIHRoZSBhY3Rpb24uIFRoaXMgaXMgdXN1YWxseVxuICAgICMgICAgICAgIGF1dG9tYXRpY2FsbHkgcGFzc2VkIGJ5IFBlcm1pc3Npb25zI2F1dGhvcml6ZSBhcyB0aGUgY3VycmVudCB1c2VyIChAdXNlcilcbiAgICAjXG4gICAgIyAgIHBlcm1pc3Npb25zLnNldFVzZXIobnVsbClcbiAgICAjICAgcGVybWlzc2lvbnMuYXV0aG9yaXplKCd1cGRhdGUnLCB7fSlcbiAgICAjICAgIyA9PiB0cnVlXG4gICAgI1xuICAgICMgICBwZXJtaXNzaW9ucy5zZXRVc2VyKCdhbGljZScpXG4gICAgIyAgIHBlcm1pc3Npb25zLmF1dGhvcml6ZSgndXBkYXRlJywge3VzZXI6ICdhbGljZSd9KVxuICAgICMgICAjID0+IHRydWVcbiAgICAjICAgcGVybWlzc2lvbnMuYXV0aG9yaXplKCd1cGRhdGUnLCB7dXNlcjogJ2JvYid9KVxuICAgICMgICAjID0+IGZhbHNlXG4gICAgI1xuICAgICMgICBwZXJtaXNzaW9ucy5zZXRVc2VyKCdhbGljZScpXG4gICAgIyAgIHBlcm1pc3Npb25zLmF1dGhvcml6ZSgndXBkYXRlJywge1xuICAgICMgICAgIHVzZXI6ICdib2InLFxuICAgICMgICAgIHBlcm1pc3Npb25zOiBbJ3VwZGF0ZSc6IFsnYWxpY2UnLCAnYm9iJ11dXG4gICAgIyAgIH0pXG4gICAgIyAgICMgPT4gdHJ1ZVxuICAgICMgICBwZXJtaXNzaW9ucy5hdXRob3JpemUoJ2Rlc3Ryb3knLCB7XG4gICAgIyAgICAgdXNlcjogJ2JvYicsXG4gICAgIyAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAjICAgICAgICd1cGRhdGUnOiBbJ2FsaWNlJywgJ2JvYiddXG4gICAgIyAgICAgICAnZGVzdHJveSc6IFsnYm9iJ11cbiAgICAjICAgICBdXG4gICAgIyAgIH0pXG4gICAgIyAgICMgPT4gZmFsc2VcbiAgICAjXG4gICAgIyBSZXR1cm5zIGEgQm9vbGVhbiwgdHJ1ZSBpZiB0aGUgdXNlciBpcyBhdXRob3Jpc2VkIGZvciB0aGUgdG9rZW4gcHJvdmlkZWQuXG4gICAgdXNlckF1dGhvcml6ZTogKGFjdGlvbiwgYW5ub3RhdGlvbiwgdXNlcikgLT5cbiAgICAgICMgRmluZS1ncmFpbmVkIGN1c3RvbSBhdXRob3JpemF0aW9uXG4gICAgICBpZiBhbm5vdGF0aW9uLnBlcm1pc3Npb25zXG4gICAgICAgIHRva2VucyA9IGFubm90YXRpb24ucGVybWlzc2lvbnNbYWN0aW9uXSB8fCBbXVxuXG4gICAgICAgIGlmIHRva2Vucy5sZW5ndGggPT0gMFxuICAgICAgICAgICMgRW1wdHkgb3IgbWlzc2luZyB0b2tlbnMgYXJyYXk6IGFueW9uZSBjYW4gcGVyZm9ybSBhY3Rpb24uXG4gICAgICAgICAgcmV0dXJuIHRydWVcblxuICAgICAgICBmb3IgdG9rZW4gaW4gdG9rZW5zXG4gICAgICAgICAgaWYgdGhpcy51c2VySWQodXNlcikgPT0gdG9rZW5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG5cbiAgICAgICAgIyBObyB0b2tlbnMgbWF0Y2hlZDogYWN0aW9uIHNob3VsZCBub3QgYmUgcGVyZm9ybWVkLlxuICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgIyBDb2Fyc2UtZ3JhaW5lZCBhdXRob3JpemF0aW9uXG4gICAgICBlbHNlIGlmIGFubm90YXRpb24udXNlclxuICAgICAgICBpZiB1c2VyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudXNlcklkKHVzZXIpID09IHRoaXMudXNlcklkKGFubm90YXRpb24udXNlcilcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgICAjIE5vIGF1dGhvcml6YXRpb24gaW5mbyBvbiBhbm5vdGF0aW9uOiBmcmVlLWZvci1hbGwhXG4gICAgICB0cnVlXG5cbiAgICAjIERlZmF1bHQgdXNlciBvYmplY3QuXG4gICAgdXNlcjogJydcblxuICAgICMgRGVmYXVsdCBwZXJtaXNzaW9ucyBmb3IgYWxsIGFubm90YXRpb25zLiBBbnlvbmUgY2FuIGRvIGFueXRoaW5nXG4gICAgIyAoYXNzdW1pbmcgZGVmYXVsdCB1c2VyQXV0aG9yaXplIGZ1bmN0aW9uKS5cbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgJ3JlYWQnOiAgIFtdXG4gICAgICAndXBkYXRlJzogW11cbiAgICAgICdkZWxldGUnOiBbXVxuICAgICAgJ2FkbWluJzogIFtdXG4gICAgfVxuXG4gICMgVGhlIGNvbnN0cnVjdG9yIGNhbGxlZCB3aGVuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQZXJtaXNzaW9uc1xuICAjIHBsdWdpbiBpcyBjcmVhdGVkLiBTZWUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgdXNhZ2UuXG4gICNcbiAgIyBlbGVtZW50IC0gQSBET00gRWxlbWVudCB1cG9uIHdoaWNoIGV2ZW50cyBhcmUgYm91bmQuLlxuICAjIG9wdGlvbnMgLSBBbiBPYmplY3QgbGl0ZXJhbCBjb250YWluaW5nIGN1c3RvbSBvcHRpb25zLlxuICAjXG4gICMgUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgUGVybWlzc2lvbnMgb2JqZWN0LlxuICBjb25zdHJ1Y3RvcjogKGVsZW1lbnQsIG9wdGlvbnMpIC0+XG4gICAgc3VwZXJcblxuICAgIGlmIEBvcHRpb25zLnVzZXJcbiAgICAgIHRoaXMuc2V0VXNlcihAb3B0aW9ucy51c2VyKVxuICAgICAgZGVsZXRlIEBvcHRpb25zLnVzZXJcblxuICAjIFB1YmxpYzogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbiBhbmQgcmVnaXN0ZXJzIGZpZWxkcyB3aXRoIHRoZVxuICAjIEFubm90YXRvci5FZGl0b3IgYW5kIEFubm90YXRvci5WaWV3ZXIuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHBsdWdpbkluaXQ6IC0+XG4gICAgcmV0dXJuIHVubGVzcyBBbm5vdGF0b3Iuc3VwcG9ydGVkKClcblxuICAgIEBhbm5vdGF0b3Iuc3Vic2NyaWJlKCdiZWZvcmVBbm5vdGF0aW9uQ3JlYXRlZCcsIHRoaXMuYWRkRmllbGRzVG9Bbm5vdGF0aW9uKVxuXG4gICAgc2VsZiA9IHRoaXNcbiAgICBjcmVhdGVDYWxsYmFjayA9IChtZXRob2QsIHR5cGUpIC0+XG4gICAgICAoZmllbGQsIGFubm90YXRpb24pIC0+IHNlbGZbbWV0aG9kXS5jYWxsKHNlbGYsIHR5cGUsIGZpZWxkLCBhbm5vdGF0aW9uKVxuXG4gICAgIyBTZXQgdXAgdXNlciBhbmQgZGVmYXVsdCBwZXJtaXNzaW9ucyBmcm9tIGF1dGggdG9rZW4gaWYgbm9uZSBjdXJyZW50bHkgZ2l2ZW5cbiAgICBpZiAhQHVzZXIgYW5kIEBhbm5vdGF0b3IucGx1Z2lucy5BdXRoXG4gICAgICBAYW5ub3RhdG9yLnBsdWdpbnMuQXV0aC53aXRoVG9rZW4odGhpcy5fc2V0QXV0aEZyb21Ub2tlbilcblxuICAgIGlmIEBvcHRpb25zLnNob3dWaWV3UGVybWlzc2lvbnNDaGVja2JveCA9PSB0cnVlXG4gICAgICBAYW5ub3RhdG9yLmVkaXRvci5hZGRGaWVsZCh7XG4gICAgICAgIHR5cGU6ICAgJ2NoZWNrYm94J1xuICAgICAgICBsYWJlbDogIEFubm90YXRvci5fdCgnQWxsb3cgYW55b25lIHRvIDxzdHJvbmc+dmlldzwvc3Ryb25nPiB0aGlzIGFubm90YXRpb24nKVxuICAgICAgICBsb2FkOiAgIGNyZWF0ZUNhbGxiYWNrKCd1cGRhdGVQZXJtaXNzaW9uc0ZpZWxkJywgJ3JlYWQnKVxuICAgICAgICBzdWJtaXQ6IGNyZWF0ZUNhbGxiYWNrKCd1cGRhdGVBbm5vdGF0aW9uUGVybWlzc2lvbnMnLCAncmVhZCcpXG4gICAgICB9KVxuXG4gICAgaWYgQG9wdGlvbnMuc2hvd0VkaXRQZXJtaXNzaW9uc0NoZWNrYm94ID09IHRydWVcbiAgICAgIEBhbm5vdGF0b3IuZWRpdG9yLmFkZEZpZWxkKHtcbiAgICAgICAgdHlwZTogICAnY2hlY2tib3gnXG4gICAgICAgIGxhYmVsOiAgQW5ub3RhdG9yLl90KCdBbGxvdyBhbnlvbmUgdG8gPHN0cm9uZz5lZGl0PC9zdHJvbmc+IHRoaXMgYW5ub3RhdGlvbicpXG4gICAgICAgIGxvYWQ6ICAgY3JlYXRlQ2FsbGJhY2soJ3VwZGF0ZVBlcm1pc3Npb25zRmllbGQnLCAndXBkYXRlJylcbiAgICAgICAgc3VibWl0OiBjcmVhdGVDYWxsYmFjaygndXBkYXRlQW5ub3RhdGlvblBlcm1pc3Npb25zJywgJ3VwZGF0ZScpXG4gICAgICB9KVxuXG4gICAgIyBTZXR1cCB0aGUgZGlzcGxheSBvZiBhbm5vdGF0aW9ucyBpbiB0aGUgVmlld2VyLlxuICAgIEBhbm5vdGF0b3Iudmlld2VyLmFkZEZpZWxkKHtcbiAgICAgIGxvYWQ6IHRoaXMudXBkYXRlVmlld2VyXG4gICAgfSlcblxuICAgICMgQWRkIGEgZmlsdGVyIHRvIHRoZSBGaWx0ZXIgcGx1Z2luIGlmIGxvYWRlZC5cbiAgICBpZiBAYW5ub3RhdG9yLnBsdWdpbnMuRmlsdGVyXG4gICAgICBAYW5ub3RhdG9yLnBsdWdpbnMuRmlsdGVyLmFkZEZpbHRlcih7XG4gICAgICAgIGxhYmVsOiBBbm5vdGF0b3IuX3QoJ1VzZXInKVxuICAgICAgICBwcm9wZXJ0eTogJ3VzZXInXG4gICAgICAgIGlzRmlsdGVyZWQ6IChpbnB1dCwgdXNlcikgPT5cbiAgICAgICAgICB1c2VyID0gQG9wdGlvbnMudXNlclN0cmluZyh1c2VyKVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlIHVubGVzcyBpbnB1dCBhbmQgdXNlclxuICAgICAgICAgIGZvciBrZXl3b3JkIGluIChpbnB1dC5zcGxpdCAvXFxzKi8pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2UgaWYgdXNlci5pbmRleE9mKGtleXdvcmQpID09IC0xXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSlcblxuICAjIFB1YmxpYzogU2V0cyB0aGUgUGVybWlzc2lvbnMjdXNlciBwcm9wZXJ0eS5cbiAgI1xuICAjIHVzZXIgLSBBIFN0cmluZyBvciBPYmplY3QgdG8gcmVwcmVzZW50IHRoZSBjdXJyZW50IHVzZXIuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBwZXJtaXNzaW9ucy5zZXRVc2VyKCdBbGljZScpXG4gICNcbiAgIyAgIHBlcm1pc3Npb25zLnNldFVzZXIoe2lkOiAzNSwgbmFtZTogJ0FsaWNlJ30pXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHNldFVzZXI6ICh1c2VyKSAtPlxuICAgIEB1c2VyID0gdXNlclxuXG4gICMgRXZlbnQgY2FsbGJhY2s6IEFwcGVuZHMgdGhlIEB1c2VyIGFuZCBAb3B0aW9ucy5wZXJtaXNzaW9ucyBvYmplY3RzIHRvIHRoZVxuICAjIHByb3ZpZGVkIGFubm90YXRpb24gb2JqZWN0LiBPbmx5IGFwcGVuZHMgdGhlIHVzZXIgaWYgb25lIGhhcyBiZWVuIHNldC5cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIG9iamVjdC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGFubm90YXRpb24gPSB7dGV4dDogJ015IGNvbW1lbnQnfVxuICAjICAgcGVybWlzc2lvbnMuYWRkRmllbGRzVG9Bbm5vdGF0aW9uKGFubm90YXRpb24pXG4gICMgICBjb25zb2xlLmxvZyhhbm5vdGF0aW9uKVxuICAjICAgIyA9PiB7dGV4dDogJ015IGNvbW1lbnQnLCBwZXJtaXNzaW9uczogey4uLn19XG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIGFkZEZpZWxkc1RvQW5ub3RhdGlvbjogKGFubm90YXRpb24pID0+XG4gICAgaWYgYW5ub3RhdGlvblxuICAgICAgYW5ub3RhdGlvbi5wZXJtaXNzaW9ucyA9IEBvcHRpb25zLnBlcm1pc3Npb25zXG4gICAgICBpZiBAdXNlclxuICAgICAgICBhbm5vdGF0aW9uLnVzZXIgPSBAdXNlclxuXG4gICMgUHVibGljOiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGFjdGlvbiBjYW4gYmUgcGVyZm9ybWVkIG9uIHRoZVxuICAjIGFubm90YXRpb24uIFRoaXMgdXNlcyB0aGUgdXNlci1jb25maWd1cmFibGUgJ3VzZXJBdXRob3JpemUnIG1ldGhvZCB0b1xuICAjIGRldGVybWluZSBpZiBhbiBhbm5vdGF0aW9uIGlzIGFubm90YXRhYmxlLiBTZWUgdGhlIGRlZmF1bHQgbWV0aG9kIGZvclxuICAjIGRvY3VtZW50YXRpb24gb24gaXRzIGJlaGF2aW91ci5cbiAgI1xuICAjIFJldHVybnMgYSBCb29sZWFuLCB0cnVlIGlmIHRoZSBhY3Rpb24gY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgYW5ub3RhdGlvbi5cbiAgYXV0aG9yaXplOiAoYWN0aW9uLCBhbm5vdGF0aW9uLCB1c2VyKSAtPlxuICAgIHVzZXIgPSBAdXNlciBpZiB1c2VyID09IHVuZGVmaW5lZFxuXG4gICAgaWYgQG9wdGlvbnMudXNlckF1dGhvcml6ZVxuICAgICAgcmV0dXJuIEBvcHRpb25zLnVzZXJBdXRob3JpemUuY2FsbChAb3B0aW9ucywgYWN0aW9uLCBhbm5vdGF0aW9uLCB1c2VyKVxuXG4gICAgZWxzZSAjIHVzZXJBdXRob3JpemUgbnVsbGVkIG91dDogZnJlZS1mb3ItYWxsIVxuICAgICAgcmV0dXJuIHRydWVcblxuICAjIEZpZWxkIGNhbGxiYWNrOiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgXCJhbnlvbmUgY2Fu4oCmXCIgY2hlY2tib3hlc1xuICAjXG4gICMgYWN0aW9uICAgICAtIFRoZSBhY3Rpb24gU3RyaW5nLCBlaXRoZXIgXCJ2aWV3XCIgb3IgXCJ1cGRhdGVcIlxuICAjIGZpZWxkICAgICAgLSBBIERPTSBFbGVtZW50IGNvbnRhaW5pbmcgYSBmb3JtIGlucHV0LlxuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgdXBkYXRlUGVybWlzc2lvbnNGaWVsZDogKGFjdGlvbiwgZmllbGQsIGFubm90YXRpb24pID0+XG4gICAgZmllbGQgPSAkKGZpZWxkKS5zaG93KClcbiAgICBpbnB1dCA9IGZpZWxkLmZpbmQoJ2lucHV0JykucmVtb3ZlQXR0cignZGlzYWJsZWQnKVxuXG4gICAgIyBEbyBub3Qgc2hvdyBmaWVsZCBpZiBjdXJyZW50IHVzZXIgaXMgbm90IGFkbWluLlxuICAgIGZpZWxkLmhpZGUoKSB1bmxlc3MgdGhpcy5hdXRob3JpemUoJ2FkbWluJywgYW5ub3RhdGlvbilcblxuICAgICMgU2VlIGlmIHdlIGNhbiBhdXRob3Jpc2Ugd2l0aG91dCBhIHVzZXIuXG4gICAgaWYgdGhpcy5hdXRob3JpemUoYWN0aW9uLCBhbm5vdGF0aW9uIHx8IHt9LCBudWxsKVxuICAgICAgaW5wdXQuYXR0cignY2hlY2tlZCcsICdjaGVja2VkJylcbiAgICBlbHNlXG4gICAgICBpbnB1dC5yZW1vdmVBdHRyKCdjaGVja2VkJylcblxuXG4gICMgRmllbGQgY2FsbGJhY2s6IHVwZGF0ZXMgdGhlIGFubm90YXRpb24ucGVybWlzc2lvbnMgb2JqZWN0IGJhc2VkIG9uIHRoZSBzdGF0ZVxuICAjIG9mIHRoZSBmaWVsZCBjaGVja2JveC4gSWYgaXQgaXMgY2hlY2tlZCB0aGVuIHBlcm1pc3Npb25zIGFyZSBzZXQgdG8gd29ybGRcbiAgIyB3cml0YWJsZSBvdGhlcndpc2UgdGhleSB1c2UgdGhlIG9yaWdpbmFsIHNldHRpbmdzLlxuICAjXG4gICMgYWN0aW9uICAgICAtIFRoZSBhY3Rpb24gU3RyaW5nLCBlaXRoZXIgXCJ2aWV3XCIgb3IgXCJ1cGRhdGVcIlxuICAjIGZpZWxkICAgICAgLSBBIERPTSBFbGVtZW50IHJlcHJlc2VudGluZyB0aGUgYW5ub3RhdGlvbiBlZGl0b3IuXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gT2JqZWN0LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICB1cGRhdGVBbm5vdGF0aW9uUGVybWlzc2lvbnM6ICh0eXBlLCBmaWVsZCwgYW5ub3RhdGlvbikgPT5cbiAgICBhbm5vdGF0aW9uLnBlcm1pc3Npb25zID0gQG9wdGlvbnMucGVybWlzc2lvbnMgdW5sZXNzIGFubm90YXRpb24ucGVybWlzc2lvbnNcblxuICAgIGRhdGFLZXkgPSB0eXBlICsgJy1wZXJtaXNzaW9ucydcblxuICAgIGlmICQoZmllbGQpLmZpbmQoJ2lucHV0JykuaXMoJzpjaGVja2VkJylcbiAgICAgIGFubm90YXRpb24ucGVybWlzc2lvbnNbdHlwZV0gPSBbXVxuICAgIGVsc2VcbiAgICAgICMgQ2xlYXJseSwgdGhlIHBlcm1pc3Npb25zIG1vZGVsIGFsbG93cyBmb3IgbW9yZSBjb21wbGV4IGVudHJpZXMgdGhhbiB0aGlzLFxuICAgICAgIyBidXQgb3VyIFVJIHByZXNlbnRzIGEgY2hlY2tib3gsIHNvIHdlIGNhbiBvbmx5IGludGVycHJldCBcInByZXZlbnQgb3RoZXJzXG4gICAgICAjIGZyb20gdmlld2luZ1wiIGFzIG1lYW5pbmcgXCJhbGxvdyBvbmx5IG1lIHRvIHZpZXdcIi4gVGhpcyBtYXkgd2FudCBjaGFuZ2luZ1xuICAgICAgIyBpbiB0aGUgZnV0dXJlLlxuICAgICAgYW5ub3RhdGlvbi5wZXJtaXNzaW9uc1t0eXBlXSA9IFtAb3B0aW9ucy51c2VySWQoQHVzZXIpXVxuXG4gICMgRmllbGQgY2FsbGJhY2s6IHVwZGF0ZXMgdGhlIGFubm90YXRpb24gdmlld2VyIHRvIGlubHVkZSB0aGUgZGlzcGxheSBuYW1lXG4gICMgZm9yIHRoZSB1c2VyIG9idGFpbmVkIHRocm91Z2ggUGVybWlzc2lvbnMjb3B0aW9ucy51c2VyU3RyaW5nKCkuXG4gICNcbiAgIyBmaWVsZCAgICAgIC0gQSBESVYgRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGFubm90YXRpb24gZmllbGQuXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gT2JqZWN0IHRvIGRpc3BsYXkuXG4gICMgY29udHJvbHMgICAtIEEgY29udHJvbCBPYmplY3QgdG8gdG9nZ2xlIHRoZSBkaXNwbGF5IG9mIGFubm90YXRpb24gY29udHJvbHMuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHVwZGF0ZVZpZXdlcjogKGZpZWxkLCBhbm5vdGF0aW9uLCBjb250cm9scykgPT5cbiAgICBmaWVsZCA9ICQoZmllbGQpXG5cbiAgICB1c2VybmFtZSA9IEBvcHRpb25zLnVzZXJTdHJpbmcgYW5ub3RhdGlvbi51c2VyXG4gICAgaWYgYW5ub3RhdGlvbi51c2VyIGFuZCB1c2VybmFtZSBhbmQgdHlwZW9mIHVzZXJuYW1lID09ICdzdHJpbmcnXG4gICAgICB1c2VyID0gQW5ub3RhdG9yLlV0aWwuZXNjYXBlKEBvcHRpb25zLnVzZXJTdHJpbmcoYW5ub3RhdGlvbi51c2VyKSlcbiAgICAgIGZpZWxkLmh0bWwodXNlcikuYWRkQ2xhc3MoJ2Fubm90YXRvci11c2VyJylcbiAgICBlbHNlXG4gICAgICBmaWVsZC5yZW1vdmUoKVxuXG4gICAgaWYgY29udHJvbHNcbiAgICAgIGNvbnRyb2xzLmhpZGVFZGl0KCkgICB1bmxlc3MgdGhpcy5hdXRob3JpemUoJ3VwZGF0ZScsIGFubm90YXRpb24pXG4gICAgICBjb250cm9scy5oaWRlRGVsZXRlKCkgdW5sZXNzIHRoaXMuYXV0aG9yaXplKCdkZWxldGUnLCBhbm5vdGF0aW9uKVxuXG4gICMgU2V0cyB0aGUgUGVybWlzc2lvbnMjdXNlciBwcm9wZXJ0eSBvbiB0aGUgYmFzaXMgb2YgYSByZWNlaXZlZCBhdXRoVG9rZW4uXG4gICNcbiAgIyB0b2tlbiAtIHRoZSBhdXRoVG9rZW4gcmVjZWl2ZWQgYnkgdGhlIEF1dGggcGx1Z2luXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIF9zZXRBdXRoRnJvbVRva2VuOiAodG9rZW4pID0+XG4gICAgdGhpcy5zZXRVc2VyKHRva2VuLnVzZXJJZClcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEFubm90YXRvci5QbHVnaW4uUGVybWlzc2lvbnNcbiIsIkFubm90YXRvciA9IHJlcXVpcmUoJ2Fubm90YXRvcicpXG5cblxuIyBQdWJsaWM6IFRoZSBTdG9yZSBwbHVnaW4gY2FuIGJlIHVzZWQgdG8gcGVyc2lzdCBhbm5vdGF0aW9ucyB0byBhIGRhdGFiYXNlXG4jIHJ1bm5pbmcgb24geW91ciBzZXJ2ZXIuIEl0IGhhcyBhIHNpbXBsZSBjdXN0b21pc2FibGUgaW50ZXJmYWNlIHRoYXQgY2FuIGJlXG4jIGltcGxlbWVudGVkIHdpdGggYW55IHdlYiBmcmFtZXdvcmsuIEl0IHdvcmtzIGJ5IGxpc3RlbmluZyB0byBldmVudHMgcHVibGlzaGVkXG4jIGJ5IHRoZSBBbm5vdGF0b3IgYW5kIG1ha2luZyBhcHByb3ByaWF0ZSByZXF1ZXN0cyB0byB0aGUgc2VydmVyIGRlcGVuZGluZyBvblxuIyB0aGUgZXZlbnQuXG4jXG4jIFRoZSBzdG9yZSBoYW5kbGVzIGZpdmUgZGlzdGluY3QgYWN0aW9ucyBcInJlYWRcIiwgXCJzZWFyY2hcIiwgXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIlxuIyBhbmQgXCJkZXN0cm95XCIuIFRoZSByZXF1ZXN0cyBtYWRlIGNhbiBiZSBjdXN0b21pc2VkIHdpdGggb3B0aW9ucyB3aGVuIHRoZVxuIyBwbHVnaW4gaXMgYWRkZWQgdG8gdGhlIEFubm90YXRvci5cbmNsYXNzIEFubm90YXRvci5QbHVnaW4uU3RvcmVcblxuICAjIFVzZXIgY3VzdG9taXNhYmxlIG9wdGlvbnMgYXZhaWxhYmxlLlxuICBvcHRpb25zOlxuXG4gICAgIyBDdXN0b20gbWV0YSBkYXRhIHRoYXQgd2lsbCBiZSBhdHRhY2hlZCB0byBldmVyeSBhbm5vdGF0aW9uIHRoYXQgaXMgc2VudFxuICAgICMgdG8gdGhlIHNlcnZlci4gVGhpcyBfd2lsbF8gb3ZlcnJpZGUgcHJldmlvdXMgdmFsdWVzLlxuICAgIGFubm90YXRpb25EYXRhOiB7fVxuXG4gICAgIyBTaG91bGQgdGhlIHBsdWdpbiBlbXVsYXRlIEhUVFAgbWV0aG9kcyBsaWtlIFBVVCBhbmQgREVMRVRFIGZvclxuICAgICMgaW50ZXJhY3Rpb24gd2l0aCBsZWdhY3kgd2ViIHNlcnZlcnM/IFNldHRpbmcgdGhpcyB0byBgdHJ1ZWAgd2lsbCBmYWtlXG4gICAgIyBIVFRQIGBQVVRgIGFuZCBgREVMRVRFYCByZXF1ZXN0cyB3aXRoIGFuIEhUVFAgYFBPU1RgLCBhbmQgd2lsbCBzZXQgdGhlXG4gICAgIyByZXF1ZXN0IGhlYWRlciBgWC1IVFRQLU1ldGhvZC1PdmVycmlkZWAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZFxuICAgICMgbWV0aG9kLlxuICAgIGVtdWxhdGVIVFRQOiBmYWxzZVxuXG4gICAgIyBTaG91bGQgdGhlIHBsdWdpbiBlbXVsYXRlIEpTT04gUE9TVC9QVVQgcGF5bG9hZHMgYnkgc2VuZGluZyBpdHMgcmVxdWVzdHNcbiAgICAjIGFzIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCB3aXRoIGEgc2luZ2xlIGtleSwgXCJqc29uXCJcbiAgICBlbXVsYXRlSlNPTjogZmFsc2VcblxuICAgICMgQSBzZXQgb2YgY3VzdG9tIGhlYWRlcnMgdGhhdCB3aWxsIGJlIHNlbnQgd2l0aCBldmVyeSByZXF1ZXN0LiBTZWUgYWxzbyB0aGVcbiAgICAjIHNldEhlYWRlciBtZXRob2QuXG4gICAgaGVhZGVyczoge31cblxuICAgICMgVGhpcyBpcyB0aGUgQVBJIGVuZHBvaW50LiBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIENyb3NzIE9yaWdpbiBSZXNvdXJjZVxuICAgICMgU2hhcmluZyAoQ09SUykgYSBmdWxsIFVSTCBjYW4gYmUgdXNlZCBoZXJlLlxuICAgIHByZWZpeDogJy9zdG9yZSdcblxuICAgICMgVGhlIHNlcnZlciBVUkxzIGZvciBlYWNoIGF2YWlsYWJsZSBhY3Rpb24uIFRoZXNlIFVSTHMgY2FuIGJlIGFueXRoaW5nIGJ1dFxuICAgICMgbXVzdCByZXNwb25kIHRvIHRoZSBhcHByb3ByYWl0ZSBIVFRQIG1ldGhvZC4gVGhlIHRva2VuIFwiOmlkXCIgY2FuIGJlIHVzZWRcbiAgICAjIGFueXdoZXJlIGluIHRoZSBVUkwgYW5kIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYW5ub3RhdGlvbiBpZC5cbiAgICAjXG4gICAgIyByZWFkOiAgICBHRVRcbiAgICAjIGNyZWF0ZTogIFBPU1RcbiAgICAjIHVwZGF0ZTogIFBVVFxuICAgICMgZGVzdHJveTogREVMRVRFXG4gICAgIyBzZWFyY2g6ICBHRVRcbiAgICB1cmxzOlxuICAgICAgY3JlYXRlOiAgJy9hbm5vdGF0aW9ucydcbiAgICAgIHJlYWQ6ICAgICcvYW5ub3RhdGlvbnMvOmlkJ1xuICAgICAgdXBkYXRlOiAgJy9hbm5vdGF0aW9ucy86aWQnXG4gICAgICBkZXN0cm95OiAnL2Fubm90YXRpb25zLzppZCdcbiAgICAgIHNlYXJjaDogICcvc2VhcmNoJ1xuXG4gICMgUHVibGljOiBUaGUgY29udHNydWN0b3IgaW5pdGFpbGFzZXMgdGhlIFN0b3JlIGluc3RhbmNlLiBJdCByZXF1aXJlcyB0aGVcbiAgIyBBbm5vdGF0b3IjZWxlbWVudCBhbmQgYW4gT2JqZWN0IG9mIG9wdGlvbnMuXG4gICNcbiAgIyBlbGVtZW50IC0gVGhpcyBtdXN0IGJlIHRoZSBBbm5vdGF0b3IjZWxlbWVudCBpbiBvcmRlciB0byBsaXN0ZW4gZm9yIGV2ZW50cy5cbiAgIyBvcHRpb25zIC0gQW4gT2JqZWN0IG9mIGtleS92YWx1ZSB1c2VyIG9wdGlvbnMuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBzdG9yZSA9IG5ldyBBbm5vdGF0b3IuUGx1Z2luLlN0b3JlKEFubm90YXRvci5lbGVtZW50LCB7XG4gICMgICAgIHByZWZpeDogJ2h0dHA6Ly9hbm5vdGF0ZWl0Lm9yZycsXG4gICMgICAgIGFubm90YXRpb25EYXRhOiB7XG4gICMgICAgICAgdXJpOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAjICAgICB9XG4gICMgICB9KVxuICAjXG4gICMgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBTdG9yZS5cbiAgY29uc3RydWN0b3I6IChvcHRpb25zKSAtPlxuICAgIEBvcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIEBvcHRpb25zLCBvcHRpb25zKVxuXG4gICMgUHVibGljOiBDYWxsYmFjayBtZXRob2QgZm9yIGFubm90YXRpb25DcmVhdGVkIGV2ZW50LiBSZWNlaXZlcyBhbiBhbm5vdGF0aW9uXG4gICMgYW5kIHNlbmRzIGEgUE9TVCByZXF1ZXN0IHRvIHRoZSBzZXZlciB1c2luZyB0aGUgVVJJIGZvciB0aGUgXCJjcmVhdGVcIiBhY3Rpb24uXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHN0b3JlLmFubm90YXRpb25DcmVhdGVkKHt0ZXh0OiBcIm15IG5ldyBhbm5vdGF0aW9uIGNvbW1lbnRcIn0pXG4gICMgICAjID0+IFJlc3VsdHMgaW4gYW4gSFRUUCBQT1NUIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBjb250YWluaW5nIHRoZVxuICAjICAgIyAgICBhbm5vdGF0aW9uIGFzIHNlcmlhbGlzZWQgSlNPTi5cbiAgI1xuICAjIFJldHVybnMgYSBqcVhIUiBvYmplY3QuXG4gIGNyZWF0ZTogKGFubm90YXRpb24pIC0+XG4gICAgdGhpcy5fYXBpUmVxdWVzdCgnY3JlYXRlJywgYW5ub3RhdGlvbilcblxuICAjIFB1YmxpYzogQ2FsbGJhY2sgbWV0aG9kIGZvciBhbm5vdGF0aW9uVXBkYXRlZCBldmVudC4gUmVjZWl2ZXMgYW4gYW5ub3RhdGlvblxuICAjIGFuZCBzZW5kcyBhIFBVVCByZXF1ZXN0IHRvIHRoZSBzZXZlciB1c2luZyB0aGUgVVJJIGZvciB0aGUgXCJ1cGRhdGVcIiBhY3Rpb24uXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBPYmplY3QgdGhhdCB3YXMgdXBkYXRlZC5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHN0b3JlLmFubm90YXRpb25VcGRhdGVkKHtpZDogXCJibGFoXCIsIHRleHQ6IFwidXBkYXRlZCBhbm5vdGF0aW9uIGNvbW1lbnRcIn0pXG4gICMgICAjID0+IFJlc3VsdHMgaW4gYW4gSFRUUCBQVVQgcmVxdWVzdCB0byB0aGUgc2VydmVyIGNvbnRhaW5pbmcgdGhlXG4gICMgICAjICAgIGFubm90YXRpb24gYXMgc2VyaWFsaXNlZCBKU09OLlxuICAjXG4gICMgUmV0dXJucyBhIGpxWEhSIG9iamVjdC5cbiAgdXBkYXRlOiAoYW5ub3RhdGlvbikgLT5cbiAgICB0aGlzLl9hcGlSZXF1ZXN0KCd1cGRhdGUnLCBhbm5vdGF0aW9uKVxuXG4gICMgUHVibGljOiBDYWxsYmFjayBtZXRob2QgZm9yIGFubm90YXRpb25EZWxldGVkIGV2ZW50LiBSZWNlaXZlcyBhbiBhbm5vdGF0aW9uXG4gICMgYW5kIHNlbmRzIGEgREVMRVRFIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgVVJJIGZvciB0aGUgZGVzdHJveVxuICAjIGFjdGlvbi5cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdCB0aGF0IHdhcyBkZWxldGVkLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgc3RvcmUuYW5ub3RhdGlvbkRlbGV0ZWQoe3RleHQ6IFwibXkgbmV3IGFubm90YXRpb24gY29tbWVudFwifSlcbiAgIyAgICMgPT4gUmVzdWx0cyBpbiBhbiBIVFRQIERFTEVURSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIuXG4gICNcbiAgIyBSZXR1cm5zIGEganFYSFIgb2JqZWN0LlxuICBkZWxldGU6IChhbm5vdGF0aW9uKSAtPlxuICAgIHRoaXMuX2FwaVJlcXVlc3QoJ2Rlc3Ryb3knLCBhbm5vdGF0aW9uKVxuXG4gICMgUHVibGljOiBTZWFyY2hlcyBmb3IgYW5ub3RhdGlvbnMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBxdWVyeS5cbiAgI1xuICAjIFJldHVybnMgYSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcXVlcnkgcmVzdWx0cyBhbmQgcXVlcnkgbWV0YWRhdGEuXG4gIHF1ZXJ5OiAocXVlcnlPYmopIC0+XG4gICAgZGZkID0gJC5EZWZlcnJlZCgpXG4gICAgdGhpcy5fYXBpUmVxdWVzdCgnc2VhcmNoJywgcXVlcnlPYmopXG4gICAgICAuZG9uZSAob2JqKSAtPlxuICAgICAgICByb3dzID0gb2JqLnJvd3NcbiAgICAgICAgZGVsZXRlIG9iai5yb3dzXG4gICAgICAgIGRmZC5yZXNvbHZlKHJvd3MsIG9iailcbiAgICAgIC5mYWlsICgpIC0+XG4gICAgICAgIGRmZC5yZWplY3QuYXBwbHkoZGZkLCBhcmd1bWVudHMpXG4gICAgcmV0dXJuIGRmZC5wcm9taXNlKClcblxuICAjIFB1YmxpYzogU2V0IGEgY3VzdG9tIEhUVFAgaGVhZGVyIHRvIGJlIHNlbnQgd2l0aCBldmVyeSByZXF1ZXN0LlxuICAjXG4gICMga2V5ICAgLSBUaGUgaGVhZGVyIG5hbWUuXG4gICMgdmFsdWUgLSBUaGUgaGVhZGVyIHZhbHVlLlxuICAjXG4gICMgRXhhbXBsZXM6XG4gICNcbiAgIyAgIHN0b3JlLnNldEhlYWRlcignWC1NeS1DdXN0b20tSGVhZGVyJywgJ015Q3VzdG9tVmFsdWUnKVxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBzZXRIZWFkZXI6IChrZXksIHZhbHVlKSAtPlxuICAgIHRoaXMub3B0aW9ucy5oZWFkZXJzW2tleV0gPSB2YWx1ZVxuXG4gICMgQ2FsbGJhY2sgbWV0aG9kIGZvciBTdG9yZSNsb2FkQW5ub3RhdGlvbnNGcm9tU2VhcmNoKCkuIFByb2Nlc3NlcyB0aGUgZGF0YVxuICAjIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciAoYSBKU09OIGFycmF5IG9mIGFubm90YXRpb24gT2JqZWN0cykgYW5kIHVwZGF0ZXNcbiAgIyB0aGUgcmVnaXN0cnkgYXMgd2VsbCBhcyBsb2FkaW5nIHRoZW0gaW50byB0aGUgQW5ub3RhdG9yLlxuICAjIFJldHVybnMgdGhlIGpRdWVyeSBYTUxIdHRwUmVxdWVzdCB3cmFwcGVyIGVuYWJsaW5nIGFkZGl0aW9uYWwgY2FsbGJhY2tzIHRvXG4gICMgYmUgYXBwbGllZCBhcyB3ZWxsIGFzIGN1c3RvbSBlcnJvciBoYW5kbGluZy5cbiAgI1xuICAjIGFjdGlvbiAgICAtIFRoZSBhY3Rpb24gU3RyaW5nIGVnLiBcInJlYWRcIiwgXCJzZWFyY2hcIiwgXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIlxuICAjICAgICAgICAgICAgIG9yIFwiZGVzdG9yeVwiLlxuICAjIG9iaiAgICAgICAtIFRoZSBkYXRhIHRvIGJlIHNlbnQsIGVpdGhlciBhbm5vdGF0aW9uIG9iamVjdCBvciBxdWVyeSBzdHJpbmcuXG4gICMgb25TdWNjZXNzIC0gQSBjYWxsYmFjayBGdW5jdGlvbiB0byBjYWxsIG9uIHN1Y2Nlc3NmdWwgcmVxdWVzdC5cbiAgI1xuICAjIEV4YW1wbGVzOlxuICAjXG4gICMgICBzdG9yZS5fYXBpUmVxdWVzdCgncmVhZCcsIHtpZDogNH0sIChkYXRhKSAtPiBjb25zb2xlLmxvZyhkYXRhKSlcbiAgIyAgICMgPT4gT3V0cHV0cyB0aGUgYW5ub3RhdGlvbiByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICNcbiAgIyBSZXR1cm5zIFhNTEh0dHBSZXF1ZXN0IG9iamVjdC5cbiAgX2FwaVJlcXVlc3Q6IChhY3Rpb24sIG9iaikgLT5cbiAgICBpZCA9IG9iaiAmJiBvYmouaWRcbiAgICB1cmwgPSB0aGlzLl91cmxGb3IoYWN0aW9uLCBpZClcbiAgICBvcHRpb25zID0gdGhpcy5fYXBpUmVxdWVzdE9wdGlvbnMoYWN0aW9uLCBvYmopXG5cbiAgICByZXF1ZXN0ID0gJC5hamF4KHVybCwgb3B0aW9ucylcblxuICAgICMgQXBwZW5kIHRoZSBpZCBhbmQgYWN0aW9uIHRvIHRoZSByZXF1ZXN0IG9iamVjdFxuICAgICMgZm9yIHVzZSBpbiB0aGUgZXJyb3IgY2FsbGJhY2suXG4gICAgcmVxdWVzdC5faWQgPSBpZFxuICAgIHJlcXVlc3QuX2FjdGlvbiA9IGFjdGlvblxuICAgIHJlcXVlc3RcblxuICAjIEJ1aWxkcyBhbiBvcHRpb25zIG9iamVjdCBzdWl0YWJsZSBmb3IgdXNlIGluIGEgalF1ZXJ5LmFqYXgoKSBjYWxsLlxuICAjXG4gICMgYWN0aW9uICAgIC0gVGhlIGFjdGlvbiBTdHJpbmcgZWcuIFwicmVhZFwiLCBcInNlYXJjaFwiLCBcImNyZWF0ZVwiLCBcInVwZGF0ZVwiXG4gICMgICAgICAgICAgICAgb3IgXCJkZXN0cm95XCIuXG4gICMgb2JqICAgICAgIC0gVGhlIGRhdGEgdG8gYmUgc2VudCwgZWl0aGVyIGFubm90YXRpb24gb2JqZWN0IG9yIHF1ZXJ5IHN0cmluZy5cbiAgI1xuICAjIFJldHVybnMgT2JqZWN0IGxpdGVyYWwgb2YgJC5hamF4KCkgb3B0aW9ucy5cbiAgX2FwaVJlcXVlc3RPcHRpb25zOiAoYWN0aW9uLCBvYmopIC0+XG4gICAgbWV0aG9kID0gdGhpcy5fbWV0aG9kRm9yKGFjdGlvbilcblxuICAgIG9wdHMgPSB7XG4gICAgICB0eXBlOiAgICAgbWV0aG9kLFxuICAgICAgZGF0YVR5cGU6IFwianNvblwiLFxuICAgICAgZXJyb3I6ICAgIHRoaXMuX29uRXJyb3IsXG4gICAgICBoZWFkZXJzOiAgdGhpcy5vcHRpb25zLmhlYWRlcnNcbiAgICB9XG5cbiAgICAjIElmIGVtdWxhdGVIVFRQIGlzIGVuYWJsZWQsIHdlIHNlbmQgYSBQT1NUIGFuZCBwdXQgdGhlIHJlYWwgbWV0aG9kIGluIGFuXG4gICAgIyBIVFRQIHJlcXVlc3QgaGVhZGVyLlxuICAgIGlmIEBvcHRpb25zLmVtdWxhdGVIVFRQIGFuZCBtZXRob2QgaW4gWydQVVQnLCAnREVMRVRFJ11cbiAgICAgIG9wdHMuaGVhZGVycyA9ICQuZXh0ZW5kKG9wdHMuaGVhZGVycywgeydYLUhUVFAtTWV0aG9kLU92ZXJyaWRlJzogbWV0aG9kfSlcbiAgICAgIG9wdHMudHlwZSA9ICdQT1NUJ1xuXG4gICAgIyBEb24ndCBKU09OaWZ5IG9iaiBpZiBtYWtpbmcgc2VhcmNoIHJlcXVlc3QuXG4gICAgaWYgYWN0aW9uIGlzIFwic2VhcmNoXCJcbiAgICAgIG9wdHMgPSAkLmV4dGVuZChvcHRzLCBkYXRhOiBvYmopXG4gICAgICByZXR1cm4gb3B0c1xuICAgIFxuICAgICMgYWRkIGFubm90YXRpb25EYXRhICBcbiAgICBpZiBhY3Rpb24gaXMgXCJjcmVhdGVcIiBvciBhY3Rpb24gaXMgXCJ1cGRhdGVcIlxuICAgICAgb2JqID0gJC5leHRlbmQob2JqLCBAb3B0aW9ucy5hbm5vdGF0aW9uRGF0YSlcbiAgICBcbiAgICBkYXRhID0gb2JqICYmIEpTT04uc3RyaW5naWZ5KG9iailcblxuICAgICMgSWYgZW11bGF0ZUpTT04gaXMgZW5hYmxlZCwgd2Ugc2VuZCBhIGZvcm0gcmVxdWVzdCAodGhlIGNvcnJlY3RcbiAgICAjIGNvbnRlbnRUeXBlIHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYnkgalF1ZXJ5KSwgYW5kIHB1dCB0aGVcbiAgICAjIEpTT04tZW5jb2RlZCBwYXlsb2FkIGluIHRoZSBcImpzb25cIiBrZXkuXG4gICAgaWYgQG9wdGlvbnMuZW11bGF0ZUpTT05cbiAgICAgIG9wdHMuZGF0YSA9IHtqc29uOiBkYXRhfVxuICAgICAgaWYgQG9wdGlvbnMuZW11bGF0ZUhUVFBcbiAgICAgICAgb3B0cy5kYXRhLl9tZXRob2QgPSBtZXRob2RcbiAgICAgIHJldHVybiBvcHRzXG5cbiAgICBvcHRzID0gJC5leHRlbmQob3B0cywge1xuICAgICAgZGF0YTogZGF0YVxuICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiXG4gICAgfSlcbiAgICByZXR1cm4gb3B0c1xuXG4gICMgQnVpbGRzIHRoZSBhcHByb3ByaWF0ZSBVUkwgZnJvbSB0aGUgb3B0aW9ucyBmb3IgdGhlIGFjdGlvbiBwcm92aWRlZC5cbiAgI1xuICAjIGFjdGlvbiAtIFRoZSBhY3Rpb24gU3RyaW5nLlxuICAjIGlkICAgICAtIFRoZSBhbm5vdGF0aW9uIGlkIGFzIGEgU3RyaW5nIG9yIE51bWJlci5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHN0b3JlLl91cmxGb3IoJ3VwZGF0ZScsIDM0KVxuICAjICAgIyA9PiBSZXR1cm5zIFwiL3N0b3JlL2Fubm90YXRpb25zLzM0XCJcbiAgI1xuICAjICAgc3RvcmUuX3VybEZvcignc2VhcmNoJylcbiAgIyAgICMgPT4gUmV0dXJucyBcIi9zdG9yZS9zZWFyY2hcIlxuICAjXG4gICMgUmV0dXJucyBVUkwgU3RyaW5nLlxuICBfdXJsRm9yOiAoYWN0aW9uLCBpZCkgLT5cbiAgICB1cmwgPSBpZiBAb3B0aW9ucy5wcmVmaXg/IHRoZW4gQG9wdGlvbnMucHJlZml4IGVsc2UgJydcbiAgICB1cmwgKz0gQG9wdGlvbnMudXJsc1thY3Rpb25dXG4gICAgIyBJZiB0aGVyZSdzIGEgJy86aWQnIGluIHRoZSBVUkwsIGVpdGhlciBmaWxsIGluIHRoZSBJRCBvciByZW1vdmUgdGhlXG4gICAgIyBzbGFzaDpcbiAgICB1cmwgPSB1cmwucmVwbGFjZSgvXFwvOmlkLywgaWYgaWQ/IHRoZW4gJy8nICsgaWQgZWxzZSAnJylcbiAgICAjIElmIHRoZXJlJ3MgYSBiYXJlICc6aWQnIGluIHRoZSBVUkwsIHRoZW4gc3Vic3RpdHV0ZSBkaXJlY3RseTpcbiAgICB1cmwgPSB1cmwucmVwbGFjZSgvOmlkLywgaWYgaWQ/IHRoZW4gaWQgZWxzZSAnJylcblxuICAgIHVybFxuXG4gICMgTWFwcyBhbiBhY3Rpb24gdG8gYW4gSFRUUCBtZXRob2QuXG4gICNcbiAgIyBhY3Rpb24gLSBUaGUgYWN0aW9uIFN0cmluZy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHN0b3JlLl9tZXRob2RGb3IoJ3JlYWQnKSAgICAjID0+IFwiR0VUXCJcbiAgIyAgIHN0b3JlLl9tZXRob2RGb3IoJ3VwZGF0ZScpICAjID0+IFwiUFVUXCJcbiAgIyAgIHN0b3JlLl9tZXRob2RGb3IoJ2Rlc3Ryb3knKSAjID0+IFwiREVMRVRFXCJcbiAgI1xuICAjIFJldHVybnMgSFRUUCBtZXRob2QgU3RyaW5nLlxuICBfbWV0aG9kRm9yOiAoYWN0aW9uKSAtPlxuICAgIHRhYmxlID0ge1xuICAgICAgJ2NyZWF0ZSc6ICAnUE9TVCdcbiAgICAgICdyZWFkJzogICAgJ0dFVCdcbiAgICAgICd1cGRhdGUnOiAgJ1BVVCdcbiAgICAgICdkZXN0cm95JzogJ0RFTEVURSdcbiAgICAgICdzZWFyY2gnOiAgJ0dFVCdcbiAgICB9XG5cbiAgICB0YWJsZVthY3Rpb25dXG5cbiAgIyBqUXVlcnkuYWpheCgpIGNhbGxiYWNrLiBEaXNwbGF5cyBhbiBlcnJvciBub3RpZmljYXRpb24gdG8gdGhlIHVzZXIgaWZcbiAgIyB0aGUgcmVxdWVzdCBmYWlsZWQuXG4gICNcbiAgIyB4aHIgLSBUaGUgalhNTEh0dHBSZXF1ZXN0IG9iamVjdC5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgX29uRXJyb3I6ICh4aHIpID0+XG4gICAgYWN0aW9uICA9IHhoci5fYWN0aW9uXG4gICAgbWVzc2FnZSA9IEFubm90YXRvci5fdChcIlNvcnJ5IHdlIGNvdWxkIG5vdCBcIikgKyBhY3Rpb24gKyBBbm5vdGF0b3IuX3QoXCIgdGhpcyBhbm5vdGF0aW9uXCIpXG5cbiAgICBpZiB4aHIuX2FjdGlvbiA9PSAnc2VhcmNoJ1xuICAgICAgbWVzc2FnZSA9IEFubm90YXRvci5fdChcIlNvcnJ5IHdlIGNvdWxkIG5vdCBzZWFyY2ggdGhlIHN0b3JlIGZvciBhbm5vdGF0aW9uc1wiKVxuICAgIGVsc2UgaWYgeGhyLl9hY3Rpb24gPT0gJ3JlYWQnICYmICF4aHIuX2lkXG4gICAgICBtZXNzYWdlID0gQW5ub3RhdG9yLl90KFwiU29ycnkgd2UgY291bGQgbm90IFwiKSArIGFjdGlvbiArIEFubm90YXRvci5fdChcIiB0aGUgYW5ub3RhdGlvbnMgZnJvbSB0aGUgc3RvcmVcIilcblxuICAgIHN3aXRjaCB4aHIuc3RhdHVzXG4gICAgICB3aGVuIDQwMSB0aGVuIG1lc3NhZ2UgPSBBbm5vdGF0b3IuX3QoXCJTb3JyeSB5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIFwiKSArIGFjdGlvbiArIEFubm90YXRvci5fdChcIiB0aGlzIGFubm90YXRpb25cIilcbiAgICAgIHdoZW4gNDA0IHRoZW4gbWVzc2FnZSA9IEFubm90YXRvci5fdChcIlNvcnJ5IHdlIGNvdWxkIG5vdCBjb25uZWN0IHRvIHRoZSBhbm5vdGF0aW9ucyBzdG9yZVwiKVxuICAgICAgd2hlbiA1MDAgdGhlbiBtZXNzYWdlID0gQW5ub3RhdG9yLl90KFwiU29ycnkgc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgYW5ub3RhdGlvbiBzdG9yZVwiKVxuXG4gICAgQW5ub3RhdG9yLnNob3dOb3RpZmljYXRpb24gbWVzc2FnZSwgQW5ub3RhdG9yLk5vdGlmaWNhdGlvbi5FUlJPUlxuXG4gICAgY29uc29sZS5lcnJvciBBbm5vdGF0b3IuX3QoXCJBUEkgcmVxdWVzdCBmYWlsZWQ6XCIpICsgXCIgJyN7eGhyLnN0YXR1c30nXCJcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEFubm90YXRvci5QbHVnaW4uU3RvcmVcbiIsIkFubm90YXRvciA9IHJlcXVpcmUoJ2Fubm90YXRvcicpXG5cblxuIyBQdWJsaWM6IFRhZ3MgcGx1Z2luIGFsbG93cyB1c2VycyB0byB0YWcgdGhpZXIgYW5ub3RhdGlvbnMgd2l0aCBtZXRhZGF0YVxuIyBzdG9yZWQgaW4gYW4gQXJyYXkgb24gdGhlIGFubm90YXRpb24gYXMgdGFncy5cbmNsYXNzIEFubm90YXRvci5QbHVnaW4uVGFncyBleHRlbmRzIEFubm90YXRvci5QbHVnaW5cblxuICBvcHRpb25zOlxuICAgICMgQ29uZmlndXJhYmxlIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgYSBzdHJpbmcgKHRoZSBjb250ZW50cylcbiAgICAjIG9mIHRoZSB0YWdzIGlucHV0IGFzIGFuIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZlxuICAgICMgdGFncy5cbiAgICBwYXJzZVRhZ3M6IChzdHJpbmcpIC0+XG4gICAgICBzdHJpbmcgPSAkLnRyaW0oc3RyaW5nKVxuXG4gICAgICB0YWdzID0gW11cbiAgICAgIHRhZ3MgPSBzdHJpbmcuc3BsaXQoL1xccysvKSBpZiBzdHJpbmdcbiAgICAgIHRhZ3NcblxuICAgICMgQ29uZmlndXJhYmxlIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgYW4gYXJyYXkgb2YgdGFncyBhbmRcbiAgICAjIHJldHVybnMgYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZpbGwgdGhlIHRhZ3MgaW5wdXQuXG4gICAgc3RyaW5naWZ5VGFnczogKGFycmF5KSAtPlxuICAgICAgYXJyYXkuam9pbihcIiBcIilcblxuICAjIFRoZSBmaWVsZCBlbGVtZW50IGFkZGVkIHRvIHRoZSBBbm5vdGF0b3IuRWRpdG9yIHdyYXBwZWQgaW4galF1ZXJ5LiBDYWNoZWQgdG9cbiAgIyBzYXZlIGhhdmluZyB0byByZWNyZWF0ZSBpdCBldmVyeXRpbWUgdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuXG4gIGZpZWxkOiBudWxsXG5cbiAgIyBUaGUgaW5wdXQgZWxlbWVudCBhZGRlZCB0byB0aGUgQW5ub3RhdG9yLkVkaXRvciB3cmFwcGVkIGluIGpRdWVyeS4gQ2FjaGVkIHRvXG4gICMgc2F2ZSBoYXZpbmcgdG8gcmVjcmVhdGUgaXQgZXZlcnl0aW1lIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLlxuICBpbnB1dDogbnVsbFxuXG4gICMgUHVibGljOiBJbml0aWFsaXNlcyB0aGUgcGx1Z2luIGFuZCBhZGRzIGN1c3RvbSBmaWVsZHMgdG8gYm90aCB0aGVcbiAgIyBhbm5vdGF0b3Igdmlld2VyIGFuZCBlZGl0b3IuIFRoZSBwbHVnaW4gYWxzbyBjaGVja3MgaWYgdGhlIGFubm90YXRvciBpc1xuICAjIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBicm93c2VyLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBwbHVnaW5Jbml0OiAtPlxuICAgIHJldHVybiB1bmxlc3MgQW5ub3RhdG9yLnN1cHBvcnRlZCgpXG5cbiAgICBAZmllbGQgPSBAYW5ub3RhdG9yLmVkaXRvci5hZGRGaWVsZCh7XG4gICAgICBsYWJlbDogIEFubm90YXRvci5fdCgnQWRkIHNvbWUgdGFncyBoZXJlJykgKyAnXFx1MjAyNidcbiAgICAgIGxvYWQ6ICAgdGhpcy51cGRhdGVGaWVsZFxuICAgICAgc3VibWl0OiB0aGlzLnNldEFubm90YXRpb25UYWdzXG4gICAgfSlcblxuICAgIEBhbm5vdGF0b3Iudmlld2VyLmFkZEZpZWxkKHtcbiAgICAgIGxvYWQ6IHRoaXMudXBkYXRlVmlld2VyXG4gICAgfSlcblxuICAgICMgQWRkIGEgZmlsdGVyIHRvIHRoZSBGaWx0ZXIgcGx1Z2luIGlmIGxvYWRlZC5cbiAgICBpZiBAYW5ub3RhdG9yLnBsdWdpbnMuRmlsdGVyXG4gICAgICBAYW5ub3RhdG9yLnBsdWdpbnMuRmlsdGVyLmFkZEZpbHRlclxuICAgICAgICBsYWJlbDogQW5ub3RhdG9yLl90KCdUYWcnKVxuICAgICAgICBwcm9wZXJ0eTogJ3RhZ3MnXG4gICAgICAgIGlzRmlsdGVyZWQ6IEFubm90YXRvci5QbHVnaW4uVGFncy5maWx0ZXJDYWxsYmFja1xuXG4gICAgQGlucHV0ID0gJChAZmllbGQpLmZpbmQoJzppbnB1dCcpXG5cbiAgIyBQdWJsaWM6IEV4dHJhY3RzIHRhZ3MgZnJvbSB0aGUgcHJvdmlkZWQgU3RyaW5nLlxuICAjXG4gICMgc3RyaW5nIC0gQSBTdHJpbmcgb2YgdGFncyBzZXBlcmF0ZWQgYnkgc3BhY2VzLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgcGx1Z2luLnBhcnNlVGFncygnY2FrZSBjaG9jb2xhdGUgY2FiYmFnZScpXG4gICMgICAjID0+IFsnY2FrZScsICdjaG9jb2xhdGUnLCAnY2FiYmFnZSddXG4gICNcbiAgIyBSZXR1cm5zIEFycmF5IG9mIHBhcnNlZCB0YWdzLlxuICBwYXJzZVRhZ3M6IChzdHJpbmcpIC0+XG4gICAgQG9wdGlvbnMucGFyc2VUYWdzKHN0cmluZylcblxuICAjIFB1YmxpYzogVGFrZXMgYW4gYXJyYXkgb2YgdGFncyBhbmQgc2VyaWFsaXNlcyB0aGVtIGludG8gYSBTdHJpbmcuXG4gICNcbiAgIyBhcnJheSAtIEFuIEFycmF5IG9mIHRhZ3MuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBwbHVnaW4uc3RyaW5naWZ5VGFncyhbJ2Nha2UnLCAnY2hvY29sYXRlJywgJ2NhYmJhZ2UnXSlcbiAgIyAgICMgPT4gJ2Nha2UgY2hvY29sYXRlIGNhYmJhZ2UnXG4gICNcbiAgIyBSZXR1cm5zIEFycmF5IG9mIHBhcnNlZCB0YWdzLlxuICBzdHJpbmdpZnlUYWdzOiAoYXJyYXkpIC0+XG4gICAgQG9wdGlvbnMuc3RyaW5naWZ5VGFncyhhcnJheSlcblxuICAjIEFubm90YXRvci5FZGl0b3IgY2FsbGJhY2sgZnVuY3Rpb24uIFVwZGF0ZXMgdGhlIEBpbnB1dCBmaWVsZCB3aXRoIHRoZVxuICAjIHRhZ3MgYXR0YWNoZWQgdG8gdGhlIHByb3ZpZGVkIGFubm90YXRpb24uXG4gICNcbiAgIyBmaWVsZCAgICAgIC0gVGhlIHRhZ3MgZmllbGQgRWxlbWVudCBjb250YWluaW5nIHRoZSBpbnB1dCBFbGVtZW50LlxuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIG9iamVjdCB0byBiZSBlZGl0ZWQuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBmaWVsZCA9ICQoJzxsaT48aW5wdXQgLz48L2xpPicpWzBdXG4gICMgICBwbHVnaW4udXBkYXRlRmllbGQoZmllbGQsIHt0YWdzOiBbJ2FwcGxlcycsICdvcmFuZ2VzJywgJ2Nha2UnXX0pXG4gICMgICBmaWVsZC52YWx1ZSAjID0+IFJldHVybnMgJ2FwcGxlcyBvcmFuZ2VzIGNha2UnXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIHVwZGF0ZUZpZWxkOiAoZmllbGQsIGFubm90YXRpb24pID0+XG4gICAgdmFsdWUgPSAnJ1xuICAgIHZhbHVlID0gdGhpcy5zdHJpbmdpZnlUYWdzKGFubm90YXRpb24udGFncykgaWYgYW5ub3RhdGlvbi50YWdzXG5cbiAgICBAaW5wdXQudmFsKHZhbHVlKVxuXG4gICMgQW5ub3RhdG9yLkVkaXRvciBjYWxsYmFjayBmdW5jdGlvbi4gVXBkYXRlcyB0aGUgYW5ub3RhdGlvbiBmaWVsZCB3aXRoIHRoZVxuICAjIGRhdGEgcmV0cmlldmVkIGZyb20gdGhlIEBpbnB1dCBwcm9wZXJ0eS5cbiAgI1xuICAjIGZpZWxkICAgICAgLSBUaGUgdGFncyBmaWVsZCBFbGVtZW50IGNvbnRhaW5pbmcgdGhlIGlucHV0IEVsZW1lbnQuXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gb2JqZWN0IHRvIGJlIHVwZGF0ZWQuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBhbm5vdGF0aW9uID0ge31cbiAgIyAgIGZpZWxkID0gJCgnPGxpPjxpbnB1dCB2YWx1ZT1cImNha2UgY2hvY29sYXRlIGNhYmJhZ2VcIiAvPjwvbGk+JylbMF1cbiAgI1xuICAjICAgcGx1Z2luLnNldEFubm90YXRpb25UYWdzKGZpZWxkLCBhbm5vdGF0aW9uKVxuICAjICAgYW5ub3RhdGlvbi50YWdzICMgPT4gUmV0dXJucyBbJ2Nha2UnLCAnY2hvY29sYXRlJywgJ2NhYmJhZ2UnXVxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBzZXRBbm5vdGF0aW9uVGFnczogKGZpZWxkLCBhbm5vdGF0aW9uKSA9PlxuICAgIGFubm90YXRpb24udGFncyA9IHRoaXMucGFyc2VUYWdzKEBpbnB1dC52YWwoKSlcblxuICAjIEFubm90YXRvci5WaWV3ZXIgY2FsbGJhY2sgZnVuY3Rpb24uIFVwZGF0ZXMgdGhlIGFubm90YXRpb24gZGlzcGxheSB3aXRoIHRhZ3NcbiAgIyByZW1vdmVzIHRoZSBmaWVsZCBmcm9tIHRoZSBWaWV3ZXIgaWYgdGhlcmUgYXJlIG5vIHRhZ3MgdG8gZGlzcGxheS5cbiAgI1xuICAjIGZpZWxkICAgICAgLSBUaGUgRWxlbWVudCB0byBwb3B1bGF0ZSB3aXRoIHRhZ3MuXG4gICMgYW5ub3RhdGlvbiAtIEFuIGFubm90YXRpb24gb2JqZWN0IHRvIGJlIGRpc3BsYXkuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICBmaWVsZCA9ICQoJzxkaXYgLz4nKVswXVxuICAjICAgcGx1Z2luLnVwZGF0ZUZpZWxkKGZpZWxkLCB7dGFnczogWydhcHBsZXMnXX0pXG4gICMgICBmaWVsZC5pbm5lckhUTUwgIyA9PiBSZXR1cm5zICc8c3BhbiBjbGFzcz1cImFubm90YXRvci10YWdcIj5hcHBsZXM8L3NwYW4+J1xuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICB1cGRhdGVWaWV3ZXI6IChmaWVsZCwgYW5ub3RhdGlvbikgLT5cbiAgICBmaWVsZCA9ICQoZmllbGQpXG5cbiAgICBpZiBhbm5vdGF0aW9uLnRhZ3MgYW5kICQuaXNBcnJheShhbm5vdGF0aW9uLnRhZ3MpIGFuZCBhbm5vdGF0aW9uLnRhZ3MubGVuZ3RoXG4gICAgICBmaWVsZC5hZGRDbGFzcygnYW5ub3RhdG9yLXRhZ3MnKS5odG1sKC0+XG4gICAgICAgIHN0cmluZyA9ICQubWFwKGFubm90YXRpb24udGFncywodGFnKSAtPlxuICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiYW5ub3RhdG9yLXRhZ1wiPicgKyBBbm5vdGF0b3IuVXRpbC5lc2NhcGUodGFnKSArICc8L3NwYW4+J1xuICAgICAgICApLmpvaW4oJyAnKVxuICAgICAgKVxuICAgIGVsc2VcbiAgICAgIGZpZWxkLnJlbW92ZSgpXG5cbiMgQ2hlY2tzIGFuIGlucHV0IHN0cmluZyBvZiBrZXl3b3JkcyBhZ2FpbnN0IGFuIGFycmF5IG9mIHRhZ3MuIElmIHRoZSBrZXl3b3Jkc1xuIyBtYXRjaCBfYWxsXyB0YWdzIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUuIFRoaXMgc2hvdWxkIGJlIHVzZWQgYXMgYSBjYWxsYmFja1xuIyBpbiB0aGUgRmlsdGVyIHBsdWdpbi5cbiNcbiMgaW5wdXQgLSBBIFN0cmluZyBvZiBrZXl3b3JkcyBmcm9tIGEgaW5wdXQgZmllbGQuXG4jXG4jIEV4YW1wbGVzXG4jXG4jICAgVGFncy5maWx0ZXJDYWxsYmFjaygnY2F0IGRvZyBtb3VzZScsIFsnY2F0JywgJ2RvZycsICdtb3VzZSddKSAvLz0+IHRydWVcbiMgICBUYWdzLmZpbHRlckNhbGxiYWNrKCdjYXQgZG9nJywgWydjYXQnLCAnZG9nJywgJ21vdXNlJ10pIC8vPT4gdHJ1ZVxuIyAgIFRhZ3MuZmlsdGVyQ2FsbGJhY2soJ2NhdCBkb2cnLCBbJ2NhdCddKSAvLz0+IGZhbHNlXG4jXG4jIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQga2V5d29yZHMgbWF0Y2ggYWxsIHRhZ3MuXG5Bbm5vdGF0b3IuUGx1Z2luLlRhZ3MuZmlsdGVyQ2FsbGJhY2sgPSAoaW5wdXQsIHRhZ3MgPSBbXSkgLT5cbiAgbWF0Y2hlcyAgPSAwXG4gIGtleXdvcmRzID0gW11cbiAgaWYgaW5wdXRcbiAgICBrZXl3b3JkcyA9IGlucHV0LnNwbGl0KC9cXHMrL2cpXG4gICAgZm9yIGtleXdvcmQgaW4ga2V5d29yZHMgd2hlbiB0YWdzLmxlbmd0aFxuICAgICAgbWF0Y2hlcyArPSAxIGZvciB0YWcgaW4gdGFncyB3aGVuIHRhZy5pbmRleE9mKGtleXdvcmQpICE9IC0xXG5cbiAgbWF0Y2hlcyA9PSBrZXl3b3Jkcy5sZW5ndGhcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEFubm90YXRvci5QbHVnaW4uVGFnc1xuIiwiQW5ub3RhdG9yID0gcmVxdWlyZSgnYW5ub3RhdG9yJylcblxuXG4jIFBsdWdpbiB0aGF0IHdpbGwgZGlzcGxheSBhIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlciBpZiB0aGllciBicm93c2VyIGRvZXNcbiMgbm90IHN1cHBvcnQgdGhlIEFubm90YXRvci5cbmNsYXNzIEFubm90YXRvci5QbHVnaW4uVW5zdXBwb3J0ZWQgZXh0ZW5kcyBBbm5vdGF0b3IuUGx1Z2luXG4gICMgT3B0aW9ucyBPYmplY3QsIG1lc3NhZ2Ugc2V0cyB0aGUgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhlIGJyb3dzZXIuXG4gIG9wdGlvbnM6XG4gICAgbWVzc2FnZTogQW5ub3RhdG9yLl90KFwiU29ycnkgeW91ciBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgQW5ub3RhdG9yXCIpXG5cbiAgIyBQdWJsaWM6IENoZWNrcyB0aGUgQW5ub3RhdG9yLnN1cHBvcnRlZCgpIG1ldGhvZCBhbmQgaWYgdW5zdXBwb3J0ZWQgZGlzcGxheXNcbiAgIyBAb3B0aW9ucy5tZXNzYWdlIGluIGEgbm90aWZpY2F0aW9uLlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBwbHVnaW5Jbml0OiAtPlxuICAgIHVubGVzcyBBbm5vdGF0b3Iuc3VwcG9ydGVkKClcbiAgICAgICQoPT5cbiAgICAgICAgIyBPbiBkb2N1bWVudCBsb2FkIGRpc3BsYXkgbm90aWZpY2F0aW9uLlxuICAgICAgICBBbm5vdGF0b3Iuc2hvd05vdGlmaWNhdGlvbihAb3B0aW9ucy5tZXNzYWdlKVxuXG4gICAgICAgICMgQWRkIGEgY2xhc3MgaWYgd2UncmUgaW4gSUU2LiBBIGJpdCBvZiBhIGhhY2sgYnV0IHdlIG5lZWQgdG8gYmUgYWJsZVxuICAgICAgICAjIHRvIHNldCB0aGUgbm90aWZpY2F0aW9uIHBvc2l0aW9uIGluIHRoZSBDU1MuXG4gICAgICAgIGlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QgPT0gdW5kZWZpbmVkKSBhbmQgKEFjdGl2ZVhPYmplY3QgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICQoJ2h0bWwnKS5hZGRDbGFzcygnaWU2JylcbiAgICAgIClcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEFubm90YXRvci5QbHVnaW4uVW5zdXBwb3J0ZWRcbiIsIlV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKVxuXG5cblJhbmdlID0ge31cblxuIyBQdWJsaWM6IERldGVybWluZXMgdGhlIHR5cGUgb2YgUmFuZ2Ugb2YgdGhlIHByb3ZpZGVkIG9iamVjdCBhbmQgcmV0dXJuc1xuIyBhIHN1aXRhYmxlIFJhbmdlIGluc3RhbmNlLlxuI1xuIyByIC0gQSByYW5nZSBPYmplY3QuXG4jXG4jIEV4YW1wbGVzXG4jXG4jICAgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4jICAgUmFuZ2Uuc25pZmYoc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkpXG4jICAgIyA9PiBSZXR1cm5zIGEgQnJvd3NlclJhbmdlIGluc3RhbmNlLlxuI1xuIyBSZXR1cm5zIGEgUmFuZ2Ugb2JqZWN0IG9yIGZhbHNlLlxuUmFuZ2Uuc25pZmYgPSAocikgLT5cbiAgaWYgci5jb21tb25BbmNlc3RvckNvbnRhaW5lcj9cbiAgICBuZXcgUmFuZ2UuQnJvd3NlclJhbmdlKHIpXG4gIGVsc2UgaWYgdHlwZW9mIHIuc3RhcnQgaXMgXCJzdHJpbmdcIlxuICAgIG5ldyBSYW5nZS5TZXJpYWxpemVkUmFuZ2UocilcbiAgZWxzZSBpZiByLnN0YXJ0IGFuZCB0eXBlb2Ygci5zdGFydCBpcyBcIm9iamVjdFwiXG4gICAgbmV3IFJhbmdlLk5vcm1hbGl6ZWRSYW5nZShyKVxuICBlbHNlXG4gICAgY29uc29sZS5lcnJvcihfdChcIkNvdWxkIG5vdCBzbmlmZiByYW5nZSB0eXBlXCIpKVxuICAgIGZhbHNlXG5cbiMgUHVibGljOiBGaW5kcyBhbiBFbGVtZW50IE5vZGUgdXNpbmcgYW4gWFBhdGggcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50IHJvb3QuXG4jXG4jIElmIHRoZSBkb2N1bWVudCBpcyBzZXJ2ZWQgYXMgYXBwbGljYXRpb24veGh0bWwreG1sIGl0IHdpbGwgdHJ5IGFuZCByZXNvbHZlXG4jIGFueSBuYW1lc3BhY2VzIHdpdGhpbiB0aGUgWFBhdGguXG4jXG4jIHhwYXRoIC0gQW4gWFBhdGggU3RyaW5nIHRvIHF1ZXJ5LlxuI1xuIyBFeGFtcGxlc1xuI1xuIyAgIG5vZGUgPSBSYW5nZS5ub2RlRnJvbVhQYXRoKCcvaHRtbC9ib2R5L2Rpdi9wWzJdJylcbiMgICBpZiBub2RlXG4jICAgICAjIERvIHNvbWV0aGluZyB3aXRoIHRoZSBub2RlLlxuI1xuIyBSZXR1cm5zIHRoZSBOb2RlIGlmIGZvdW5kIG90aGVyd2lzZSBudWxsLlxuUmFuZ2Uubm9kZUZyb21YUGF0aCA9ICh4cGF0aCwgcm9vdD1kb2N1bWVudCkgLT5cbiAgZXZhbHVhdGVYUGF0aCA9ICh4cCwgbnNSZXNvbHZlcj1udWxsKSAtPlxuICAgIHRyeVxuICAgICAgZG9jdW1lbnQuZXZhbHVhdGUoJy4nICsgeHAsIHJvb3QsIG5zUmVzb2x2ZXIsIFhQYXRoUmVzdWx0LkZJUlNUX09SREVSRURfTk9ERV9UWVBFLCBudWxsKS5zaW5nbGVOb2RlVmFsdWVcbiAgICBjYXRjaCBleGNlcHRpb25cbiAgICAgICMgVGhlcmUgYXJlIGNhc2VzIHdoZW4gdGhlIGV2YWx1YXRpb24gZmFpbHMsIGJlY2F1c2UgdGhlXG4gICAgICAjIEhUTUwgZG9jdW1lbnRzIGNvbnRhaW5zIG5vZGVzIHdpdGggaW52YWxpZCBuYW1lcyxcbiAgICAgICMgZm9yIGV4YW1wbGUgdGFncyB3aXRoIGVxdWFsIHNpZ25zIGluIHRoZW0sIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuXG4gICAgICAjIEluIHRoZXNlIGNhc2VzLCB0aGUgWFBhdGggZXhwcmVzc2lvbnMgd2lsbCBoYXZlIHRoZXNlIGFib21pbmF0aW9ucyxcbiAgICAgICMgdG9vLCBhbmQgdGhlbiB0aGV5IGNhbiBub3QgYmUgZXZhbHVhdGVkLlxuICAgICAgIyBJbiB0aGVzZSBjYXNlcywgd2UgZ2V0IGFuIFhQYXRoRXhjZXB0aW9uLCB3aXRoIGVycm9yIGNvZGUgNTIuXG4gICAgICAjIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1YUGF0aC94cGF0aC5odG1sI1hQYXRoRXhjZXB0aW9uXG4gICAgICAjIFRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWFrZSBhbnkgc2Vuc2UsIGJ1dCB0aGlzIHdoYXQgd2Ugc2VlXG4gICAgICAjIGhhcHBlbmluZy5cbiAgICAgIGNvbnNvbGUubG9nIFwiWFBhdGggZXZhbHVhdGlvbiBmYWlsZWQuXCJcbiAgICAgIGNvbnNvbGUubG9nIFwiVHJ5aW5nIGZhbGxiYWNrLi4uXCJcbiAgICAgICMgV2UgaGF2ZSBhIGFuICdldmFsdWF0b3InIGZvciB0aGUgcmVhbGx5IHNpbXBsZSBleHByZXNzaW9ucyB0aGF0XG4gICAgICAjIHNob3VsZCB3b3JrIGZvciB0aGUgc2ltcGxlIGV4cHJlc3Npb25zIHdlIGdlbmVyYXRlLlxuICAgICAgVXRpbC5ub2RlRnJvbVhQYXRoKHhwLCByb290KVxuXG4gIGlmIG5vdCAkLmlzWE1MRG9jIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgIGV2YWx1YXRlWFBhdGggeHBhdGhcbiAgZWxzZVxuICAgICMgV2UncmUgaW4gYW4gWE1MIGRvY3VtZW50LCBjcmVhdGUgYSBuYW1lc3BhY2UgcmVzb2x2ZXIgZnVuY3Rpb24gdG8gdHJ5XG4gICAgIyBhbmQgcmVzb2x2ZSBhbnkgbmFtZXNwYWNlcyBpbiB0aGUgY3VycmVudCBkb2N1bWVudC5cbiAgICAjIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS9kb2N1bWVudC5jcmVhdGVOU1Jlc29sdmVyXG4gICAgY3VzdG9tUmVzb2x2ZXIgPSBkb2N1bWVudC5jcmVhdGVOU1Jlc29sdmVyKFxuICAgICAgaWYgZG9jdW1lbnQub3duZXJEb2N1bWVudCA9PSBudWxsXG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgICAgZWxzZVxuICAgICAgICBkb2N1bWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgIClcbiAgICBub2RlID0gZXZhbHVhdGVYUGF0aCB4cGF0aCwgY3VzdG9tUmVzb2x2ZXJcblxuICAgIHVubGVzcyBub2RlXG4gICAgICAjIElmIHRoZSBwcmV2aW91cyBzZWFyY2ggZmFpbGVkIHRvIGZpbmQgYSBub2RlIHRoZW4gd2UgbXVzdCB0cnkgdG9cbiAgICAgICMgcHJvdmlkZSBhIGN1c3RvbSBuYW1lc3BhY2UgcmVzb2x2ZXIgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIGRlZmF1bHRcbiAgICAgICMgbmFtZXNwYWNlLiBXZSBhbHNvIHByZWZpeCBhbGwgbm9kZSBuYW1lcyB3aXRoIGEgY3VzdG9tIHhodG1sIG5hbWVzcGFjZVxuICAgICAgIyBlZy4gJ2RpdicgPT4gJ3hodG1sOmRpdicuXG4gICAgICB4cGF0aCA9IChmb3Igc2VnbWVudCBpbiB4cGF0aC5zcGxpdCAnLydcbiAgICAgICAgaWYgc2VnbWVudCBhbmQgc2VnbWVudC5pbmRleE9mKCc6JykgPT0gLTFcbiAgICAgICAgICBzZWdtZW50LnJlcGxhY2UoL14oW2Etel0rKS8sICd4aHRtbDokMScpXG4gICAgICAgIGVsc2Ugc2VnbWVudFxuICAgICAgKS5qb2luKCcvJylcblxuICAgICAgIyBGaW5kIHRoZSBkZWZhdWx0IGRvY3VtZW50IG5hbWVzcGFjZS5cbiAgICAgIG5hbWVzcGFjZSA9IGRvY3VtZW50Lmxvb2t1cE5hbWVzcGFjZVVSSSBudWxsXG5cbiAgICAgICMgVHJ5IGFuZCByZXNvbHZlIHRoZSBuYW1lc3BhY2UsIGZpcnN0IHNlZWluZyBpZiBpdCBpcyBhbiB4aHRtbCBub2RlXG4gICAgICAjIG90aGVyd2lzZSBjaGVjayB0aGUgaGVhZCBhdHRyaWJ1dGVzLlxuICAgICAgY3VzdG9tUmVzb2x2ZXIgID0gKG5zKSAtPlxuICAgICAgICBpZiBucyA9PSAneGh0bWwnIHRoZW4gbmFtZXNwYWNlXG4gICAgICAgIGVsc2UgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgneG1sbnM6JyArIG5zKVxuXG4gICAgICBub2RlID0gZXZhbHVhdGVYUGF0aCB4cGF0aCwgY3VzdG9tUmVzb2x2ZXJcbiAgICBub2RlXG5cbmNsYXNzIFJhbmdlLlJhbmdlRXJyb3IgZXh0ZW5kcyBFcnJvclxuICBjb25zdHJ1Y3RvcjogKEB0eXBlLCBAbWVzc2FnZSwgQHBhcmVudD1udWxsKSAtPlxuICAgIHN1cGVyKEBtZXNzYWdlKVxuXG4jIFB1YmxpYzogQ3JlYXRlcyBhIHdyYXBwZXIgYXJvdW5kIGEgcmFuZ2Ugb2JqZWN0IG9idGFpbmVkIGZyb20gYSBET01TZWxlY3Rpb24uXG5jbGFzcyBSYW5nZS5Ccm93c2VyUmFuZ2VcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCcm93c2VyUmFuZ2UuXG4gICNcbiAgIyBvYmplY3QgLSBBIHJhbmdlIG9iamVjdCBvYnRhaW5lZCB2aWEgRE9NU2VsZWN0aW9uI2dldFJhbmdlQXQoKS5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAjICAgcmFuZ2UgPSBuZXcgUmFuZ2UuQnJvd3NlclJhbmdlKHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApKVxuICAjXG4gICMgUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBCcm93c2VyUmFuZ2UuXG4gIGNvbnN0cnVjdG9yOiAob2JqKSAtPlxuICAgIEBjb21tb25BbmNlc3RvckNvbnRhaW5lciA9IG9iai5jb21tb25BbmNlc3RvckNvbnRhaW5lclxuICAgIEBzdGFydENvbnRhaW5lciAgICAgICAgICA9IG9iai5zdGFydENvbnRhaW5lclxuICAgIEBzdGFydE9mZnNldCAgICAgICAgICAgICA9IG9iai5zdGFydE9mZnNldFxuICAgIEBlbmRDb250YWluZXIgICAgICAgICAgICA9IG9iai5lbmRDb250YWluZXJcbiAgICBAZW5kT2Zmc2V0ICAgICAgICAgICAgICAgPSBvYmouZW5kT2Zmc2V0XG5cbiAgIyBQdWJsaWM6IG5vcm1hbGl6ZSB3b3JrcyBhcm91bmQgdGhlIGZhY3QgdGhhdCBicm93c2VycyBkb24ndCBnZW5lcmF0ZVxuICAjIHJhbmdlcy9zZWxlY3Rpb25zIGluIGEgY29uc2lzdGVudCBtYW5uZXIuIFNvbWUgKFNhZmFyaSkgd2lsbCBjcmVhdGVcbiAgIyByYW5nZXMgdGhhdCBoYXZlIChzYXkpIGEgdGV4dE5vZGUgc3RhcnRDb250YWluZXIgYW5kIGVsZW1lbnROb2RlXG4gICMgZW5kQ29udGFpbmVyLiBPdGhlcnMgKEZpcmVmb3gpIHNlZW0gdG8gb25seSBldmVyIGdlbmVyYXRlXG4gICMgdGV4dE5vZGUvdGV4dE5vZGUgb3IgZWxlbWVudE5vZGUvZWxlbWVudE5vZGUgcGFpcnMuXG4gICNcbiAgIyBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIFJhbmdlLk5vcm1hbGl6ZWRSYW5nZVxuICBub3JtYWxpemU6IChyb290KSAtPlxuICAgIGlmIEB0YWludGVkXG4gICAgICBjb25zb2xlLmVycm9yKF90KFwiWW91IG1heSBvbmx5IGNhbGwgbm9ybWFsaXplKCkgb25jZSBvbiBhIEJyb3dzZXJSYW5nZSFcIikpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBlbHNlXG4gICAgICBAdGFpbnRlZCA9IHRydWVcblxuICAgIHIgPSB7fVxuXG4gICAgIyBMb29rIGF0IHRoZSBzdGFydFxuICAgIGlmIEBzdGFydENvbnRhaW5lci5ub2RlVHlwZSBpcyBOb2RlLkVMRU1FTlRfTk9ERVxuICAgICAgIyBXZSBhcmUgZGVhbGluZyB3aXRoIGVsZW1lbnQgbm9kZXMgIFxuICAgICAgci5zdGFydCA9IFV0aWwuZ2V0Rmlyc3RUZXh0Tm9kZU5vdEJlZm9yZSBAc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tAc3RhcnRPZmZzZXRdXG4gICAgICByLnN0YXJ0T2Zmc2V0ID0gMFxuICAgIGVsc2VcbiAgICAgICMgV2UgYXJlIGRlYWxpbmcgd2l0aCBzaW1wbGUgdGV4dCBub2Rlc1xuICAgICAgci5zdGFydCA9IEBzdGFydENvbnRhaW5lclxuICAgICAgci5zdGFydE9mZnNldCA9IEBzdGFydE9mZnNldFxuXG4gICAgIyBMb29rIGF0IHRoZSBlbmRcbiAgICBpZiBAZW5kQ29udGFpbmVyLm5vZGVUeXBlIGlzIE5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAjIEdldCBzcGVjaWZpZWQgbm9kZS5cbiAgICAgIG5vZGUgPSBAZW5kQ29udGFpbmVyLmNoaWxkTm9kZXNbQGVuZE9mZnNldF1cblxuICAgICAgaWYgbm9kZT8gIyBEb2VzIHRoYXQgbm9kZSBleGlzdD9cbiAgICAgICAgIyBMb29rIGZvciBhIHRleHQgbm9kZSBlaXRoZXIgYXQgdGhlIGltbWVkaWF0ZSBiZWdpbm5pbmcgb2Ygbm9kZVxuICAgICAgICBuID0gbm9kZVxuICAgICAgICB3aGlsZSBuPyBhbmQgKG4ubm9kZVR5cGUgaXNudCBOb2RlLlRFWFRfTk9ERSlcbiAgICAgICAgICBuID0gbi5maXJzdENoaWxkXG4gICAgICAgIGlmIG4/ICMgRGlkIHdlIGZpbmQgYSB0ZXh0IG5vZGUgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZWxlbWVudD9cbiAgICAgICAgICByLmVuZCA9IG5cbiAgICAgICAgICByLmVuZE9mZnNldCA9IDBcblxuICAgICAgdW5sZXNzIHIuZW5kPyAgXG4gICAgICAgICMgV2UgbmVlZCB0byBmaW5kIGEgdGV4dCBub2RlIGluIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIHRoZSBub2RlIGF0IHRoZVxuICAgICAgICAjIGdpdmVuIG9mZnNldCwgaWYgb25lIGV4aXN0cywgb3IgaW4gdGhlIHByZXZpb3VzIHNpYmxpbmcgb2YgaXRzIGNvbnRhaW5lci5cbiAgICAgICAgaWYgQGVuZE9mZnNldFxuICAgICAgICAgIG5vZGUgPSBAZW5kQ29udGFpbmVyLmNoaWxkTm9kZXNbQGVuZE9mZnNldCAtIDFdXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBub2RlID0gQGVuZENvbnRhaW5lci5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgci5lbmQgPSBVdGlsLmdldExhc3RUZXh0Tm9kZVVwVG8gbm9kZVxuICAgICAgICByLmVuZE9mZnNldCA9IHIuZW5kLm5vZGVWYWx1ZS5sZW5ndGhcblxuICAgIGVsc2UgIyBXZSBhcmUgZGVhbGluZyB3aXRoIHNpbXBsZSB0ZXh0IG5vZGVzXG4gICAgICByLmVuZCA9IEBlbmRDb250YWluZXJcbiAgICAgIHIuZW5kT2Zmc2V0ID0gQGVuZE9mZnNldFxuXG4gICAgIyBXZSBoYXZlIGNvbGxlY3RlZCB0aGUgaW5pdGlhbCBkYXRhLlxuXG4gICAgIyBOb3cgbGV0J3Mgc3RhcnQgdG8gc2xpY2UgJiBkaWNlIHRoZSB0ZXh0IGVsZW1lbnRzIVxuICAgIG5yID0ge31cblxuICAgIGlmIHIuc3RhcnRPZmZzZXQgPiAwXG4gICAgICAjIERvIHdlIHJlYWxseSBoYXZlIHRvIGN1dD9cbiAgICAgIGlmIHIuc3RhcnQubm9kZVZhbHVlLmxlbmd0aCA+IHIuc3RhcnRPZmZzZXRcbiAgICAgICAgIyBZZXMuIEN1dC5cbiAgICAgICAgbnIuc3RhcnQgPSByLnN0YXJ0LnNwbGl0VGV4dChyLnN0YXJ0T2Zmc2V0KVxuICAgICAgZWxzZVxuICAgICAgICAjIEF2b2lkIHNwbGl0dGluZyBvZmYgemVyby1sZW5ndGggcGllY2VzLlxuICAgICAgICBuci5zdGFydCA9IHIuc3RhcnQubmV4dFNpYmxpbmdcbiAgICBlbHNlXG4gICAgICBuci5zdGFydCA9IHIuc3RhcnRcblxuICAgICMgaXMgdGhlIHdob2xlIHNlbGVjdGlvbiBpbnNpZGUgb25lIHRleHQgZWxlbWVudCA/XG4gICAgaWYgci5zdGFydCBpcyByLmVuZFxuICAgICAgaWYgbnIuc3RhcnQubm9kZVZhbHVlLmxlbmd0aCA+IChyLmVuZE9mZnNldCAtIHIuc3RhcnRPZmZzZXQpXG4gICAgICAgIG5yLnN0YXJ0LnNwbGl0VGV4dChyLmVuZE9mZnNldCAtIHIuc3RhcnRPZmZzZXQpXG4gICAgICBuci5lbmQgPSBuci5zdGFydFxuICAgIGVsc2UgIyBubywgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGlzIGluIGEgc2VwYXJhdGUgdGV4dCBlbGVtZW50XG4gICAgICAjIGRvZXMgdGhlIGVuZCBuZWVkIHRvIGJlIGN1dD9cbiAgICAgIGlmIHIuZW5kLm5vZGVWYWx1ZS5sZW5ndGggPiByLmVuZE9mZnNldFxuICAgICAgICByLmVuZC5zcGxpdFRleHQoci5lbmRPZmZzZXQpXG4gICAgICBuci5lbmQgPSByLmVuZFxuXG4gICAgIyBNYWtlIHN1cmUgdGhlIGNvbW1vbiBhbmNlc3RvciBpcyBhbiBlbGVtZW50IG5vZGUuXG4gICAgbnIuY29tbW9uQW5jZXN0b3IgPSBAY29tbW9uQW5jZXN0b3JDb250YWluZXJcbiAgICB3aGlsZSBuci5jb21tb25BbmNlc3Rvci5ub2RlVHlwZSBpc250IE5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICBuci5jb21tb25BbmNlc3RvciA9IG5yLmNvbW1vbkFuY2VzdG9yLnBhcmVudE5vZGVcblxuICAgIG5ldyBSYW5nZS5Ob3JtYWxpemVkUmFuZ2UobnIpXG5cbiAgIyBQdWJsaWM6IENyZWF0ZXMgYSByYW5nZSBzdWl0YWJsZSBmb3Igc3RvcmFnZS5cbiAgI1xuICAjIHJvb3QgICAgICAgICAgIC0gQSByb290IEVsZW1lbnQgZnJvbSB3aGljaCB0byBhbmNob3IgdGhlIHNlcmlhbGlzYXRpb24uXG4gICMgaWdub3JlU2VsZWN0b3IgLSBBIHNlbGVjdG9yIFN0cmluZyBvZiBlbGVtZW50cyB0byBpZ25vcmUuIEZvciBleGFtcGxlXG4gICMgICAgICAgICAgICAgICAgICBlbGVtZW50cyBpbmplY3RlZCBieSB0aGUgYW5ub3RhdG9yLlxuICAjXG4gICMgUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBTZXJpYWxpemVkUmFuZ2UuXG4gIHNlcmlhbGl6ZTogKHJvb3QsIGlnbm9yZVNlbGVjdG9yKSAtPlxuICAgIHRoaXMubm9ybWFsaXplKHJvb3QpLnNlcmlhbGl6ZShyb290LCBpZ25vcmVTZWxlY3RvcilcblxuIyBQdWJsaWM6IEEgbm9ybWFsaXNlZCByYW5nZSBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgdGhyb3VnaG91dCB0aGUgYW5ub3RhdG9yLlxuIyBpdHMgdGhlIHJlc3VsdCBvZiBhIGRlc2VyaWFsaXNlZCBTZXJpYWxpemVkUmFuZ2Ugb3IgYSBCcm93c2VyUmFuZ2Ugd2l0aFxuIyBvdXQgYnJvd3NlciBpbmNvbnNpc3RlbmNpZXMuXG5jbGFzcyBSYW5nZS5Ob3JtYWxpemVkUmFuZ2VcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIE5vcm1hbGl6ZWRSYW5nZS5cbiAgI1xuICAjIFRoaXMgaXMgdXN1YWxseSBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIC5ub3JtYWxpemUoKSBtZXRob2Qgb24gb25lIG9mIHRoZVxuICAjIG90aGVyIFJhbmdlIGNsYXNzZXMgcmF0aGVyIHRoYW4gbWFudWFsbHkuXG4gICNcbiAgIyBvYmogLSBBbiBPYmplY3QgbGl0ZXJhbC4gU2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzLlxuICAjICAgICAgIGNvbW1vbkFuY2VzdG9yOiBBIEVsZW1lbnQgdGhhdCBlbmNvbXBhc3NlcyBib3RoIHRoZSBzdGFydCBhbmQgZW5kIG5vZGVzXG4gICMgICAgICAgc3RhcnQ6ICAgICAgICAgIFRoZSBmaXJzdCBUZXh0Tm9kZSBpbiB0aGUgcmFuZ2UuXG4gICMgICAgICAgZW5kICAgICAgICAgICAgIFRoZSBsYXN0IFRleHROb2RlIGluIHRoZSByYW5nZS5cbiAgI1xuICAjIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgTm9ybWFsaXplZFJhbmdlLlxuICBjb25zdHJ1Y3RvcjogKG9iaikgLT5cbiAgICBAY29tbW9uQW5jZXN0b3IgPSBvYmouY29tbW9uQW5jZXN0b3JcbiAgICBAc3RhcnQgICAgICAgICAgPSBvYmouc3RhcnRcbiAgICBAZW5kICAgICAgICAgICAgPSBvYmouZW5kXG5cbiAgIyBQdWJsaWM6IEZvciBBUEkgY29uc2lzdGVuY3kuXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZi5cbiAgbm9ybWFsaXplOiAocm9vdCkgLT5cbiAgICB0aGlzXG5cbiAgIyBQdWJsaWM6IExpbWl0cyB0aGUgbm9kZXMgd2l0aGluIHRoZSBOb3JtYWxpemVkUmFuZ2UgdG8gdGhvc2UgY29udGFpbmVkXG4gICMgd2l0aGluZyB0aGUgYm91bmRzIHBhcmFtZXRlci4gSXQgcmV0dXJucyBhbiB1cGRhdGVkIHJhbmdlIHdpdGggYWxsXG4gICMgcHJvcGVydGllcyB1cGRhdGVkLiBOT1RFOiBNZXRob2QgcmV0dXJucyBudWxsIGlmIGFsbCBub2RlcyBmYWxsIG91dHNpZGVcbiAgIyBvZiB0aGUgYm91bmRzLlxuICAjXG4gICMgYm91bmRzIC0gQW4gRWxlbWVudCB0byBsaW1pdCB0aGUgcmFuZ2UgdG8uXG4gICNcbiAgIyBSZXR1cm5zIHVwZGF0ZWQgc2VsZiBvciBudWxsLlxuICBsaW1pdDogKGJvdW5kcykgLT5cbiAgICBub2RlcyA9ICQuZ3JlcCB0aGlzLnRleHROb2RlcygpLCAobm9kZSkgLT5cbiAgICAgIG5vZGUucGFyZW50Tm9kZSA9PSBib3VuZHMgb3IgJC5jb250YWlucyhib3VuZHMsIG5vZGUucGFyZW50Tm9kZSlcblxuICAgIHJldHVybiBudWxsIHVubGVzcyBub2Rlcy5sZW5ndGhcblxuICAgIEBzdGFydCA9IG5vZGVzWzBdXG4gICAgQGVuZCAgID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV1cblxuICAgIHN0YXJ0UGFyZW50cyA9ICQoQHN0YXJ0KS5wYXJlbnRzKClcbiAgICBmb3IgcGFyZW50IGluICQoQGVuZCkucGFyZW50cygpXG4gICAgICBpZiBzdGFydFBhcmVudHMuaW5kZXgocGFyZW50KSAhPSAtMVxuICAgICAgICBAY29tbW9uQW5jZXN0b3IgPSBwYXJlbnRcbiAgICAgICAgYnJlYWtcbiAgICB0aGlzXG5cbiAgIyBDb252ZXJ0IHRoaXMgcmFuZ2UgaW50byBhbiBvYmplY3QgY29uc2lzdGluZyBvZiB0d28gcGFpcnMgb2YgKHhwYXRoLFxuICAjIGNoYXJhY3RlciBvZmZzZXQpLCB3aGljaCBjYW4gYmUgZWFzaWx5IHN0b3JlZCBpbiBhIGRhdGFiYXNlLlxuICAjXG4gICMgcm9vdCAtICAgICAgICAgICBUaGUgcm9vdCBFbGVtZW50IHJlbGF0aXZlIHRvIHdoaWNoIFhQYXRocyBzaG91bGQgYmUgY2FsY3VsYXRlZFxuICAjIGlnbm9yZVNlbGVjdG9yIC0gQSBzZWxlY3RvciBTdHJpbmcgb2YgZWxlbWVudHMgdG8gaWdub3JlLiBGb3IgZXhhbXBsZVxuICAjICAgICAgICAgICAgICAgICAgZWxlbWVudHMgaW5qZWN0ZWQgYnkgdGhlIGFubm90YXRvci5cbiAgI1xuICAjIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgU2VyaWFsaXplZFJhbmdlLlxuICBzZXJpYWxpemU6IChyb290LCBpZ25vcmVTZWxlY3RvcikgLT5cblxuICAgIHNlcmlhbGl6YXRpb24gPSAobm9kZSwgaXNFbmQpIC0+XG4gICAgICBpZiBpZ25vcmVTZWxlY3RvclxuICAgICAgICBvcmlnUGFyZW50ID0gJChub2RlKS5wYXJlbnRzKFwiOm5vdCgje2lnbm9yZVNlbGVjdG9yfSlcIikuZXEoMClcbiAgICAgIGVsc2VcbiAgICAgICAgb3JpZ1BhcmVudCA9ICQobm9kZSkucGFyZW50KClcblxuICAgICAgeHBhdGggPSBVdGlsLnhwYXRoRnJvbU5vZGUob3JpZ1BhcmVudCwgcm9vdClbMF1cbiAgICAgIHRleHROb2RlcyA9IFV0aWwuZ2V0VGV4dE5vZGVzKG9yaWdQYXJlbnQpXG5cbiAgICAgICMgQ2FsY3VsYXRlIHJlYWwgb2Zmc2V0IGFzIHRoZSBjb21iaW5lZCBsZW5ndGggb2YgYWxsIHRoZVxuICAgICAgIyBwcmVjZWRpbmcgdGV4dE5vZGUgc2libGluZ3MuIFdlIGluY2x1ZGUgdGhlIGxlbmd0aCBvZiB0aGVcbiAgICAgICMgbm9kZSBpZiBpdCdzIHRoZSBlbmQgbm9kZS5cbiAgICAgIG5vZGVzID0gdGV4dE5vZGVzLnNsaWNlKDAsIHRleHROb2Rlcy5pbmRleChub2RlKSlcbiAgICAgIG9mZnNldCA9IDBcbiAgICAgIGZvciBuIGluIG5vZGVzXG4gICAgICAgIG9mZnNldCArPSBuLm5vZGVWYWx1ZS5sZW5ndGhcblxuICAgICAgaWYgaXNFbmQgdGhlbiBbeHBhdGgsIG9mZnNldCArIG5vZGUubm9kZVZhbHVlLmxlbmd0aF0gZWxzZSBbeHBhdGgsIG9mZnNldF1cblxuICAgIHN0YXJ0ID0gc2VyaWFsaXphdGlvbihAc3RhcnQpXG4gICAgZW5kICAgPSBzZXJpYWxpemF0aW9uKEBlbmQsIHRydWUpXG5cbiAgICBuZXcgUmFuZ2UuU2VyaWFsaXplZFJhbmdlKHtcbiAgICAgICMgWFBhdGggc3RyaW5nc1xuICAgICAgc3RhcnQ6IHN0YXJ0WzBdXG4gICAgICBlbmQ6IGVuZFswXVxuICAgICAgIyBDaGFyYWN0ZXIgb2Zmc2V0cyAoaW50ZWdlcilcbiAgICAgIHN0YXJ0T2Zmc2V0OiBzdGFydFsxXVxuICAgICAgZW5kT2Zmc2V0OiBlbmRbMV1cbiAgICB9KVxuXG4gICMgUHVibGljOiBDcmVhdGVzIGEgY29uY2F0ZW5hdGVkIFN0cmluZyBvZiB0aGUgY29udGVudHMgb2YgYWxsIHRoZSB0ZXh0IG5vZGVzXG4gICMgd2l0aGluIHRoZSByYW5nZS5cbiAgI1xuICAjIFJldHVybnMgYSBTdHJpbmcuXG4gIHRleHQ6IC0+XG4gICAgKGZvciBub2RlIGluIHRoaXMudGV4dE5vZGVzKClcbiAgICAgIG5vZGUubm9kZVZhbHVlXG4gICAgKS5qb2luICcnXG5cbiAgIyBQdWJsaWM6IEZldGNoZXMgb25seSB0aGUgdGV4dCBub2RlcyB3aXRoaW4gdGggcmFuZ2UuXG4gICNcbiAgIyBSZXR1cm5zIGFuIEFycmF5IG9mIFRleHROb2RlIGluc3RhbmNlcy5cbiAgdGV4dE5vZGVzOiAtPlxuICAgIHRleHROb2RlcyA9IFV0aWwuZ2V0VGV4dE5vZGVzKCQodGhpcy5jb21tb25BbmNlc3RvcikpXG4gICAgW3N0YXJ0LCBlbmRdID0gW3RleHROb2Rlcy5pbmRleCh0aGlzLnN0YXJ0KSwgdGV4dE5vZGVzLmluZGV4KHRoaXMuZW5kKV1cbiAgICAjIFJldHVybiB0aGUgdGV4dE5vZGVzIHRoYXQgZmFsbCBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIGluZGV4ZXMuXG4gICAgJC5tYWtlQXJyYXkgdGV4dE5vZGVzW3N0YXJ0Li5lbmRdXG5cbiAgIyBQdWJsaWM6IENvbnZlcnRzIHRoZSBOb3JtYWxpemVkIHJhbmdlIHRvIGEgbmF0aXZlIGJyb3dzZXIgcmFuZ2UuXG4gICNcbiAgIyBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS9yYW5nZVxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICMgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgIyAgIHNlbGVjdGlvbi5hZGRSYW5nZShub3JtZWRSYW5nZS50b1JhbmdlKCkpXG4gICNcbiAgIyBSZXR1cm5zIGEgUmFuZ2Ugb2JqZWN0LlxuICB0b1JhbmdlOiAtPlxuICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKEBzdGFydClcbiAgICByYW5nZS5zZXRFbmRBZnRlcihAZW5kKVxuICAgIHJhbmdlXG5cbiMgUHVibGljOiBBIHJhbmdlIHN1aXRhYmxlIGZvciBzdG9yaW5nIGluIGxvY2FsIHN0b3JhZ2Ugb3Igc2VyaWFsaXppbmcgdG8gSlNPTi5cbmNsYXNzIFJhbmdlLlNlcmlhbGl6ZWRSYW5nZVxuXG4gICMgUHVibGljOiBDcmVhdGVzIGEgU2VyaWFsaXplZFJhbmdlXG4gICNcbiAgIyBvYmogLSBUaGUgc3RvcmVkIG9iamVjdC4gSXQgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzLlxuICAjICAgICAgIHN0YXJ0OiAgICAgICBBbiB4cGF0aCB0byB0aGUgRWxlbWVudCBjb250YWluaW5nIHRoZSBmaXJzdCBUZXh0Tm9kZVxuICAjICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBFbGVtZW50LlxuICAjICAgICAgIHN0YXJ0T2Zmc2V0OiBUaGUgb2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgc2VsZWN0aW9uIGZyb20gb2JqLnN0YXJ0LlxuICAjICAgICAgIGVuZDogICAgICAgICBBbiB4cGF0aCB0byB0aGUgRWxlbWVudCBjb250YWluaW5nIHRoZSBsYXN0IFRleHROb2RlXG4gICMgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByb290IEVsZW1lbnQuXG4gICMgICAgICAgc3RhcnRPZmZzZXQ6IFRoZSBvZmZzZXQgdG8gdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGZyb20gb2JqLmVuZC5cbiAgI1xuICAjIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgU2VyaWFsaXplZFJhbmdlXG4gIGNvbnN0cnVjdG9yOiAob2JqKSAtPlxuICAgIEBzdGFydCAgICAgICA9IG9iai5zdGFydFxuICAgIEBzdGFydE9mZnNldCA9IG9iai5zdGFydE9mZnNldFxuICAgIEBlbmQgICAgICAgICA9IG9iai5lbmRcbiAgICBAZW5kT2Zmc2V0ICAgPSBvYmouZW5kT2Zmc2V0XG5cbiAgIyBQdWJsaWM6IENyZWF0ZXMgYSBOb3JtYWxpemVkUmFuZ2UuXG4gICNcbiAgIyByb290IC0gVGhlIHJvb3QgRWxlbWVudCBmcm9tIHdoaWNoIHRoZSBYUGF0aHMgd2VyZSBnZW5lcmF0ZWQuXG4gICNcbiAgIyBSZXR1cm5zIGEgTm9ybWFsaXplZFJhbmdlIGluc3RhbmNlLlxuICBub3JtYWxpemU6IChyb290KSAtPlxuICAgIHJhbmdlID0ge31cblxuICAgIGZvciBwIGluIFsnc3RhcnQnLCAnZW5kJ11cbiAgICAgIHRyeVxuICAgICAgICBub2RlID0gUmFuZ2Uubm9kZUZyb21YUGF0aCh0aGlzW3BdLCByb290KVxuICAgICAgY2F0Y2ggZVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2UuUmFuZ2VFcnJvcihwLCBcIkVycm9yIHdoaWxlIGZpbmRpbmcgI3twfSBub2RlOiAje3RoaXNbcF19OiBcIiArIGUsIGUpXG5cbiAgICAgIGlmIG5vdCBub2RlXG4gICAgICAgIHRocm93IG5ldyBSYW5nZS5SYW5nZUVycm9yKHAsIFwiQ291bGRuJ3QgZmluZCAje3B9IG5vZGU6ICN7dGhpc1twXX1cIilcblxuICAgICAgIyBVbmZvcnR1bmF0ZWx5LCB3ZSAqY2FuJ3QqIGd1YXJhbnRlZSBvbmx5IG9uZSB0ZXh0Tm9kZSBwZXJcbiAgICAgICMgZWxlbWVudE5vZGUsIHNvIHdlIGhhdmUgdG8gd2FsayBhbG9uZyB0aGUgZWxlbWVudCdzIHRleHROb2RlcyB1bnRpbFxuICAgICAgIyB0aGUgY29tYmluZWQgbGVuZ3RoIG9mIHRoZSB0ZXh0Tm9kZXMgdG8gdGhhdCBwb2ludCBleGNlZWRzIG9yXG4gICAgICAjIG1hdGNoZXMgdGhlIHZhbHVlIG9mIHRoZSBvZmZzZXQuXG4gICAgICBsZW5ndGggPSAwXG4gICAgICB0YXJnZXRPZmZzZXQgPSB0aGlzW3AgKyAnT2Zmc2V0J11cblxuICAgICAgIyBSYW5nZSBleGNsdWRlcyBpdHMgZW5kcG9pbnQgYmVjYXVzZSBpdCBkZXNjcmliZXMgdGhlIGJvdW5kYXJ5IHBvc2l0aW9uLlxuICAgICAgIyBUYXJnZXQgdGhlIHN0cmluZyBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW5zaWRlIHRoZSByYW5nZS5cbiAgICAgIGlmIHAgaXMgJ2VuZCcgdGhlbiB0YXJnZXRPZmZzZXQtLVxuXG4gICAgICBmb3IgdG4gaW4gVXRpbC5nZXRUZXh0Tm9kZXMoJChub2RlKSlcbiAgICAgICAgaWYgKGxlbmd0aCArIHRuLm5vZGVWYWx1ZS5sZW5ndGggPiB0YXJnZXRPZmZzZXQpXG4gICAgICAgICAgcmFuZ2VbcCArICdDb250YWluZXInXSA9IHRuXG4gICAgICAgICAgcmFuZ2VbcCArICdPZmZzZXQnXSA9IHRoaXNbcCArICdPZmZzZXQnXSAtIGxlbmd0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsZW5ndGggKz0gdG4ubm9kZVZhbHVlLmxlbmd0aFxuXG4gICAgICAjIElmIHdlIGZhbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIGZvciBsb29wIHdpdGhvdXQgaGF2aW5nIHNldFxuICAgICAgIyAnc3RhcnRPZmZzZXQnLydlbmRPZmZzZXQnLCB0aGUgZWxlbWVudCBoYXMgc2hvcnRlciBjb250ZW50IHRoYW4gd2hlblxuICAgICAgIyB3ZSBhbm5vdGF0ZWQsIHNvIHRocm93IGFuIGVycm9yOlxuICAgICAgaWYgbm90IHJhbmdlW3AgKyAnT2Zmc2V0J10/XG4gICAgICAgIHRocm93IG5ldyBSYW5nZS5SYW5nZUVycm9yKFwiI3twfW9mZnNldFwiLCBcIkNvdWxkbid0IGZpbmQgb2Zmc2V0ICN7dGhpc1twICsgJ09mZnNldCddfSBpbiBlbGVtZW50ICN7dGhpc1twXX1cIilcblxuICAgICMgSGVyZSdzIGFuIGVsZWdhbnQgbmV4dCBzdGVwLi4uXG4gICAgI1xuICAgICMgICByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lciA9ICQocmFuZ2Uuc3RhcnRDb250YWluZXIpLnBhcmVudHMoKS5oYXMocmFuZ2UuZW5kQ29udGFpbmVyKVswXVxuICAgICNcbiAgICAjIC4uLmJ1dCB1bmZvcnR1bmF0ZWx5IE5vZGUuY29udGFpbnMoKSBpcyBicm9rZW4gaW4gU2FmYXJpIDUuMS41ICg3NTM0LjU1LjMpXG4gICAgIyBhbmQgcHJlc3VtYWJseSBvdGhlciBlYXJsaWVyIHZlcnNpb25zIG9mIFdlYktpdC4gSW4gcGFydGljdWxhciwgaW4gYVxuICAgICMgZG9jdW1lbnQgbGlrZVxuICAgICNcbiAgICAjICAgPHA+SGVsbG88L3A+XG4gICAgI1xuICAgICMgdGhlIGNvZGVcbiAgICAjXG4gICAgIyAgIHAgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgncCcpWzBdXG4gICAgIyAgIHAuY29udGFpbnMocC5maXJzdENoaWxkKVxuICAgICNcbiAgICAjIHJldHVybnMgYGZhbHNlYC4gWWF5LlxuICAgICNcbiAgICAjIFNvIGluc3RlYWQsIHdlIHN0ZXAgdGhyb3VnaCB0aGUgcGFyZW50cyBmcm9tIHRoZSBib3R0b20gdXAgYW5kIHVzZVxuICAgICMgTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbigpIHRvIGRlY2lkZSB3aGVuIHRvIHNldCB0aGVcbiAgICAjIGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIGFuZCBiYWlsIG91dC5cblxuICAgIGNvbnRhaW5zID1cbiAgICAgIGlmIG5vdCBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9cbiAgICAgICAgIyBJRVxuICAgICAgICAoYSwgYikgLT4gYS5jb250YWlucyhiKVxuICAgICAgZWxzZVxuICAgICAgICAjIEV2ZXJ5b25lIGVsc2VcbiAgICAgICAgKGEsIGIpIC0+IGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiAxNlxuXG4gICAgJChyYW5nZS5zdGFydENvbnRhaW5lcikucGFyZW50cygpLmVhY2ggLT5cbiAgICAgIGlmIGNvbnRhaW5zKHRoaXMsIHJhbmdlLmVuZENvbnRhaW5lcilcbiAgICAgICAgcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIgPSB0aGlzXG4gICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgbmV3IFJhbmdlLkJyb3dzZXJSYW5nZShyYW5nZSkubm9ybWFsaXplKHJvb3QpXG5cbiAgIyBQdWJsaWM6IENyZWF0ZXMgYSByYW5nZSBzdWl0YWJsZSBmb3Igc3RvcmFnZS5cbiAgI1xuICAjIHJvb3QgICAgICAgICAgIC0gQSByb290IEVsZW1lbnQgZnJvbSB3aGljaCB0byBhbmNob3IgdGhlIHNlcmlhbGlzYXRpb24uXG4gICMgaWdub3JlU2VsZWN0b3IgLSBBIHNlbGVjdG9yIFN0cmluZyBvZiBlbGVtZW50cyB0byBpZ25vcmUuIEZvciBleGFtcGxlXG4gICMgICAgICAgICAgICAgICAgICBlbGVtZW50cyBpbmplY3RlZCBieSB0aGUgYW5ub3RhdG9yLlxuICAjXG4gICMgUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBTZXJpYWxpemVkUmFuZ2UuXG4gIHNlcmlhbGl6ZTogKHJvb3QsIGlnbm9yZVNlbGVjdG9yKSAtPlxuICAgIHRoaXMubm9ybWFsaXplKHJvb3QpLnNlcmlhbGl6ZShyb290LCBpZ25vcmVTZWxlY3RvcilcblxuICAjIFB1YmxpYzogUmV0dXJucyB0aGUgcmFuZ2UgYXMgYW4gT2JqZWN0IGxpdGVyYWwuXG4gIHRvT2JqZWN0OiAtPlxuICAgIHtcbiAgICAgIHN0YXJ0OiBAc3RhcnRcbiAgICAgIHN0YXJ0T2Zmc2V0OiBAc3RhcnRPZmZzZXRcbiAgICAgIGVuZDogQGVuZFxuICAgICAgZW5kT2Zmc2V0OiBAZW5kT2Zmc2V0XG4gICAgfVxuXG5cbiMgRXhwb3J0IFJhbmdlIG9iamVjdC5cbm1vZHVsZS5leHBvcnRzID0gUmFuZ2VcbiIsIiMgUmVnaXN0cnkgaXMgYSBmYWN0b3J5IGZvciBhbm5vdGF0b3IgYXBwbGljYXRpb25zIHByb3ZpZGluZyBhIHNpbXBsZSBydW50aW1lXG4jIGV4dGVuc2lvbiBpbnRlcmZhY2UgYW5kIGFwcGxpY2F0aW9uIGxvYWRlci4gSXQgaXMgdXNlZCB0byBwYXNzIHNldHRpbmdzIHRvXG4jIGV4dGVuc2lvbiBtb2R1bGVzIGFuZCBwcm92aWRlIGEgbWVhbnMgYnkgd2hpY2ggZXh0ZW5zaW9ucyBjYW4gZXhwb3J0XG4jIGZ1bmN0aW9uYWxpdHkgdG8gYXBwbGljYXRpb25zLlxuY2xhc3MgUmVnaXN0cnlcblxuICAjIFB1YmxpYzogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiBkZWZpbmVkIGJ5IHRoZSBwcm92aWRlZFxuICAjIG1vZHVsZS4gVGhlIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSBhIG5ldyByZWdpc3RyeSBpbnN0YW5jZSB3aG9zZSBzZXR0aW5nc1xuICAjIG1heSBiZSBwcm92aWRlZCBhcyBhIHNlY29uZCBhcmd1bWVudCB0byB0aGlzIG1ldGhvZC4gVGhlIHJlZ2lzdHJ5IHdpbGxcbiAgIyBpbW1lZGlhdGVseSBpbnZva2UgdGhlIHJ1biBjYWxsYmFjayBvZiB0aGUgbW9kdWxlLlxuICBAY3JlYXRlQXBwOiAoYXBwTW9kdWxlLCBzZXR0aW5ncz17fSkgLT5cbiAgICAobmV3IHRoaXMoc2V0dGluZ3MpKS5ydW4oYXBwTW9kdWxlKVxuXG4gIGNvbnN0cnVjdG9yOiAoQHNldHRpbmdzPXt9KSAtPlxuXG4gICMgUHVibGljOiBJbmNsdWRlIGEgbW9kdWxlLiBBIG1vZHVsZSBpcyBhbnkgT2JqZWN0IHdpdGggYSBmdWN0aW9uIHByb3BlcnR5XG4gICMgbmFtZWQgJ2NvbmZpZ3VyZWAuIFRoaXMgZnVuY3Rpb24gaXMgaW1tZWRpYXRlbHkgaW52b2tlZCB3aXRoIHRoZSByZWdpc3RyeVxuICAjIGluc3RhbmNlIGFzIHRoZSBvbmx5IGFyZ3VtZW50LlxuICBpbmNsdWRlOiAobW9kdWxlKSAtPlxuICAgIG1vZHVsZS5jb25maWd1cmUodGhpcylcbiAgICB0aGlzXG5cbiAgIyBQdWJsaWM6IFJ1biBhbiBhcHBsaWNhdGlvbi4gQW4gYXBwbGljYXRpb24gaXMgYSBtb2R1bGUgd2l0aCBhIGZ1bmN0aW9uXG4gICMgcHJvcGVydHkgbmFtZWQgJ3J1bicuIFRoZSBhcHBsaWNhdGlvbiBpcyBpbW1lZGlhdGVseSBpbmNsdWRlZCBhbmQgaXRzIHJ1blxuICAjIGNhbGxiYWNrIGludm9rZWQgd2l0aCB0aGUgcmVnaXN0cnkgaW5zdGFuY2UgYXMgdGhlIG9ubHkgYXJndW1lbnQuXG4gIHJ1bjogKGFwcCkgLT5cbiAgICBpZiB0aGlzLmFwcFxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVnaXN0cnkgaXMgYWxyZWFkeSBib3VuZCB0byBhIHJ1bm5pbmcgYXBwbGljYXRpb25cIilcblxuICAgIHRoaXMuaW5jbHVkZShhcHApXG5cbiAgICBmb3Igb3duIGssIHYgb2YgdGhpc1xuICAgICAgYXBwW2tdID0gdlxuXG4gICAgdGhpcy5hcHAgPSBhcHBcbiAgICBhcHAucnVuKHRoaXMpXG5cbm1vZHVsZS5leHBvcnRzID0gUmVnaXN0cnlcbiIsIiMgUHVibGljOiBBZGRzIHBlcnNpc3RlbmNlIGhvb2tzIGZvciBhbm5vdGF0aW9ucy5cbmNsYXNzIFN0b3JhZ2VQcm92aWRlclxuXG4gIEBjb25maWd1cmU6IChyZWdpc3RyeSkgLT5cbiAgICBrbGFzcyA9IHJlZ2lzdHJ5LnNldHRpbmdzLnN0b3JlPy50eXBlXG5cbiAgICBpZiB0eXBlb2Yoa2xhc3MpIGlzICdmdW5jdGlvbidcbiAgICAgIHN0b3JlID0gbmV3IGtsYXNzKHJlZ2lzdHJ5LnNldHRpbmdzLnN0b3JlKVxuICAgIGVsc2VcbiAgICAgIHN0b3JlID0gbmV3IHRoaXMocmVnaXN0cnkpXG5cbiAgICByZWdpc3RyeVsnc3RvcmUnXSA/PSBzdG9yZVxuXG4gIGNvbnN0cnVjdG9yOiAoQHJlZ2lzdHJ5KSAtPlxuXG4gICMgUHVibGljOiBnZXQgYW4gdW5pcXVlIGlkZW50aWZpZXJcbiAgaWQ6ICgtPiBjb3VudGVyID0gMDsgLT4gY291bnRlcisrKSgpXG5cbiAgIyBQdWJsaWM6IGNyZWF0ZSBhbiBhbm5vdGF0aW9uXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBPYmplY3QgdG8gY3JlYXRlLlxuICAjXG4gICMgUmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIG5ldyBhbm5vdGF0aW9uIE9iamVjdC5cbiAgY3JlYXRlOiAoYW5ub3RhdGlvbikgLT5cbiAgICBkZmQgPSAkLkRlZmVycmVkKClcbiAgICBpZiBub3QgYW5ub3RhdGlvbi5pZD9cbiAgICAgIGFubm90YXRpb24uaWQgPSB0aGlzLmlkKClcbiAgICBkZmQucmVzb2x2ZShhbm5vdGF0aW9uKVxuICAgIHJldHVybiBkZmQucHJvbWlzZSgpXG5cbiAgIyBQdWJsaWM6IHVwZGF0ZSBhbiBhbm5vdGF0aW9uXG4gICNcbiAgIyBhbm5vdGF0aW9uIC0gQW4gYW5ub3RhdGlvbiBPYmplY3QgdG8gYmUgdXBkYXRlZC5cbiAgI1xuICAjIFJldHVybnMgYSBwcm9taXNlIG9mIHRoZSB1cGRhdGVkIGFubm90YXRpb24gT2JqZWN0LlxuICB1cGRhdGU6IChhbm5vdGF0aW9uKSAtPlxuICAgIGRmZCA9ICQuRGVmZXJyZWQoKVxuICAgIGRmZC5yZXNvbHZlKGFubm90YXRpb24pXG4gICAgcmV0dXJuIGRmZC5wcm9taXNlKClcblxuICAjIFB1YmxpYzogZGVsZXRlIGFuIGFubm90YXRpb25cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBhbm5vdGF0aW9uIE9iamVjdCB0byBiZSBkZWxldGVkLlxuICAjXG4gICMgUmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIHJlc3VsdCBvZiB0aGUgZGVsZXRlIG9wZXJhdGlvbi5cbiAgZGVsZXRlOiAoYW5ub3RhdGlvbikgLT5cbiAgICBkZmQgPSAkLkRlZmVycmVkKClcbiAgICBkZmQucmVzb2x2ZShhbm5vdGF0aW9uKVxuICAgIHJldHVybiBkZmQucHJvbWlzZSgpXG5cbiAgIyBQdWJsaWM6IHF1ZXJ5IHRoZSBzdG9yZSBmb3IgYW5ub3RhdGlvbnNcbiAgI1xuICAjIFJldHVybnMgYSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcXVlcnkgcmVzdWx0cyBhbmQgcXVlcnkgbWV0YWRhdGEuXG4gIHF1ZXJ5OiAocXVlcnlPYmopIC0+XG4gICAgZGZkID0gJC5EZWZlcnJlZCgpXG4gICAgZGZkLnJlc29sdmUoW10sIHt9KVxuICAgIHJldHVybiBkZmQucHJvbWlzZSgpXG5cbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZVByb3ZpZGVyXG4iLCJ4cGF0aCA9IHJlcXVpcmUgJy4veHBhdGgnXG5cblxuIyBJMThOXG5nZXR0ZXh0ID0gbnVsbFxuXG5pZiBHZXR0ZXh0P1xuICBfZ2V0dGV4dCA9IG5ldyBHZXR0ZXh0KGRvbWFpbjogXCJhbm5vdGF0b3JcIilcbiAgZ2V0dGV4dCA9IChtc2dpZCkgLT4gX2dldHRleHQuZ2V0dGV4dChtc2dpZClcbmVsc2VcbiAgZ2V0dGV4dCA9IChtc2dpZCkgLT4gbXNnaWRcblxuX3QgPSAobXNnaWQpIC0+IGdldHRleHQobXNnaWQpXG5cbnVubGVzcyBqUXVlcnk/LmZuPy5qcXVlcnlcbiAgY29uc29sZS5lcnJvcihfdChcIkFubm90YXRvciByZXF1aXJlcyBqUXVlcnk6IGhhdmUgeW91IGluY2x1ZGVkIGxpYi92ZW5kb3IvanF1ZXJ5LmpzP1wiKSlcblxudW5sZXNzIEpTT04gYW5kIEpTT04ucGFyc2UgYW5kIEpTT04uc3RyaW5naWZ5XG4gIGNvbnNvbGUuZXJyb3IoX3QoXCJBbm5vdGF0b3IgcmVxdWlyZXMgYSBKU09OIGltcGxlbWVudGF0aW9uOiBoYXZlIHlvdSBpbmNsdWRlZCBsaWIvdmVuZG9yL2pzb24yLmpzP1wiKSlcblxuVXRpbCA9IHt9XG5cbiMgUHVibGljOiBDcmVhdGUgYSBHZXR0ZXh0IHRyYW5zbGF0ZWQgc3RyaW5nIGZyb20gYSBtZXNzYWdlIGlkXG4jXG4jIFJldHVybnMgYSBTdHJpbmdcblV0aWwuVHJhbnNsYXRpb25TdHJpbmcgPSBfdFxuXG5cbiMgUHVibGljOiBGbGF0dGVuIGEgbmVzdGVkIGFycmF5IHN0cnVjdHVyZVxuI1xuIyBSZXR1cm5zIGFuIGFycmF5XG5VdGlsLmZsYXR0ZW4gPSAoYXJyYXkpIC0+XG4gIGZsYXR0ZW4gPSAoYXJ5KSAtPlxuICAgIGZsYXQgPSBbXVxuXG4gICAgZm9yIGVsIGluIGFyeVxuICAgICAgZmxhdCA9IGZsYXQuY29uY2F0KGlmIGVsIGFuZCAkLmlzQXJyYXkoZWwpIHRoZW4gZmxhdHRlbihlbCkgZWxzZSBlbClcblxuICAgIHJldHVybiBmbGF0XG5cbiAgZmxhdHRlbihhcnJheSlcblxuIyBQdWJsaWM6IGRlY2lkZXMgd2hldGhlciBub2RlIEEgaXMgYW4gYW5jZXN0b3Igb2Ygbm9kZSBCLlxuI1xuIyBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VmdWxseSBpZ25vcmVzIHRoZSBuYXRpdmUgYnJvd3NlciBmdW5jdGlvbiBmb3IgdGhpcyxcbiMgYmVjYXVzZSBpdCBhY3RzIHdlaXJkIGluIFBoYW50b21KUy5cbiMgSXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcml5YS9waGFudG9tanMvaXNzdWVzLzExNDc5XG5VdGlsLmNvbnRhaW5zID0gKHBhcmVudCwgY2hpbGQpIC0+XG4gIG5vZGUgPSBjaGlsZFxuICB3aGlsZSBub2RlP1xuICAgIGlmIG5vZGUgaXMgcGFyZW50IHRoZW4gcmV0dXJuIHRydWVcbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlXG4gIHJldHVybiBmYWxzZVxuXG4jIFB1YmxpYzogRmluZHMgYWxsIHRleHQgbm9kZXMgd2l0aGluIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBjb2xsZWN0aW9uLlxuI1xuIyBSZXR1cm5zIGEgbmV3IGpRdWVyeSBjb2xsZWN0aW9uIG9mIHRleHQgbm9kZXMuXG5VdGlsLmdldFRleHROb2RlcyA9IChqcSkgLT5cbiAgZ2V0VGV4dE5vZGVzID0gKG5vZGUpIC0+XG4gICAgaWYgbm9kZSBhbmQgbm9kZS5ub2RlVHlwZSAhPSBOb2RlLlRFWFRfTk9ERVxuICAgICAgbm9kZXMgPSBbXVxuXG4gICAgICAjIElmIG5vdCBhIGNvbW1lbnQgdGhlbiB0cmF2ZXJzZSBjaGlsZHJlbiBjb2xsZWN0aW5nIHRleHQgbm9kZXMuXG4gICAgICAjIFdlIHRyYXZlcnNlIHRoZSBjaGlsZCBub2RlcyBtYW51YWxseSByYXRoZXIgdGhhbiB1c2luZyB0aGUgLmNoaWxkTm9kZXNcbiAgICAgICMgcHJvcGVydHkgYmVjYXVzZSBJRTkgZG9lcyBub3QgdXBkYXRlIHRoZSAuY2hpbGROb2RlcyBwcm9wZXJ0eSBhZnRlclxuICAgICAgIyAuc3BsaXRUZXh0KCkgaXMgY2FsbGVkIG9uIGEgY2hpbGQgdGV4dCBub2RlLlxuICAgICAgaWYgbm9kZS5ub2RlVHlwZSAhPSBOb2RlLkNPTU1FTlRfTk9ERVxuICAgICAgICAjIFN0YXJ0IGF0IHRoZSBsYXN0IGNoaWxkIGFuZCB3YWxrIGJhY2t3YXJkcyB0aHJvdWdoIHNpYmxpbmdzLlxuICAgICAgICBub2RlID0gbm9kZS5sYXN0Q2hpbGRcbiAgICAgICAgd2hpbGUgbm9kZVxuICAgICAgICAgIG5vZGVzLnB1c2ggZ2V0VGV4dE5vZGVzKG5vZGUpXG4gICAgICAgICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nXG5cbiAgICAgICMgRmluYWxseSByZXZlcnNlIHRoZSBhcnJheSBzbyB0aGF0IG5vZGVzIGFyZSBpbiB0aGUgY29ycmVjdCBvcmRlci5cbiAgICAgIHJldHVybiBub2Rlcy5yZXZlcnNlKClcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbm9kZVxuXG4gIGpxLm1hcCAtPiBVdGlsLmZsYXR0ZW4oZ2V0VGV4dE5vZGVzKHRoaXMpKVxuXG4jIFB1YmxpYzogZGV0ZXJtaW5lIHRoZSBsYXN0IHRleHQgbm9kZSBpbnNpZGUgb3IgYmVmb3JlIHRoZSBnaXZlbiBub2RlXG5VdGlsLmdldExhc3RUZXh0Tm9kZVVwVG8gPSAobikgLT5cbiAgc3dpdGNoIG4ubm9kZVR5cGVcbiAgICB3aGVuIE5vZGUuVEVYVF9OT0RFXG4gICAgICByZXR1cm4gbiAjIFdlIGhhdmUgZm91bmQgb3VyIHRleHQgbm9kZS5cbiAgICB3aGVuIE5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAjIFRoaXMgaXMgYW4gZWxlbWVudCwgd2UgbmVlZCB0byBkaWcgaW5cbiAgICAgIGlmIG4ubGFzdENoaWxkPyAjIERvZXMgaXQgaGF2ZSBjaGlsZHJlbiBhdCBhbGw/XG4gICAgICAgIHJlc3VsdCA9IFV0aWwuZ2V0TGFzdFRleHROb2RlVXBUbyBuLmxhc3RDaGlsZFxuICAgICAgICBpZiByZXN1bHQ/IHRoZW4gcmV0dXJuIHJlc3VsdCAgICAgICAgXG4gICAgZWxzZVxuICAgICAgIyBOb3QgYSB0ZXh0IG5vZGUsIGFuZCBub3QgYW4gZWxlbWVudCBub2RlLlxuICAjIENvdWxkIG5vdCBmaW5kIGEgdGV4dCBub2RlIGluIGN1cnJlbnQgbm9kZSwgZ28gYmFja3dhcmRzXG4gIG4gPSBuLnByZXZpb3VzU2libGluZ1xuICBpZiBuP1xuICAgIFV0aWwuZ2V0TGFzdFRleHROb2RlVXBUbyBuXG4gIGVsc2VcbiAgICBudWxsXG5cbiMgUHVibGljOiBkZXRlcm1pbmUgdGhlIGZpcnN0IHRleHQgbm9kZSBpbiBvciBhZnRlciB0aGUgZ2l2ZW4galF1ZXJ5IG5vZGUuXG5VdGlsLmdldEZpcnN0VGV4dE5vZGVOb3RCZWZvcmUgPSAobikgLT5cbiAgc3dpdGNoIG4ubm9kZVR5cGVcbiAgICB3aGVuIE5vZGUuVEVYVF9OT0RFXG4gICAgICByZXR1cm4gbiAjIFdlIGhhdmUgZm91bmQgb3VyIHRleHQgbm9kZS5cbiAgICB3aGVuIE5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAjIFRoaXMgaXMgYW4gZWxlbWVudCwgd2UgbmVlZCB0byBkaWcgaW5cbiAgICAgIGlmIG4uZmlyc3RDaGlsZD8gIyBEb2VzIGl0IGhhdmUgY2hpbGRyZW4gYXQgYWxsP1xuICAgICAgICByZXN1bHQgPSBVdGlsLmdldEZpcnN0VGV4dE5vZGVOb3RCZWZvcmUgbi5maXJzdENoaWxkXG4gICAgICAgIGlmIHJlc3VsdD8gdGhlbiByZXR1cm4gcmVzdWx0XG4gICAgZWxzZVxuICAgICAgIyBOb3QgYSB0ZXh0IG9yIGFuIGVsZW1lbnQgbm9kZS5cbiAgIyBDb3VsZCBub3QgZmluZCBhIHRleHQgbm9kZSBpbiBjdXJyZW50IG5vZGUsIGdvIGZvcndhcmRcbiAgbiA9IG4ubmV4dFNpYmxpbmdcbiAgaWYgbj9cbiAgICBVdGlsLmdldEZpcnN0VGV4dE5vZGVOb3RCZWZvcmUgblxuICBlbHNlXG4gICAgbnVsbFxuXG4jIFB1YmxpYzogcmVhZCBvdXQgdGhlIHRleHQgdmFsdWUgb2YgYSByYW5nZSB1c2luZyB0aGUgc2VsZWN0aW9uIEFQSVxuI1xuIyBUaGlzIG1ldGhvZCBzZWxlY3RzIHRoZSBzcGVjaWZpZWQgcmFuZ2UsIGFuZCBhc2tzIGZvciB0aGUgc3RyaW5nXG4jIHZhbHVlIG9mIHRoZSBzZWxlY3Rpb24uIFdoYXQgdGhpcyByZXR1cm5zIGlzIHZlcnkgY2xvc2UgdG8gd2hhdCB0aGUgdXNlclxuIyBhY3R1YWxseSBzZWVzLlxuVXRpbC5yZWFkUmFuZ2VWaWFTZWxlY3Rpb24gPSAocmFuZ2UpIC0+XG4gIHNlbCA9IFV0aWwuZ2V0R2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCkgIyBHZXQgdGhlIGJyb3dzZXIgc2VsZWN0aW9uIG9iamVjdFxuICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCkgICAgICAgICAgICAgICAgICMgY2xlYXIgdGhlIHNlbGVjdGlvblxuICBzZWwuYWRkUmFuZ2UgcmFuZ2UudG9SYW5nZSgpICAgICAgICAgICMgU2VsZWN0IHRoZSByYW5nZVxuICBzZWwudG9TdHJpbmcoKSAgICAgICAgICAgICAgICAgICAgICAgICMgUmVhZCBvdXQgdGhlIHNlbGVjdGlvblxuXG5VdGlsLnhwYXRoRnJvbU5vZGUgPSAoZWwsIHJlbGF0aXZlUm9vdCkgLT5cbiAgdHJ5XG4gICAgcmVzdWx0ID0geHBhdGguc2ltcGxlWFBhdGhKUXVlcnkuY2FsbCBlbCwgcmVsYXRpdmVSb290XG4gIGNhdGNoIGV4Y2VwdGlvblxuICAgIGNvbnNvbGUubG9nIFwialF1ZXJ5LWJhc2VkIFhQYXRoIGNvbnN0cnVjdGlvbiBmYWlsZWQhIEZhbGxpbmcgYmFjayB0byBtYW51YWwuXCJcbiAgICByZXN1bHQgPSB4cGF0aC5zaW1wbGVYUGF0aFB1cmUuY2FsbCBlbCwgcmVsYXRpdmVSb290XG4gIHJlc3VsdFxuXG5VdGlsLm5vZGVGcm9tWFBhdGggPSAoeHAsIHJvb3QpIC0+XG4gIHN0ZXBzID0geHAuc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKVxuICBub2RlID0gcm9vdFxuICBmb3Igc3RlcCBpbiBzdGVwc1xuICAgIFtuYW1lLCBpZHhdID0gc3RlcC5zcGxpdCBcIltcIlxuICAgIGlkeCA9IGlmIGlkeD8gdGhlbiBwYXJzZUludCAoaWR4Py5zcGxpdCBcIl1cIilbMF0gZWxzZSAxXG4gICAgbm9kZSA9IHhwYXRoLmZpbmRDaGlsZCBub2RlLCBuYW1lLnRvTG93ZXJDYXNlKCksIGlkeFxuXG4gIG5vZGVcblxuVXRpbC5lc2NhcGUgPSAoaHRtbCkgLT5cbiAgaHRtbFxuICAgIC5yZXBsYWNlKC8mKD8hXFx3KzspL2csICcmYW1wOycpXG4gICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpXG5cblV0aWwudXVpZCA9ICgtPiBjb3VudGVyID0gMDsgLT4gY291bnRlcisrKSgpXG5cblV0aWwuZ2V0R2xvYmFsID0gLT4gKC0+IHRoaXMpKClcblxuIyBSZXR1cm4gdGhlIG1heGltdW0gei1pbmRleCBvZiBhbnkgZWxlbWVudCBpbiAkZWxlbWVudHMgKGEgalF1ZXJ5IGNvbGxlY3Rpb24pLlxuVXRpbC5tYXhaSW5kZXggPSAoJGVsZW1lbnRzKSAtPlxuICBhbGwgPSBmb3IgZWwgaW4gJGVsZW1lbnRzXG4gICAgICAgICAgaWYgJChlbCkuY3NzKCdwb3NpdGlvbicpID09ICdzdGF0aWMnXG4gICAgICAgICAgICAtMVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhcnNlSW50KCQoZWwpLmNzcygnei1pbmRleCcpLCAxMCkgb3IgLTFcbiAgTWF0aC5tYXguYXBwbHkoTWF0aCwgYWxsKVxuXG5VdGlsLm1vdXNlUG9zaXRpb24gPSAoZSwgb2Zmc2V0RWwpIC0+XG4gICMgSWYgdGhlIG9mZnNldCBlbGVtZW50IGlzIG5vdCBhIHBvc2l0aW9uaW5nIHJvb3QgdXNlIGl0cyBvZmZzZXQgcGFyZW50XG4gIHVubGVzcyAkKG9mZnNldEVsKS5jc3MoJ3Bvc2l0aW9uJykgaW4gWydhYnNvbHV0ZScsICdmaXhlZCcsICdyZWxhdGl2ZSddXG4gICAgb2Zmc2V0RWwgPSAkKG9mZnNldEVsKS5vZmZzZXRQYXJlbnQoKVswXVxuICBvZmZzZXQgPSAkKG9mZnNldEVsKS5vZmZzZXQoKVxuICB7XG4gICAgdG9wOiAgZS5wYWdlWSAtIG9mZnNldC50b3AsXG4gICAgbGVmdDogZS5wYWdlWCAtIG9mZnNldC5sZWZ0XG4gIH1cblxuIyBDaGVja3MgdG8gc2VlIGlmIGFuIGV2ZW50IHBhcmFtZXRlciBpcyBwcm92aWRlZCBhbmQgY29udGFpbnMgdGhlIHByZXZlbnRcbiMgZGVmYXVsdCBtZXRob2QuIElmIGl0IGRvZXMgaXQgY2FsbHMgaXQuXG4jXG4jIFRoaXMgaXMgdXNlZnVsIGZvciBtZXRob2RzIHRoYXQgY2FuIGJlIG9wdGlvbmFsbHkgdXNlZCBhcyBjYWxsYmFja3NcbiMgd2hlcmUgdGhlIGV4aXN0YW5jZSBvZiB0aGUgcGFyYW1ldGVyIG11c3QgYmUgY2hlY2tlZCBiZWZvcmUgY2FsbGluZy5cblV0aWwucHJldmVudEV2ZW50RGVmYXVsdCA9IChldmVudCkgLT5cbiAgZXZlbnQ/LnByZXZlbnREZWZhdWx0PygpXG5cblxuIyBFeHBvcnQgVXRpbCBvYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gVXRpbFxuIiwiVXRpbCA9IHJlcXVpcmUgJy4vdXRpbCdcbldpZGdldCA9IHJlcXVpcmUgJy4vd2lkZ2V0J1xuXG5cbl90ID0gVXRpbC5UcmFuc2xhdGlvblN0cmluZ1xuXG5cbiMgUHVibGljOiBDcmVhdGVzIGFuIGVsZW1lbnQgZm9yIHZpZXdpbmcgYW5ub3RhdGlvbnMuXG5jbGFzcyBWaWV3ZXIgZXh0ZW5kcyBXaWRnZXRcblxuICAjIEV2ZW50cyB0byBiZSBib3VuZCB0byB0aGUgQGVsZW1lbnQuXG4gIGV2ZW50czpcbiAgICBcIi5hbm5vdGF0b3ItZWRpdCBjbGlja1wiOiAgIFwib25FZGl0Q2xpY2tcIlxuICAgIFwiLmFubm90YXRvci1kZWxldGUgY2xpY2tcIjogXCJvbkRlbGV0ZUNsaWNrXCJcblxuICAjIENsYXNzZXMgZm9yIHRvZ2dsaW5nIGFubm90YXRvciBzdGF0ZS5cbiAgY2xhc3NlczpcbiAgICBoaWRlOiAnYW5ub3RhdG9yLWhpZGUnXG4gICAgc2hvd0NvbnRyb2xzOiAnYW5ub3RhdG9yLXZpc2libGUnXG5cbiAgIyBIVE1MIHRlbXBsYXRlcyBmb3IgQGVsZW1lbnQgYW5kIEBpdGVtIHByb3BlcnRpZXMuXG4gIGh0bWw6XG4gICAgZWxlbWVudDpcIlwiXCJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbm5vdGF0b3Itb3V0ZXIgYW5ub3RhdG9yLXZpZXdlclwiPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJhbm5vdGF0b3Itd2lkZ2V0IGFubm90YXRvci1saXN0aW5nXCI+PC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXCJcIlwiXG4gICAgaXRlbTogICBcIlwiXCJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImFubm90YXRvci1hbm5vdGF0aW9uIGFubm90YXRvci1pdGVtXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW5ub3RhdG9yLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiB0aXRsZT1cIlZpZXcgYXMgd2VicGFnZVwiIGNsYXNzPVwiYW5ub3RhdG9yLWxpbmtcIj5WaWV3IGFzIHdlYnBhZ2U8L2E+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCJFZGl0XCIgY2xhc3M9XCJhbm5vdGF0b3ItZWRpdFwiPkVkaXQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIkRlbGV0ZVwiIGNsYXNzPVwiYW5ub3RhdG9yLWRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgXCJcIlwiXG5cbiAgIyBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgb3B0aW9uczpcbiAgICByZWFkT25seTogZmFsc2UgIyBTdGFydCB0aGUgdmlld2VyIGluIHJlYWQtb25seSBtb2RlLiBObyBjb250cm9scyB3aWxsIGJlIHNob3duLlxuXG4gICMgUHVibGljOiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBWaWV3ZXIgb2JqZWN0LiBUaGlzIHdpbGwgY3JlYXRlIHRoZVxuICAjIEBlbGVtZW50IGZyb20gdGhlIEBodG1sLmVsZW1lbnQgc3RyaW5nIGFuZCBzZXQgdXAgYWxsIGV2ZW50cy5cbiAgI1xuICAjIG9wdGlvbnMgLSBBbiBPYmplY3QgbGl0ZXJhbCBjb250YWluaW5nIG9wdGlvbnMuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIENyZWF0ZXMgYSBuZXcgdmlld2VyLCBhZGRzIGEgY3VzdG9tIGZpZWxkIGFuZCBkaXNwbGF5cyBhbiBhbm5vdGF0aW9uLlxuICAjICAgdmlld2VyID0gbmV3IEFubm90YXRvci5WaWV3ZXIoKVxuICAjICAgdmlld2VyLmFkZEZpZWxkKHtcbiAgIyAgICAgbG9hZDogc29tZUxvYWRDYWxsYmFja1xuICAjICAgfSlcbiAgIyAgIHZpZXdlci5sb2FkKGFubm90YXRpb24pXG4gICNcbiAgIyBSZXR1cm5zIGEgbmV3IFZpZXdlciBpbnN0YW5jZS5cbiAgY29uc3RydWN0b3I6IChvcHRpb25zKSAtPlxuICAgIHN1cGVyICQoQGh0bWwuZWxlbWVudClbMF0sIG9wdGlvbnNcblxuICAgIEBpdGVtICAgPSAkKEBodG1sLml0ZW0pWzBdXG4gICAgQGZpZWxkcyA9IFtdXG4gICAgQGFubm90YXRpb25zID0gW11cblxuICAjIFB1YmxpYzogRGlzcGxheXMgdGhlIFZpZXdlciBhbmQgZmlyc3QgdGhlIFwic2hvd1wiIGV2ZW50LiBDYW4gYmUgdXNlZCBhcyBhblxuICAjIGV2ZW50IGNhbGxiYWNrIGFuZCB3aWxsIGNhbGwgRXZlbnQjcHJldmVudERlZmF1bHQoKSBvbiB0aGUgc3VwcGxpZWQgZXZlbnQuXG4gICNcbiAgIyBldmVudCAtIEV2ZW50IG9iamVjdCBwcm92aWRlZCBpZiBtZXRob2QgaXMgY2FsbGVkIGJ5IGV2ZW50XG4gICMgICAgICAgICBsaXN0ZW5lciAoZGVmYXVsdDp1bmRlZmluZWQpXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIERpc3BsYXlzIHRoZSBlZGl0b3IuXG4gICMgICB2aWV3ZXIuc2hvdygpXG4gICNcbiAgIyAgICMgRGlzcGxheXMgdGhlIHZpZXdlciBvbiBjbGljayAocHJldmVudHMgZGVmYXVsdCBhY3Rpb24pLlxuICAjICAgJCgnYS5zaG93LXZpZXdlcicpLmJpbmQoJ2NsaWNrJywgdmlld2VyLnNob3cpXG4gICNcbiAgIyBSZXR1cm5zIGl0c2VsZi5cbiAgc2hvdzogKGV2ZW50KSA9PlxuICAgIFV0aWwucHJldmVudEV2ZW50RGVmYXVsdCBldmVudFxuXG4gICAgY29udHJvbHMgPSBAZWxlbWVudFxuICAgICAgLmZpbmQoJy5hbm5vdGF0b3ItY29udHJvbHMnKVxuICAgICAgLmFkZENsYXNzKEBjbGFzc2VzLnNob3dDb250cm9scylcbiAgICBzZXRUaW1lb3V0KCg9PiBjb250cm9scy5yZW1vdmVDbGFzcyhAY2xhc3Nlcy5zaG93Q29udHJvbHMpKSwgNTAwKVxuXG4gICAgQGVsZW1lbnQucmVtb3ZlQ2xhc3MoQGNsYXNzZXMuaGlkZSlcbiAgICB0aGlzLmNoZWNrT3JpZW50YXRpb24oKS5wdWJsaXNoKCdzaG93JylcblxuICAjIFB1YmxpYzogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVmlld2VyIGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICB2aWV3ZXIuc2hvdygpXG4gICMgICB2aWV3ZXIuaXNTaG93bigpICMgPT4gUmV0dXJucyB0cnVlXG4gICNcbiAgIyAgIHZpZXdlci5oaWRlKClcbiAgIyAgIHZpZXdlci5pc1Nob3duKCkgIyA9PiBSZXR1cm5zIGZhbHNlXG4gICNcbiAgIyBSZXR1cm5zIHRydWUgaWYgdGhlIFZpZXdlciBpcyB2aXNpYmxlLlxuICBpc1Nob3duOiAtPlxuICAgIG5vdCBAZWxlbWVudC5oYXNDbGFzcyhAY2xhc3Nlcy5oaWRlKVxuXG4gICMgUHVibGljOiBIaWRlcyB0aGUgRWRpdG9yIGFuZCBmaXJlcyB0aGUgXCJoaWRlXCIgZXZlbnQuIENhbiBiZSB1c2VkIGFzIGFuIGV2ZW50XG4gICMgY2FsbGJhY2sgYW5kIHdpbGwgY2FsbCBFdmVudCNwcmV2ZW50RGVmYXVsdCgpIG9uIHRoZSBzdXBwbGllZCBldmVudC5cbiAgI1xuICAjIGV2ZW50IC0gRXZlbnQgb2JqZWN0IHByb3ZpZGVkIGlmIG1ldGhvZCBpcyBjYWxsZWQgYnkgZXZlbnRcbiAgIyAgICAgICAgIGxpc3RlbmVyIChkZWZhdWx0OnVuZGVmaW5lZClcbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgICMgSGlkZXMgdGhlIGVkaXRvci5cbiAgIyAgIHZpZXdlci5oaWRlKClcbiAgI1xuICAjICAgIyBIaWRlIHRoZSB2aWV3ZXIgb24gY2xpY2sgKHByZXZlbnRzIGRlZmF1bHQgYWN0aW9uKS5cbiAgIyAgICQoJ2EuaGlkZS12aWV3ZXInKS5iaW5kKCdjbGljaycsIHZpZXdlci5oaWRlKVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYuXG4gIGhpZGU6IChldmVudCkgPT5cbiAgICBVdGlsLnByZXZlbnRFdmVudERlZmF1bHQgZXZlbnRcblxuICAgIEBlbGVtZW50LmFkZENsYXNzKEBjbGFzc2VzLmhpZGUpXG4gICAgdGhpcy5wdWJsaXNoKCdoaWRlJylcblxuICAjIFB1YmxpYzogTG9hZHMgYW5ub3RhdGlvbnMgaW50byB0aGUgdmlld2VyIGFuZCBzaG93cyBpdC4gRmlyZXMgdGhlIFwibG9hZFwiXG4gICMgZXZlbnQgb25jZSB0aGUgdmlld2VyIGlzIGxvYWRlZCBwYXNzaW5nIHRoZSBhbm5vdGF0aW9ucyBpbnRvIHRoZSBjYWxsYmFjay5cbiAgI1xuICAjIGFubm90YXRpb24gLSBBbiBBcnJheSBvZiBhbm5vdGF0aW9uIGVsZW1lbnRzLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgdmlld2VyLmxvYWQoW2Fubm90YXRpb24xLCBhbm5vdGF0aW9uMiwgYW5ub3RhdGlvbjNdKVxuICAjXG4gICMgUmV0dXJucyBpdHNsZWYuXG4gIGxvYWQ6IChhbm5vdGF0aW9ucykgPT5cbiAgICBAYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyB8fCBbXVxuXG4gICAgbGlzdCA9IEBlbGVtZW50LmZpbmQoJ3VsOmZpcnN0JykuZW1wdHkoKVxuICAgIGZvciBhbm5vdGF0aW9uIGluIEBhbm5vdGF0aW9uc1xuICAgICAgaXRlbSA9ICQoQGl0ZW0pLmNsb25lKCkuYXBwZW5kVG8obGlzdCkuZGF0YSgnYW5ub3RhdGlvbicsIGFubm90YXRpb24pXG4gICAgICBjb250cm9scyA9IGl0ZW0uZmluZCgnLmFubm90YXRvci1jb250cm9scycpXG5cbiAgICAgIGxpbmsgPSBjb250cm9scy5maW5kKCcuYW5ub3RhdG9yLWxpbmsnKVxuICAgICAgZWRpdCA9IGNvbnRyb2xzLmZpbmQoJy5hbm5vdGF0b3ItZWRpdCcpXG4gICAgICBkZWwgID0gY29udHJvbHMuZmluZCgnLmFubm90YXRvci1kZWxldGUnKVxuXG4gICAgICBsaW5rcyA9IG5ldyBMaW5rUGFyc2VyKGFubm90YXRpb24ubGlua3Mgb3IgW10pLmdldCgnYWx0ZXJuYXRlJywgeyd0eXBlJzogJ3RleHQvaHRtbCd9KVxuICAgICAgaWYgbGlua3MubGVuZ3RoIGlzIDAgb3Igbm90IGxpbmtzWzBdLmhyZWY/XG4gICAgICAgIGxpbmsucmVtb3ZlKClcbiAgICAgIGVsc2VcbiAgICAgICAgbGluay5hdHRyKCdocmVmJywgbGlua3NbMF0uaHJlZilcblxuICAgICAgaWYgQG9wdGlvbnMucmVhZE9ubHlcbiAgICAgICAgZWRpdC5yZW1vdmUoKVxuICAgICAgICBkZWwucmVtb3ZlKClcbiAgICAgIGVsc2VcbiAgICAgICAgY29udHJvbGxlciA9IHtcbiAgICAgICAgICBzaG93RWRpdDogLT4gZWRpdC5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpXG4gICAgICAgICAgaGlkZUVkaXQ6IC0+IGVkaXQuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKVxuICAgICAgICAgIHNob3dEZWxldGU6IC0+IGRlbC5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpXG4gICAgICAgICAgaGlkZURlbGV0ZTogLT4gZGVsLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJylcbiAgICAgICAgfVxuXG4gICAgICBmb3IgZmllbGQgaW4gQGZpZWxkc1xuICAgICAgICBlbGVtZW50ID0gJChmaWVsZC5lbGVtZW50KS5jbG9uZSgpLmFwcGVuZFRvKGl0ZW0pWzBdXG4gICAgICAgIGZpZWxkLmxvYWQoZWxlbWVudCwgYW5ub3RhdGlvbiwgY29udHJvbGxlcilcblxuICAgIHRoaXMucHVibGlzaCgnbG9hZCcsIFtAYW5ub3RhdGlvbnNdKVxuXG4gICAgdGhpcy5zaG93KClcblxuICAjIFB1YmxpYzogQWRkcyBhbiBhZGRpb25hbCBmaWVsZCB0byBhbiBhbm5vdGF0aW9uIHZpZXcuIEEgY2FsbGJhY2sgY2FuIGJlXG4gICMgcHJvdmlkZWQgdG8gdXBkYXRlIHRoZSB2aWV3IG9uIGxvYWQuXG4gICNcbiAgIyBvcHRpb25zIC0gQW4gb3B0aW9ucyBPYmplY3QuIE9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6XG4gICMgICAgICAgICAgIGxvYWQgLSBDYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgdmlldyBpcyBsb2FkZWQgd2l0aCBhblxuICAjICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi4gUmVjaWV2ZXMgYSBuZXdseSBjcmVhdGVkIGNsb25lIG9mIEBpdGVtIGFuZFxuICAjICAgICAgICAgICAgICAgICAgdGhlIGFubm90YXRpb24gdG8gYmUgZGlzcGxheWVkIChpdCB3aWxsIGJlIGNhbGxlZCBvbmNlXG4gICMgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBhbm5vdGF0aW9uIGJlaW5nIGxvYWRlZCkuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICAjIERpc3BsYXkgYSB1c2VyIG5hbWUuXG4gICMgICB2aWV3ZXIuYWRkRmllbGQoe1xuICAjICAgICAjIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHZpZXdlciBpcyBsb2FkZWQuXG4gICMgICAgIGxvYWQ6IChmaWVsZCwgYW5ub3RhdGlvbikgLT5cbiAgIyAgICAgICBmaWVsZCA9ICQoZmllbGQpXG4gICNcbiAgIyAgICAgICBpZiBhbm5vdGF0aW9uLnVzZXJcbiAgIyAgICAgICAgIGZpZWxkLnRleHQoYW5ub3RhdGlvbi51c2VyKSAjIERpc3BsYXkgdGhlIHVzZXJcbiAgIyAgICAgICBlbHNlXG4gICMgICAgICAgICBmaWVsZC5yZW1vdmUoKSAgICAgICAgICAgICAgIyBEbyBub3QgZGlzcGxheSB0aGUgZmllbGQuXG4gICMgICB9KVxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYuXG4gIGFkZEZpZWxkOiAob3B0aW9ucykgLT5cbiAgICBmaWVsZCA9ICQuZXh0ZW5kKHtcbiAgICAgIGxvYWQ6IC0+XG4gICAgfSwgb3B0aW9ucylcblxuICAgIGZpZWxkLmVsZW1lbnQgPSAkKCc8ZGl2IC8+JylbMF1cbiAgICBAZmllbGRzLnB1c2ggZmllbGRcbiAgICBmaWVsZC5lbGVtZW50XG4gICAgdGhpc1xuXG4gICMgQ2FsbGJhY2sgZnVuY3Rpb246IGNhbGxlZCB3aGVuIHRoZSBlZGl0IGJ1dHRvbiBpcyBjbGlja2VkLlxuICAjXG4gICMgZXZlbnQgLSBBbiBFdmVudCBvYmplY3QuXG4gICNcbiAgIyBSZXR1cm5zIG5vdGhpbmcuXG4gIG9uRWRpdENsaWNrOiAoZXZlbnQpID0+XG4gICAgdGhpcy5vbkJ1dHRvbkNsaWNrKGV2ZW50LCAnZWRpdCcpXG5cbiAgIyBDYWxsYmFjayBmdW5jdGlvbjogY2FsbGVkIHdoZW4gdGhlIGRlbGV0ZSBidXR0b24gaXMgY2xpY2tlZC5cbiAgI1xuICAjIGV2ZW50IC0gQW4gRXZlbnQgb2JqZWN0LlxuICAjXG4gICMgUmV0dXJucyBub3RoaW5nLlxuICBvbkRlbGV0ZUNsaWNrOiAoZXZlbnQpID0+XG4gICAgdGhpcy5vbkJ1dHRvbkNsaWNrKGV2ZW50LCAnZGVsZXRlJylcblxuICAjIEZpcmVzIGFuIGV2ZW50IG9mIHR5cGUgYW5kIHBhc3NlcyBpbiB0aGUgYXNzb2NpYXRlZCBhbm5vdGF0aW9uLlxuICAjXG4gICMgZXZlbnQgLSBBbiBFdmVudCBvYmplY3QuXG4gICMgdHlwZSAgLSBUaGUgdHlwZSBvZiBldmVudCB0byBmaXJlLiBFaXRoZXIgXCJlZGl0XCIgb3IgXCJkZWxldGVcIi5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgb25CdXR0b25DbGljazogKGV2ZW50LCB0eXBlKSAtPlxuICAgIGl0ZW0gPSAkKGV2ZW50LnRhcmdldCkucGFyZW50cygnLmFubm90YXRvci1hbm5vdGF0aW9uJylcblxuICAgIHRoaXMucHVibGlzaCh0eXBlLCBbaXRlbS5kYXRhKCdhbm5vdGF0aW9uJyldKVxuXG4jIFByaXZhdGU6IHNpbXBsZSBwYXJzZXIgZm9yIGh5cGVybWVkaWEgbGluayBzdHJ1Y3R1cmVcbiNcbiMgRXhhbXBsZXM6XG4jXG4jICAgbGlua3MgPSBbXG4jICAgICB7IHJlbDogJ2FsdGVybmF0ZScsIGhyZWY6ICdodHRwOi8vZXhhbXBsZS5jb20vcGFnZXMvMTQuanNvbicsIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuIyAgICAgeyByZWw6ICdwcmV2JzogaHJlZjogJ2h0dHA6Ly9leGFtcGxlLmNvbS9wYWdlcy8xMycgfVxuIyAgIF1cbiNcbiMgICBscCA9IExpbmtQYXJzZXIobGlua3MpXG4jICAgbHAuZ2V0KCdhbHRlcm5hdGUnKSAgICAgICAgICAgICAgICAgICAgICAjID0+IFsgeyByZWw6ICdhbHRlcm5hdGUnLCBocmVmOiAnaHR0cDovLy4uLicsIC4uLiB9IF1cbiMgICBscC5nZXQoJ2FsdGVybmF0ZScsIHt0eXBlOiAndGV4dC9odG1sJ30pICMgPT4gW11cbiNcbmNsYXNzIExpbmtQYXJzZXJcbiAgY29uc3RydWN0b3I6IChAZGF0YSkgLT5cblxuICBnZXQ6IChyZWwsIGNvbmQ9e30pIC0+XG4gICAgY29uZCA9ICQuZXh0ZW5kKHt9LCBjb25kLCB7cmVsOiByZWx9KVxuICAgIGtleXMgPSAoayBmb3Igb3duIGssIHYgb2YgY29uZClcbiAgICBmb3IgZCBpbiBAZGF0YVxuICAgICAgbWF0Y2ggPSBrZXlzLnJlZHVjZSAoKG0sIGspIC0+IG0gYW5kIChkW2tdIGlzIGNvbmRba10pKSwgdHJ1ZVxuICAgICAgaWYgbWF0Y2hcbiAgICAgICAgZFxuICAgICAgZWxzZVxuICAgICAgICBjb250aW51ZVxuXG5cbiMgRXhwb3J0IHRoZSBWaWV3ZXIgb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IFZpZXdlclxuIiwiRGVsZWdhdG9yID0gcmVxdWlyZSAnLi9jbGFzcydcblV0aWwgPSByZXF1aXJlICcuL3V0aWwnXG5cblxuIyBQdWJsaWM6IEJhc2UgY2xhc3MgZm9yIHRoZSBFZGl0b3IgYW5kIFZpZXdlciBlbGVtZW50cy4gQ29udGFpbnMgbWV0aG9kcyB0aGF0XG4jIGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgdHdvLlxuY2xhc3MgV2lkZ2V0IGV4dGVuZHMgRGVsZWdhdG9yXG4gICMgQ2xhc3NlcyB1c2VkIHRvIGFsdGVyIHRoZSB3aWRnZXRzIHN0YXRlLlxuICBjbGFzc2VzOlxuICAgIGhpZGU6ICdhbm5vdGF0b3ItaGlkZSdcbiAgICBpbnZlcnQ6XG4gICAgICB4OiAnYW5ub3RhdG9yLWludmVydC14J1xuICAgICAgeTogJ2Fubm90YXRvci1pbnZlcnQteSdcblxuICAjIFB1YmxpYzogQ3JlYXRlcyBhIG5ldyBXaWRnZXQgaW5zdGFuY2UuXG4gICNcbiAgIyBlbGVtZW50IC0gVGhlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSB3aWRnZXQgaW4gdGhlIERPTS5cbiAgIyBvcHRpb25zIC0gQW4gT2JqZWN0IGxpdGVyYWwgb2Ygb3B0aW9ucy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAjICAgd2lkZ2V0ICA9IG5ldyBBbm5vdGF0b3IuV2lkZ2V0KGVsZW1lbnQpXG4gICNcbiAgIyBSZXR1cm5zIGEgbmV3IFdpZGdldCBpbnN0YW5jZS5cbiAgY29uc3RydWN0b3I6IChlbGVtZW50LCBvcHRpb25zKSAtPlxuICAgIHN1cGVyXG4gICAgQGNsYXNzZXMgPSAkLmV4dGVuZCB7fSwgV2lkZ2V0LnByb3RvdHlwZS5jbGFzc2VzLCBAY2xhc3Nlc1xuXG4gICMgUHVibGljOiBVbmJpbmQgdGhlIHdpZGdldCdzIGV2ZW50cyBhbmQgcmVtb3ZlIGl0cyBlbGVtZW50IGZyb20gdGhlIERPTS5cbiAgI1xuICAjIFJldHVybnMgbm90aGluZy5cbiAgZGVzdHJveTogLT5cbiAgICB0aGlzLnJlbW92ZUV2ZW50cygpXG4gICAgQGVsZW1lbnQucmVtb3ZlKClcblxuICBjaGVja09yaWVudGF0aW9uOiAtPlxuICAgIHRoaXMucmVzZXRPcmllbnRhdGlvbigpXG5cbiAgICB3aW5kb3cgICA9ICQoVXRpbC5nZXRHbG9iYWwoKSlcbiAgICB3aWRnZXQgICA9IEBlbGVtZW50LmNoaWxkcmVuKFwiOmZpcnN0XCIpXG4gICAgb2Zmc2V0ICAgPSB3aWRnZXQub2Zmc2V0KClcbiAgICB2aWV3cG9ydCA9IHtcbiAgICAgIHRvcDogICB3aW5kb3cuc2Nyb2xsVG9wKCksXG4gICAgICByaWdodDogd2luZG93LndpZHRoKCkgKyB3aW5kb3cuc2Nyb2xsTGVmdCgpXG4gICAgfVxuICAgIGN1cnJlbnQgPSB7XG4gICAgICB0b3A6ICAgb2Zmc2V0LnRvcFxuICAgICAgcmlnaHQ6IG9mZnNldC5sZWZ0ICsgd2lkZ2V0LndpZHRoKClcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC50b3AgLSB2aWV3cG9ydC50b3ApIDwgMFxuICAgICAgdGhpcy5pbnZlcnRZKClcblxuICAgIGlmIChjdXJyZW50LnJpZ2h0IC0gdmlld3BvcnQucmlnaHQpID4gMFxuICAgICAgdGhpcy5pbnZlcnRYKClcblxuICAgIHRoaXNcblxuICAjIFB1YmxpYzogUmVzZXRzIG9yaWVudGF0aW9uIG9mIHdpZGdldCBvbiB0aGUgWCAmIFkgYXhpcy5cbiAgI1xuICAjIEV4YW1wbGVzXG4gICNcbiAgIyAgIHdpZGdldC5yZXNldE9yaWVudGF0aW9uKCkgIyBXaWRnZXQgaXMgb3JpZ2luYWwgd2F5IHVwLlxuICAjXG4gICMgUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICByZXNldE9yaWVudGF0aW9uOiAtPlxuICAgIEBlbGVtZW50LnJlbW92ZUNsYXNzKEBjbGFzc2VzLmludmVydC54KS5yZW1vdmVDbGFzcyhAY2xhc3Nlcy5pbnZlcnQueSlcbiAgICB0aGlzXG5cbiAgIyBQdWJsaWM6IEludmVydHMgdGhlIHdpZGdldCBvbiB0aGUgWCBheGlzLlxuICAjXG4gICMgRXhhbXBsZXNcbiAgI1xuICAjICAgd2lkZ2V0LmludmVydFgoKSAjIFdpZGdldCBpcyBub3cgcmlnaHQgYWxpZ25lZC5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgaW52ZXJ0WDogLT5cbiAgICBAZWxlbWVudC5hZGRDbGFzcyBAY2xhc3Nlcy5pbnZlcnQueFxuICAgIHRoaXNcblxuICAjIFB1YmxpYzogSW52ZXJ0cyB0aGUgd2lkZ2V0IG9uIHRoZSBZIGF4aXMuXG4gICNcbiAgIyBFeGFtcGxlc1xuICAjXG4gICMgICB3aWRnZXQuaW52ZXJ0WSgpICMgV2lkZ2V0IGlzIG5vdyB1cHNpZGUgZG93bi5cbiAgI1xuICAjIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgaW52ZXJ0WTogLT5cbiAgICBAZWxlbWVudC5hZGRDbGFzcyBAY2xhc3Nlcy5pbnZlcnQueVxuICAgIHRoaXNcblxuICAjIFB1YmxpYzogRmluZCBvdXQgd2hldGhlciBvciBub3QgdGhlIHdpZGdldCBpcyBjdXJyZW50bHkgdXBzaWRlIGRvd25cbiAgI1xuICAjIFJldHVybnMgYSBib29sZWFuOiB0cnVlIGlmIHRoZSB3aWRnZXQgaXMgdXBzaWRlIGRvd25cbiAgaXNJbnZlcnRlZFk6IC0+XG4gICAgQGVsZW1lbnQuaGFzQ2xhc3MgQGNsYXNzZXMuaW52ZXJ0LnlcblxuICAjIFB1YmxpYzogRmluZCBvdXQgd2hldGhlciBvciBub3QgdGhlIHdpZGdldCBpcyBjdXJyZW50bHkgcmlnaHQgYWxpZ25lZFxuICAjXG4gICMgUmV0dXJucyBhIGJvb2xlYW46IHRydWUgaWYgdGhlIHdpZGdldCBpcyByaWdodCBhbGlnbmVkXG4gIGlzSW52ZXJ0ZWRYOiAtPlxuICAgIEBlbGVtZW50Lmhhc0NsYXNzIEBjbGFzc2VzLmludmVydC54XG5cblxuIyBFeHBvcnQgdGhlIFdpZGdldCBvYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gV2lkZ2V0XG4iLCIjIEEgc2ltcGxlIFhQYXRoIGV2YWx1YXRvciB1c2luZyBqUXVlcnkgd2hpY2ggY2FuIGV2YWx1YXRlIHF1ZXJpZXMgb2ZcbnNpbXBsZVhQYXRoSlF1ZXJ5ID0gKHJlbGF0aXZlUm9vdCkgLT5cbiAganEgPSB0aGlzLm1hcCAtPlxuICAgIHBhdGggPSAnJ1xuICAgIGVsZW0gPSB0aGlzXG5cbiAgICB3aGlsZSBlbGVtPy5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSBhbmQgZWxlbSBpc250IHJlbGF0aXZlUm9vdFxuICAgICAgdGFnTmFtZSA9IGVsZW0udGFnTmFtZS5yZXBsYWNlKFwiOlwiLCBcIlxcXFw6XCIpXG4gICAgICBpZHggPSAkKGVsZW0ucGFyZW50Tm9kZSkuY2hpbGRyZW4odGFnTmFtZSkuaW5kZXgoZWxlbSkgKyAxXG5cbiAgICAgIGlkeCAgPSBcIlsje2lkeH1dXCJcbiAgICAgIHBhdGggPSBcIi9cIiArIGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpICsgaWR4ICsgcGF0aFxuICAgICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZVxuXG4gICAgcGF0aFxuXG4gIGpxLmdldCgpXG5cbiMgQSBzaW1wbGUgWFBhdGggZXZhbHVhdG9yIHVzaW5nIG9ubHkgc3RhbmRhcmQgRE9NIG1ldGhvZHMgd2hpY2ggY2FuXG4jIGV2YWx1YXRlIHF1ZXJpZXMgb2YgdGhlIGZvcm0gL3RhZ1tpbmRleF0vdGFnW2luZGV4XS5cbnNpbXBsZVhQYXRoUHVyZSA9IChyZWxhdGl2ZVJvb3QpIC0+XG5cbiAgZ2V0UGF0aFNlZ21lbnQgPSAobm9kZSkgLT5cbiAgICBuYW1lID0gZ2V0Tm9kZU5hbWUgbm9kZVxuICAgIHBvcyA9IGdldE5vZGVQb3NpdGlvbiBub2RlXG4gICAgXCIje25hbWV9WyN7cG9zfV1cIlxuXG4gIHJvb3ROb2RlID0gcmVsYXRpdmVSb290XG5cbiAgZ2V0UGF0aFRvID0gKG5vZGUpIC0+XG4gICAgeHBhdGggPSAnJztcbiAgICB3aGlsZSBub2RlICE9IHJvb3ROb2RlXG4gICAgICB1bmxlc3Mgbm9kZT9cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yIFwiQ2FsbGVkIGdldFBhdGhUbyBvbiBhIG5vZGUgd2hpY2ggd2FzIG5vdCBhIGRlc2NlbmRhbnQgb2YgQHJvb3ROb2RlLiBcIiArIHJvb3ROb2RlXG4gICAgICB4cGF0aCA9IChnZXRQYXRoU2VnbWVudCBub2RlKSArICcvJyArIHhwYXRoXG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlXG4gICAgeHBhdGggPSAnLycgKyB4cGF0aFxuICAgIHhwYXRoID0geHBhdGgucmVwbGFjZSAvXFwvJC8sICcnXG4gICAgeHBhdGhcblxuICBqcSA9IHRoaXMubWFwIC0+XG4gICAgcGF0aCA9IGdldFBhdGhUbyB0aGlzXG5cbiAgICBwYXRoXG5cbiAganEuZ2V0KClcblxuZmluZENoaWxkID0gKG5vZGUsIHR5cGUsIGluZGV4KSAtPlxuICB1bmxlc3Mgbm9kZS5oYXNDaGlsZE5vZGVzKClcbiAgICB0aHJvdyBuZXcgRXJyb3IgXCJYUGF0aCBlcnJvcjogbm9kZSBoYXMgbm8gY2hpbGRyZW4hXCJcbiAgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXNcbiAgZm91bmQgPSAwXG4gIGZvciBjaGlsZCBpbiBjaGlsZHJlblxuICAgIG5hbWUgPSBnZXROb2RlTmFtZSBjaGlsZFxuICAgIGlmIG5hbWUgaXMgdHlwZVxuICAgICAgZm91bmQgKz0gMVxuICAgICAgaWYgZm91bmQgaXMgaW5kZXhcbiAgICAgICAgcmV0dXJuIGNoaWxkXG4gIHRocm93IG5ldyBFcnJvciBcIlhQYXRoIGVycm9yOiB3YW50ZWQgY2hpbGQgbm90IGZvdW5kLlwiXG5cbiMgR2V0IHRoZSBub2RlIG5hbWUgZm9yIHVzZSBpbiBnZW5lcmF0aW5nIGFuIHhwYXRoIGV4cHJlc3Npb24uXG5nZXROb2RlTmFtZSA9IChub2RlKSAtPlxuICAgIG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgc3dpdGNoIG5vZGVOYW1lXG4gICAgICB3aGVuIFwiI3RleHRcIiB0aGVuIHJldHVybiBcInRleHQoKVwiXG4gICAgICB3aGVuIFwiI2NvbW1lbnRcIiB0aGVuIHJldHVybiBcImNvbW1lbnQoKVwiXG4gICAgICB3aGVuIFwiI2NkYXRhLXNlY3Rpb25cIiB0aGVuIHJldHVybiBcImNkYXRhLXNlY3Rpb24oKVwiXG4gICAgICBlbHNlIHJldHVybiBub2RlTmFtZVxuXG4jIEdldCB0aGUgaW5kZXggb2YgdGhlIG5vZGUgYXMgaXQgYXBwZWFycyBpbiBpdHMgcGFyZW50J3MgY2hpbGQgbGlzdFxuZ2V0Tm9kZVBvc2l0aW9uID0gKG5vZGUpIC0+XG4gIHBvcyA9IDBcbiAgdG1wID0gbm9kZVxuICB3aGlsZSB0bXBcbiAgICBpZiB0bXAubm9kZU5hbWUgaXMgbm9kZS5ub2RlTmFtZVxuICAgICAgcG9zKytcbiAgICB0bXAgPSB0bXAucHJldmlvdXNTaWJsaW5nXG4gIHBvc1xuXG5cbm1vZHVsZS5leHBvcnRzID1cbiAgc2ltcGxlWFBhdGhKUXVlcnk6IHNpbXBsZVhQYXRoSlF1ZXJ5XG4gIHNpbXBsZVhQYXRoUHVyZTogc2ltcGxlWFBhdGhQdXJlXG4gIGZpbmRDaGlsZDogZmluZENoaWxkXG4iXX0= \ No newline at end of file
--- a/webapp/src/main/webapp/jquery/annotator-dl.min.js Thu Mar 13 16:52:25 2014 +0100 +++ b/webapp/src/main/webapp/jquery/annotator-dl.min.js Fri Mar 14 16:47:58 2014 +0100 @@ -1,13 +1,13 @@ /* -** Annotator v2.0.0-dev-5b27640 +** Annotator v2.0.0-dev-e25ce72 ** https://github.com/okfn/annotator/ ** ** Copyright 2014, the Annotator project contributors. ** Dual licensed under the MIT and GPLv3 licenses. ** https://github.com/okfn/annotator/blob/master/LICENSE ** -** Built at: 2014-03-13 15:20:20Z +** Built at: 2014-03-14 15:39:01Z */ -!function(t){if("object"==typeof exports)module.exports=t();else if("function"==typeof define&&define.amd)define(t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Annotator=t()}}(function(){var t;return function e(t,n,o){function r(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);throw new Error("Cannot find module '"+s+"'")}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return r(n?n:e)},l,l.exports,e,t,n,o)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s<o.length;s++)r(o[s]);return r}({1:[function(e,n,o){!function(){function e(){return{keys:Object.keys,uniqueId:function(t){var e=++h+"";return t?t+e:e},has:function(t,e){return u.call(t,e)},each:function(t,e,n){if(null!=t)if(a&&t.forEach===a)t.forEach(e,n);else if(t.length===+t.length){for(var o=0,r=t.length;r>o;o++)if(e.call(n,t[o],o,t)===s)return}else for(var i in t)if(this.has(t,i)&&e.call(n,t[i],i,t)===s)return},once:function(t){var e,n=!1;return function(){return n?e:(n=!0,e=t.apply(this,arguments),t=null,e)}}}}var r,i=this,s={},a=Array.prototype.forEach,u=Object.prototype.hasOwnProperty,l=Array.prototype.slice,h=0,p=e();r={on:function(t,e,n){if(!d(this,"on",t,[e,n])||!e)return this;this._events||(this._events={});var o=this._events[t]||(this._events[t]=[]);return o.push({callback:e,context:n,ctx:n||this}),this},once:function(t,e,n){if(!d(this,"once",t,[e,n])||!e)return this;var o=this,r=p.once(function(){o.off(t,r),e.apply(this,arguments)});return r._callback=e,this.on(t,r,n)},off:function(t,e,n){var o,r,i,s,a,u,l,h;if(!this._events||!d(this,"off",t,[e,n]))return this;if(!t&&!e&&!n)return this._events={},this;for(s=t?[t]:p.keys(this._events),a=0,u=s.length;u>a;a++)if(t=s[a],i=this._events[t]){if(this._events[t]=o=[],e||n)for(l=0,h=i.length;h>l;l++)r=i[l],(e&&e!==r.callback&&e!==r.callback._callback||n&&n!==r.context)&&o.push(r);o.length||delete this._events[t]}return this},trigger:function(t){if(!this._events)return this;var e=l.call(arguments,1);if(!d(this,"trigger",t,e))return this;var n=this._events[t],o=this._events.all;return n&&f(n,e),o&&f(o,arguments),this},stopListening:function(t,e,n){var o=this._listeners;if(!o)return this;var r=!e&&!n;"object"==typeof e&&(n=this),t&&((o={})[t._listenerId]=t);for(var i in o)o[i].off(e,n,this),r&&delete this._listeners[i];return this}};var c=/\s+/,d=function(t,e,n,o){if(!n)return!0;if("object"==typeof n){for(var r in n)t[e].apply(t,[r,n[r]].concat(o));return!1}if(c.test(n)){for(var i=n.split(c),s=0,a=i.length;a>s;s++)t[e].apply(t,[i[s]].concat(o));return!1}return!0},f=function(t,e){var n,o=-1,r=t.length,i=e[0],s=e[1],a=e[2];switch(e.length){case 0:for(;++o<r;)(n=t[o]).callback.call(n.ctx);return;case 1:for(;++o<r;)(n=t[o]).callback.call(n.ctx,i);return;case 2:for(;++o<r;)(n=t[o]).callback.call(n.ctx,i,s);return;case 3:for(;++o<r;)(n=t[o]).callback.call(n.ctx,i,s,a);return;default:for(;++o<r;)(n=t[o]).callback.apply(n.ctx,e)}},g={listenTo:"on",listenToOnce:"once"};p.each(g,function(t,e){r[e]=function(e,n,o){var r=this._listeners||(this._listeners={}),i=e._listenerId||(e._listenerId=p.uniqueId("l"));return r[i]=e,"object"==typeof n&&(o=this),e[t](n,o,this),this}}),r.bind=r.on,r.unbind=r.off,r.mixin=function(t){var e=["on","once","off","trigger","stopListening","listenTo","listenToOnce","bind","unbind"];return p.each(e,function(e){t[e]=this[e]},this),t},"function"==typeof t?t(function(){return r}):"undefined"!=typeof o?("undefined"!=typeof n&&n.exports&&(o=n.exports=r),o.BackboneEvents=r):i.BackboneEvents=r}(this)},{}],2:[function(t,e){e.exports=t("./backbone-events-standalone")},{"./backbone-events-standalone":1}],3:[function(e,n,o){!function(e){"object"==typeof o?n.exports=e():"function"==typeof t&&t.amd?t(e):window.BackboneExtend=e()}(function(){"use strict";var t={has:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},extend:function(t){for(var e=1;e<arguments.length;++e){var n=arguments[e];if(n)for(var o in n)t[o]=n[o]}return t}},e=function(e,n){var o,r=this;o=e&&t.has(e,"constructor")?e.constructor:function(){return r.apply(this,arguments)},t.extend(o,r,n);var i=function(){this.constructor=o};return i.prototype=r.prototype,o.prototype=new i,e&&t.extend(o.prototype,e),o.__super__=r.prototype,o};return e})},{}],4:[function(t,e){var n,o,r={}.hasOwnProperty;o=t("./storage"),n=function(){function t(t){this.registry=t}return t.configure=function(t){return null==t.annotations&&(t.annotations=new this(t)),t.include(o)},t.prototype.create=function(t){return null==t&&(t={}),this._cycle(t,"create")},t.prototype.update=function(t){if(null==t.id)throw new TypeError("annotation must have an id for update()");return this._cycle(t,"update")},t.prototype["delete"]=function(t){if(null==t.id)throw new TypeError("annotation must have an id for delete()");return this._cycle(t,"delete")},t.prototype.query=function(t){return this.registry.store.query(t)},t.prototype.load=function(t){return this.query(t)},t.prototype._cycle=function(t,e){var n;return n=$.extend(!0,{},t),delete n._local,this.registry.store[e](n).then(function(){return function(e){var n,o;for(n in t)r.call(t,n)&&(o=t[n],"_local"!==n&&delete t[n]);return $.extend(t,e),t}}(this))},t}(),e.exports=n},{"./storage":26}],annotator:[function(t,e){e.exports=t("haW+cw")},{}],"haW+cw":[function(t,e){var n,o,r,i,s,a,u,l,h,p,c,d,f,g,y,m,v,w=function(t,e){return function(){return t.apply(e,arguments)}},_={}.hasOwnProperty,b=function(t,e){function n(){this.constructor=t}for(var o in e)_.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};c=t("backbone-extend-standalone"),r=t("./class"),a=t("./range"),l=t("./util"),p=t("./widget"),h=t("./viewer"),i=t("./editor"),s=t("./notification"),u=t("./registry"),n=t("./annotations"),v=l.TranslationString,y=this.Annotator,f=function(){return console.error.apply(console,arguments)},o=function(t){function e(t,n){return this.onEditAnnotation=w(this.onEditAnnotation,this),this.onAdderClick=w(this.onAdderClick,this),this.onAdderMousedown=w(this.onAdderMousedown,this),this.onHighlightMouseover=w(this.onHighlightMouseover,this),this.checkForEndSelection=w(this.checkForEndSelection,this),this.checkForStartSelection=w(this.checkForStartSelection,this),this.clearViewerHideTimer=w(this.clearViewerHideTimer,this),this.startViewerHideTimer=w(this.startViewerHideTimer,this),this.showViewer=w(this.showViewer,this),this.onEditorSubmit=w(this.onEditorSubmit,this),this.onEditorHide=w(this.onEditorHide,this),this.showEditor=w(this.showEditor,this),e.__super__.constructor.apply(this,arguments),this.plugins={},e._instances.push(this),e.supported()?void u.createApp(this,n):this}return b(e,t),e.prototype.events={".annotator-adder button click":"onAdderClick",".annotator-adder button mousedown":"onAdderMousedown",".annotator-hl mouseover":"onHighlightMouseover",".annotator-hl mouseout":"startViewerHideTimer"},e.prototype.html={adder:'<div class="annotator-adder"><button type="button">'+v("Annotate")+"</button></div>",wrapper:'<div class="annotator-wrapper"></div>'},e.prototype.options={store:null,readOnly:!1,loadQuery:{}},e.prototype.plugins={},e.prototype.editor=null,e.prototype.viewer=null,e.prototype.selectedRanges=null,e.prototype.mouseIsDown=!1,e.prototype.ignoreMouseup=!1,e.prototype.viewerHideTimer=null,e.extend=c,e.prototype._setupWrapper=function(){return this.wrapper=$(this.html.wrapper),this.element.find("script").remove(),this.element.wrapInner(this.wrapper),this.wrapper=this.element.find(".annotator-wrapper"),this},e.prototype._setupViewer=function(){return this.viewer=new e.Viewer({readOnly:this.options.readOnly}),this.viewer.hide().on("edit",this.onEditAnnotation).on("delete",function(t){return function(e){return t.viewer.hide(),t.publish("beforeAnnotationDeleted",[e]),t.cleanupAnnotation(e),t.annotations["delete"](e).done(function(){return t.publish("annotationDeleted",[e])})}}(this)).addField({load:function(t){return function(e,n){return $(e).html(n.text?l.escape(n.text):"<i>"+v("No Comment")+"</i>"),t.publish("annotationViewerTextField",[e,n])}}(this)}).element.appendTo(this.wrapper).bind({mouseover:this.clearViewerHideTimer,mouseout:this.startViewerHideTimer}),this},e.prototype._setupEditor=function(){return this.editor=new e.Editor,this.editor.hide().on("hide",this.onEditorHide).on("save",this.onEditorSubmit).addField({type:"textarea",label:v("Comments")+"…",load:function(t,e){return $(t).find("textarea").val(e.text||"")},submit:function(t,e){return e.text=$(t).find("textarea").val()}}),this.editor.element.appendTo(this.wrapper),this},e.prototype._setupDocumentEvents=function(){return $(document).bind({mouseup:this.checkForEndSelection,mousedown:this.checkForStartSelection}),this},e.prototype._setupDynamicStyle=function(){var t,e,n,o;return n=$("#annotator-dynamic-style"),n.length||(n=$('<style id="annotator-dynamic-style"></style>').appendTo(document.head)),e="*"+function(){var t,e,n,r;for(n=["adder","outer","notice","filter"],r=[],t=0,e=n.length;e>t;t++)o=n[t],r.push(":not(.annotator-"+o+")");return r}().join(""),t=l.maxZIndex($(document.body).find(e)),t=Math.max(t,1e3),n.text([".annotator-adder, .annotator-outer, .annotator-notice {"," z-index: "+(t+20)+";","}",".annotator-filter {"," z-index: "+(t+10)+";","}"].join("\n")),this},e.prototype.load=function(t){return this.annotations.load(t).then(function(t){return function(e){return t.loadAnnotations(e)}}(this))},e.prototype.destroy=function(){var t,n,o,r;$(document).unbind({mouseup:this.checkForEndSelection,mousedown:this.checkForStartSelection}),$("#annotator-dynamic-style").remove(),this.adder.remove(),this.viewer.destroy(),this.editor.destroy(),this.wrapper.find(".annotator-hl").each(function(){return $(this).contents().insertBefore(this),$(this).remove()}),this.wrapper.contents().insertBefore(this.wrapper),this.wrapper.remove(),this.element.data("annotator",null),r=this.plugins;for(n in r)o=r[n],this.plugins[n].destroy();return this.removeEvents(),t=e._instances.indexOf(this),-1!==t?e._instances.splice(t,1):void 0},e.prototype.getSelectedRanges=function(){var t,e,n,o,r,i,s,u,h;for(s=l.getGlobal().getSelection(),r=[],i=[],s.isCollapsed||(r=function(){var r,u,l;for(l=[],e=r=0,u=s.rangeCount;u>=0?u>r:r>u;e=u>=0?++r:--r)o=s.getRangeAt(e),t=new a.BrowserRange(o),n=t.normalize().limit(this.wrapper[0]),null===n&&i.push(o),l.push(n);return l}.call(this),s.removeAllRanges()),u=0,h=i.length;h>u;u++)o=i[u],s.addRange(o);return $.grep(r,function(t){return t&&s.addRange(t.toRange()),t})},e.prototype.setupAnnotation=function(t){var e,n,o,r,i,s,u,l,h,p;for(i=this.wrapper[0],o=[],p=t.ranges,s=0,l=p.length;l>s;s++){r=p[s];try{o.push(a.sniff(r).normalize(i))}catch(c){if(e=c,!(e instanceof a.RangeError))throw e;this.publish("rangeNormalizeFail",[t,r,e])}}for(t.quote=[],t.ranges=[],t._local={},t._local.highlights=[],u=0,h=o.length;h>u;u++)n=o[u],t.quote.push($.trim(n.text())),t.ranges.push(n.serialize(this.wrapper[0],".annotator-hl")),$.merge(t._local.highlights,this.highlightRange(n));return t.quote=t.quote.join(" / "),$(t._local.highlights).data("annotation",t),t},e.prototype.cleanupAnnotation=function(t){var e,n,o,r,i;if(null!=(null!=(r=t._local)?r.highlights:void 0)){for(i=t._local.highlights,n=0,o=i.length;o>n;n++)e=i[n],null!=e.parentNode&&$(e).replaceWith(e.childNodes);delete t._local.highlights}return t},e.prototype.loadAnnotations=function(t){var e,n;return null==t&&(t=[]),n=function(t){return function(o){var r,i,s,a;for(null==o&&(o=[]),i=o.splice(0,10),s=0,a=i.length;a>s;s++)r=i[s],t.setupAnnotation(r);return o.length>0?setTimeout(function(){return n(o)},10):t.publish("annotationsLoaded",[e])}}(this),e=t.slice(),n(t),this},e.prototype.dumpAnnotations=function(){return this.plugins.Store?this.plugins.Store.dumpAnnotations():(console.warn(v("Can't dump annotations without Store plugin.")),!1)},e.prototype.highlightRange=function(t,e){var n,o,r,i,s,a,u;for(null==e&&(e="annotator-hl"),r=/^\s*$/,n=$("<span class='"+e+"'></span>"),a=t.textNodes(),u=[],i=0,s=a.length;s>i;i++)o=a[i],r.test(o.nodeValue)||u.push($(o).wrapAll(n).parent().show()[0]);return u},e.prototype.highlightRanges=function(t,e){var n,o,r,i;for(null==e&&(e="annotator-hl"),n=[],r=0,i=t.length;i>r;r++)o=t[r],$.merge(n,this.highlightRange(o,e));return n},e.prototype.addPlugin=function(t,n){var o,r;return this.plugins[t]?console.error(v("You cannot have more than one instance of any plugin.")):(o=e.Plugin[t],"function"==typeof o?(this.plugins[t]=new o(this.element[0],n),this.plugins[t].annotator=this,"function"==typeof(r=this.plugins[t]).pluginInit&&r.pluginInit()):console.error(v("Could not load ")+t+v(" plugin. Have you included the appropriate <script> tag?"))),this},e.prototype.editAnnotation=function(t,e){var n,o,r;return n=$.Deferred(),r=n.resolve.bind(n,t),o=n.reject.bind(n,t),this.showEditor(t,e),this.subscribe("annotationEditorSubmit",r),this.once("annotationEditorHidden",function(t){return function(){return t.unsubscribe("annotationEditorSubmit",r),"pending"===n.state()?o():void 0}}(this)),n.promise()},e.prototype.showEditor=function(t,e){return this.editor.element.css(e),this.editor.load(t),this.publish("annotationEditorShown",[this.editor,t]),this},e.prototype.onEditorHide=function(){return this.publish("annotationEditorHidden",[this.editor]),this.ignoreMouseup=!1},e.prototype.onEditorSubmit=function(t){return this.publish("annotationEditorSubmit",[this.editor,t])},e.prototype.showViewer=function(t,e){return this.viewer.element.css(e),this.viewer.load(t),this.publish("annotationViewerShown",[this.viewer,t])},e.prototype.startViewerHideTimer=function(){return this.viewerHideTimer?void 0:this.viewerHideTimer=setTimeout(this.viewer.hide,250)},e.prototype.clearViewerHideTimer=function(){return clearTimeout(this.viewerHideTimer),this.viewerHideTimer=!1},e.prototype.checkForStartSelection=function(t){return t&&this.isAnnotator(t.target)||this.startViewerHideTimer(),this.mouseIsDown=!0},e.prototype.checkForEndSelection=function(t){var e,n,o,r,i;if(this.mouseIsDown=!1,!this.ignoreMouseup){for(this.selectedRanges=this.getSelectedRanges(),i=this.selectedRanges,o=0,r=i.length;r>o;o++)if(n=i[o],e=n.commonAncestor,$(e).hasClass("annotator-hl")&&(e=$(e).parents("[class!=annotator-hl]")[0]),this.isAnnotator(e))return;return t&&this.selectedRanges.length?this.adder.css(l.mousePosition(t,this.wrapper[0])).show():this.adder.hide()}},e.prototype.isAnnotator=function(t){return!!$(t).parents().addBack().filter("[class^=annotator-]").not(this.wrapper).length},e.prototype.configure=function(t){return this.registry=t,t.include(n)},e.prototype.run=function(t){return this.registry=t,this.options.readOnly||this._setupDocumentEvents(),this._setupWrapper()._setupViewer()._setupEditor(),this._setupDynamicStyle(),this.adder=$(this.html.adder).appendTo(this.wrapper).hide(),this.options.loadQuery?this.load(this.options.loadQuery):void 0},e.prototype.onHighlightMouseover=function(t){var e;return this.clearViewerHideTimer(),this.mouseIsDown||this.viewer.isShown()?!1:(e=$(t.target).parents(".annotator-hl").addBack().map(function(){return $(this).data("annotation")}),this.showViewer($.makeArray(e),l.mousePosition(t,this.wrapper[0])))},e.prototype.onAdderMousedown=function(t){return null!=t&&t.preventDefault(),this.ignoreMouseup=!0},e.prototype.onAdderClick=function(t){var e,n;return null!=t&&t.preventDefault(),n=this.adder.position(),this.adder.hide(),e={ranges:this.selectedRanges},$.when(e).done(function(t){return function(e){return t.publish("beforeAnnotationCreated",[e])}}(this)).then(function(t){return function(e){return t.setupAnnotation(e)}}(this)).done(function(){return function(t){return $(t._local.highlights).addClass("annotator-hl-temporary")}}(this)).then(function(t){return function(e){return t.editAnnotation(e,n)}}(this)).then(function(t){return function(e){return t.annotations.create(e).fail(f)}}(this)).done(function(){return function(t){return $(t._local.highlights).removeClass("annotator-hl-temporary")}}(this)).done(function(t){return function(e){return t.publish("annotationCreated",[e])}}(this)).fail(this.cleanupAnnotation)},e.prototype.onEditAnnotation=function(t){var e;return e=this.viewer.element.position(),this.viewer.hide(),$.when(t).done(function(t){return function(e){return t.publish("beforeAnnotationUpdated",[e])}}(this)).then(function(t){return function(n){return t.editAnnotation(n,e)}}(this)).then(function(t){return function(e){return t.annotations.update(e).fail(f)}}(this)).done(function(t){return function(e){return t.publish("annotationUpdated",[e])}}(this))},e}(r),o.Plugin=function(t){function e(){e.__super__.constructor.apply(this,arguments)}return b(e,t),e.prototype.pluginInit=function(){},e.prototype.destroy=function(){return this.removeEvents()},e}(r),d=l.getGlobal(),null==(null!=(m=d.document)?m.evaluate:void 0)&&$.getScript("http://assets.annotateit.org/vendor/xpath.min.js"),null==d.getSelection&&$.getScript("http://assets.annotateit.org/vendor/ierange.min.js"),null==d.JSON&&$.getScript("http://assets.annotateit.org/vendor/json2.min.js"),null==d.Node&&(d.Node={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12}),o.Delegator=r,o.Range=a,o.Util=l,o.Widget=p,o.Viewer=h,o.Editor=i,o.Notification=s,g=new s,o.showNotification=g.show,o.hideNotification=g.hide,o._instances=[],o._t=v,o.supported=function(){return function(){return!!this.getSelection}()},o.noConflict=function(){return l.getGlobal().Annotator=y,this},$.fn.annotator=function(t){var e;return e=Array.prototype.slice.call(arguments,1),this.each(function(){var n;return n=$.data(this,"annotator"),n?t&&n[t].apply(n,e):(n=new o(this,t),$.data(this,"annotator",n))})},e.exports=o,t("annotator-plugin-authlogin"),t("annotator-plugin-filter"),t("annotator-plugin-markdown"),t("annotator-plugin-permissions"),t("annotator-plugin-store"),t("annotator-plugin-tags"),t("annotator-plugin-unsupported")},{"./annotations":4,"./class":7,"./editor":8,"./notification":9,"./range":24,"./registry":25,"./util":27,"./viewer":28,"./widget":29,"annotator-plugin-authlogin":"M3jdsG","annotator-plugin-filter":"EZHTbU","annotator-plugin-markdown":"CyErHP","annotator-plugin-permissions":"HUruzR","annotator-plugin-store":"vOrhum","annotator-plugin-tags":"rXlHIq","annotator-plugin-unsupported":"Q5LRaO","backbone-extend-standalone":3}],7:[function(t,e){var n,o,r,i=[].slice,s={}.hasOwnProperty;r=t("./util"),o=function(){function t(t,e){this.options=$.extend(!0,{},this.options,e),this.element=$(t),this._closures={},this.addEvents()}return t.prototype.events={},t.prototype.options={},t.prototype.element=null,t.prototype.addEvents=function(){var e,n,o,r,i;for(r=t._parseEvents(this.events),i=[],n=0,o=r.length;o>n;n++)e=r[n],i.push(this._addEvent(e.selector,e.event,e.functionName));return i},t.prototype.removeEvents=function(){var e,n,o,r,i;for(r=t._parseEvents(this.events),i=[],n=0,o=r.length;o>n;n++)e=r[n],i.push(this._removeEvent(e.selector,e.event,e.functionName));return i},t.prototype._addEvent=function(e,n,o){var r;return r=function(t){return function(){return t[o].apply(t,arguments)}}(this),""===e&&t._isCustomEvent(n)?this.subscribe(n,r):this.element.delegate(e,n,r),this._closures[""+e+"/"+n+"/"+o]=r,this},t.prototype._removeEvent=function(e,n,o){var r;return r=this._closures[""+e+"/"+n+"/"+o],""===e&&t._isCustomEvent(n)?this.unsubscribe(n,r):this.element.undelegate(e,n,r),delete this._closures[""+e+"/"+n+"/"+o],this},t.prototype.publish=function(t,e){return null==e&&(e=[]),this.trigger.apply(this,[t].concat(i.call(e)))},t.prototype.subscribe=function(t,e,n){return null==n&&(n=this),this.on(t,e,n)},t.prototype.unsubscribe=function(t,e,n){return null==n&&(n=this),this.off(t,e,n)},t}(),o._parseEvents=function(t){var e,n,o,r,s,a,u;n=[];for(r in t)o=t[r],u=r.split(" "),s=2<=u.length?i.call(u,0,a=u.length-1):(a=0,[]),e=u[a++],n.push({selector:s.join(" "),event:e,functionName:o});return n},o.natives=function(){var t,e,n;return e=function(){var e,o;e=$.event.special,o=[];for(t in e)s.call(e,t)&&(n=e[t],o.push(t));return o}(),"blur focus focusin focusout load resize scroll unload click dblclick\nmousedown mouseup mousemove mouseover mouseout mouseenter mouseleave\nchange select submit keydown keypress keyup error".split(/[^a-z]+/).concat(e)}(),o._isCustomEvent=function(t){return t=t.split(".")[0],-1===$.inArray(t,o.natives)},n=t("backbone-events-standalone"),n.mixin(o.prototype),e.exports=o},{"./util":27,"backbone-events-standalone":2}],8:[function(t,e){var n,o,r,i,s=function(t,e){return function(){return t.apply(e,arguments)}},a={}.hasOwnProperty,u=function(t,e){function n(){this.constructor=t}for(var o in e)a.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};o=t("./util"),r=t("./widget"),i=o.TranslationString,n=function(t){function e(t){this.onCancelButtonMouseover=s(this.onCancelButtonMouseover,this),this.processKeypress=s(this.processKeypress,this),this.submit=s(this.submit,this),this.load=s(this.load,this),this.hide=s(this.hide,this),this.show=s(this.show,this),e.__super__.constructor.call(this,$(this.html)[0],t),this.fields=[],this.annotation={}}return u(e,t),e.prototype.events={"form submit":"submit",".annotator-save click":"submit",".annotator-cancel click":"hide",".annotator-cancel mouseover":"onCancelButtonMouseover","textarea keydown":"processKeypress"},e.prototype.classes={hide:"annotator-hide",focus:"annotator-focus"},e.prototype.html='<div class="annotator-outer annotator-editor">\n <form class="annotator-widget">\n <ul class="annotator-listing"></ul>\n <div class="annotator-controls">\n <a href="#cancel" class="annotator-cancel">'+i("Cancel")+'</a>\n<a href="#save" class="annotator-save annotator-focus">'+i("Save")+"</a>\n </div>\n </form>\n</div>",e.prototype.options={},e.prototype.show=function(t){return o.preventEventDefault(t),this.element.removeClass(this.classes.hide),this.element.find(".annotator-save").addClass(this.classes.focus),this.checkOrientation(),this.element.find(":input:first").focus(),this.setupDraggables(),this.publish("show")},e.prototype.hide=function(t){return o.preventEventDefault(t),this.element.addClass(this.classes.hide),this.publish("hide")},e.prototype.load=function(t){var e,n,o,r;for(this.annotation=t,this.publish("load",[this.annotation]),r=this.fields,n=0,o=r.length;o>n;n++)e=r[n],e.load(e.element,this.annotation);return this.show()},e.prototype.submit=function(t){var e,n,r,i;for(o.preventEventDefault(t),i=this.fields,n=0,r=i.length;r>n;n++)e=i[n],e.submit(e.element,this.annotation);return this.publish("save",[this.annotation]),this.hide()},e.prototype.addField=function(t){var e,n,r;switch(n=$.extend({id:"annotator-field-"+o.uuid(),type:"input",label:"",load:function(){},submit:function(){}},t),r=null,e=$('<li class="annotator-item" />'),n.element=e[0],n.type){case"textarea":r=$("<textarea />");break;case"input":case"checkbox":r=$("<input />");break;case"select":r=$("<select />")}return e.append(r),r.attr({id:n.id,placeholder:n.label}),"checkbox"===n.type&&(r[0].type="checkbox",e.addClass("annotator-checkbox"),e.append($("<label />",{"for":n.id,html:n.label}))),this.element.find("ul:first").append(e),this.fields.push(n),n.element},e.prototype.checkOrientation=function(){var t,n;return e.__super__.checkOrientation.apply(this,arguments),n=this.element.find("ul"),t=this.element.find(".annotator-controls"),this.element.hasClass(this.classes.invert.y)?t.insertBefore(n):t.is(":first-child")&&t.insertAfter(n),this},e.prototype.processKeypress=function(t){return 27===t.keyCode?this.hide():13!==t.keyCode||t.shiftKey?void 0:this.submit()},e.prototype.onCancelButtonMouseover=function(){return this.element.find("."+this.classes.focus).removeClass(this.classes.focus)},e.prototype.setupDraggables=function(){var t,e,n,o,r,i,s,a,u,l,h;return this.element.find(".annotator-resize").remove(),n=this.element.find(this.element.hasClass(this.classes.invert.y)?".annotator-item:last":".annotator-item:first"),n&&$('<span class="annotator-resize"></span>').appendTo(n),r=null,t=this.classes,o=this.element,l=null,u=o.find(".annotator-resize"),e=o.find(".annotator-controls"),h=!1,i=function(t){return t.target===this?(r={element:this,top:t.pageY,left:t.pageX},l=o.find("textarea:first"),$(window).bind({"mouseup.annotator-editor-resize":a,"mousemove.annotator-editor-resize":s}),t.preventDefault()):void 0},a=function(){return r=null,$(window).unbind(".annotator-editor-resize")},s=function(){return function(n){var i,s,a,p,c;return r&&h===!1?(i={top:n.pageY-r.top,left:n.pageX-r.left},r.element===u[0]?(p=l.outerHeight(),c=l.outerWidth(),s=o.hasClass(t.invert.x)?-1:1,a=o.hasClass(t.invert.y)?1:-1,l.height(p+i.top*a),l.width(c+i.left*s),l.outerHeight()!==p&&(r.top=n.pageY),l.outerWidth()!==c&&(r.left=n.pageX)):r.element===e[0]&&(o.css({top:parseInt(o.css("top"),10)+i.top,left:parseInt(o.css("left"),10)+i.left}),r.top=n.pageY,r.left=n.pageX),h=!0,setTimeout(function(){return h=!1},1e3/60)):void 0}}(this),u.bind("mousedown",i),e.bind("mousedown",i)},e}(r),e.exports=n},{"./util":27,"./widget":29}],9:[function(t,e){var n,o,r,i=function(t,e){return function(){return t.apply(e,arguments)}},s={}.hasOwnProperty,a=function(t,e){function n(){this.constructor=t}for(var o in e)s.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("./class"),r=t("./util"),o=function(t){function e(t){this.hide=i(this.hide,this),this.show=i(this.show,this),e.__super__.constructor.call(this,$(this.options.html)[0],t)}return a(e,t),e.prototype.events={click:"hide"},e.prototype.options={html:"<div class='annotator-notice'></div>",classes:{show:"annotator-notice-show",info:"annotator-notice-info",success:"annotator-notice-success",error:"annotator-notice-error"}},e.prototype.show=function(t,n){return null==n&&(n=e.INFO),this.currentStatus=n,this._appendElement(),$(this.element).addClass(this.options.classes.show).addClass(this.options.classes[this.currentStatus]).html(r.escape(t||"")),setTimeout(this.hide,5e3),this},e.prototype.hide=function(){return null==this.currentStatus&&(this.currentStatus=Annotator.Notification.INFO),$(this.element).removeClass(this.options.classes.show).removeClass(this.options.classes[this.currentStatus]),this},e.prototype._appendElement=function(){return null==this.element.parentNode?$(this.element).appendTo(document.body):void 0},e}(n),o.INFO="info",o.SUCCESS="success",o.ERROR="error",e.exports=o},{"./class":7,"./util":27}],"annotator-plugin-authlogin":[function(t,e){e.exports=t("M3jdsG")},{}],M3jdsG:[function(t,e){var n,o,r,i,s,a={}.hasOwnProperty,u=function(t,e){function n(){this.constructor=t}for(var o in e)a.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),i=function(t){var e,n,o,r,i,s;return r="([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?",e=t.match(new RegExp(r)),o=0,n=new Date(e[1],0,1),e[3]&&n.setMonth(e[3]-1),e[5]&&n.setDate(e[5]),e[7]&&n.setHours(e[7]),e[8]&&n.setMinutes(e[8]),e[10]&&n.setSeconds(e[10]),e[12]&&n.setMilliseconds(1e3*Number("0."+e[12])),e[14]&&(o=60*Number(e[16])+Number(e[17]),o*=null!=(s="-"===e[15])?s:{1:-1}),o-=n.getTimezoneOffset(),i=Number(n)+60*o*1e3,n.setTime(Number(i)),n},o=function(t){var e,n,o,r,i,s,a,u,l,h,p,c,d;if("undefined"!=typeof atob&&null!==atob)return atob(t);if(n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",l=0,e=0,r="",d=[],!t)return t;for(t+="";l<t.length;)i=n.indexOf(t.charAt(l++)),s=n.indexOf(t.charAt(l++)),a=n.indexOf(t.charAt(l++)),u=n.indexOf(t.charAt(l++)),o=i<<18|s<<12|a<<6|u,h=o>>16&255,p=o>>8&255,c=255&o,d[e++]=64===a?String.fromCharCode(h):64===u?String.fromCharCode(h,p):String.fromCharCode(h,p,c);return d.join("")},r=function(t){var e,n,r,i;if(n=t.length%4,0!==n)for(e=r=0,i=4-n;i>=0?i>r:r>i;e=i>=0?++r:--r)t+="=";return t=t.replace(/-/g,"+"),t=t.replace(/_/g,"/"),o(t)},s=function(t){var e,n,o,i;return i=t.split("."),e=i[0],n=i[1],o=i[2],JSON.parse(r(n))},n.Plugin.Auth=function(t){function e(){e.__super__.constructor.apply(this,arguments),this.waitingForToken=[],this.options.token?this.setToken(this.options.token):this.requestToken()}return u(e,t),e.prototype.options={token:null,tokenUrl:"/auth/token",autoFetch:!0,requestMethod:"GET",requestData:null,unauthorizedCallback:null},e.prototype.requestToken=function(){return this.requestInProgress=!0,$.ajax({url:this.options.tokenUrl,dataType:"text",data:this.options.requestData,type:this.options.requestMethod,xhrFields:{withCredentials:!0}}).done(function(t){return function(e){return t.setToken(e)}}(this)).fail(function(t){return function(e,o,r){var i,s;return 401===e.status&&(i=t.options.unauthorizedCallback,null!=i&&i(t))?void(t.retryTimeout=setTimeout(function(){return t.requestToken()},1e3)):(s=n._t("Couldn't get auth token:"),console.error(""+s+" "+r,e),n.showNotification(""+s+" "+e.responseText,n.Notification.ERROR))}}(this)).always(function(t){return function(){return t.requestInProgress=!1}}(this))},e.prototype.setToken=function(t){var e;if(this.token=t,this._unsafeToken=s(t),this.haveValidToken()){for(this.options.autoFetch&&(this.refreshTimeout=setTimeout(function(t){return function(){return t.requestToken()}}(this),1e3*(this.timeToExpiry()-2))),this.updateHeaders(),e=[];this.waitingForToken.length>0;)e.push(this.waitingForToken.pop()(this._unsafeToken));return e}return console.warn(n._t("Didn't get a valid token.")),this.options.autoFetch?(console.warn(n._t("Getting a new token in 10s.")),setTimeout(function(t){return function(){return t.requestToken()}}(this),1e4)):void 0},e.prototype.haveValidToken=function(){var t;return t=this._unsafeToken&&this._unsafeToken.issuedAt&&this._unsafeToken.ttl&&this._unsafeToken.consumerKey,t&&this.timeToExpiry()>0?!0:!1},e.prototype.timeToExpiry=function(){var t,e,n,o;return n=(new Date).getTime()/1e3,e=i(this._unsafeToken.issuedAt).getTime()/1e3,t=e+this._unsafeToken.ttl,o=t-n,o>0?o:0},e.prototype.updateHeaders=function(){var t;return t=this.element.data("annotator:headers"),this.element.data("annotator:headers",$.extend(t,{"x-annotator-auth-token":this.token}))},e.prototype.withToken=function(t){return null!=t?this.haveValidToken()?t(this._unsafeToken):(this.waitingForToken.push(t),this.requestInProgress?void 0:this.requestToken()):void 0},e}(n.Plugin),e.exports=n.Plugin.Auth},{annotator:"haW+cw"}],EZHTbU:[function(t,e){var n,o=function(t,e){return function(){return t.apply(e,arguments)}},r={}.hasOwnProperty,i=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),n.Plugin.Filter=function(t){function e(t,n){this._onPreviousClick=o(this._onPreviousClick,this),this._onNextClick=o(this._onNextClick,this),this._onFilterKeyup=o(this._onFilterKeyup,this),this._onFilterBlur=o(this._onFilterBlur,this),this._onFilterFocus=o(this._onFilterFocus,this),this.updateHighlights=o(this.updateHighlights,this);var r;t=$(this.html.element).appendTo((null!=n?n.appendTo:void 0)||this.options.appendTo),e.__super__.constructor.call(this,t,n),(r=this.options).filters||(r.filters=[]),this.filter=$(this.html.filter),this.filters=[],this.current=0}return i(e,t),e.prototype.events={".annotator-filter-property input focus":"_onFilterFocus",".annotator-filter-property input blur":"_onFilterBlur",".annotator-filter-property input keyup":"_onFilterKeyup",".annotator-filter-previous click":"_onPreviousClick",".annotator-filter-next click":"_onNextClick",".annotator-filter-clear click":"_onClearClick"},e.prototype.classes={active:"annotator-filter-active",hl:{hide:"annotator-hl-filtered",active:"annotator-hl-active"}},e.prototype.html={element:'<div class="annotator-filter">\n <strong>'+n._t("Navigate:")+'</strong>\n<span class="annotator-filter-navigation">\n <button type="button" class="annotator-filter-previous">'+n._t("Previous")+'</button>\n<button type="button" class="annotator-filter-next">'+n._t("Next")+"</button>\n</span>\n<strong>"+n._t("Filter by:")+"</strong>\n</div>",filter:'<span class="annotator-filter-property">\n <label></label>\n <input/>\n <button type="button" class="annotator-filter-clear">'+n._t("Clear")+"</button>\n</span>"},e.prototype.options={appendTo:"body",filters:[],addAnnotationFilter:!0,isFiltered:function(t,e){var n,o,r,i; -if(!t||!e)return!1;for(i=t.split(/\s+/),o=0,r=i.length;r>o;o++)if(n=i[o],-1===e.indexOf(n))return!1;return!0}},e.prototype.pluginInit=function(){var t,e,o,r;for(r=this.options.filters,e=0,o=r.length;o>e;e++)t=r[e],this.addFilter(t);return this.updateHighlights(),this._setupListeners()._insertSpacer(),this.options.addAnnotationFilter===!0?this.addFilter({label:n._t("Annotation"),property:"text"}):void 0},e.prototype.destroy=function(){var t,n;return e.__super__.destroy.apply(this,arguments),n=$("html"),t=parseInt(n.css("padding-top"),10)||0,n.css("padding-top",t-this.element.outerHeight()),this.element.remove()},e.prototype._insertSpacer=function(){var t,e;return e=$("html"),t=parseInt(e.css("padding-top"),10)||0,e.css("padding-top",t+this.element.outerHeight()),this},e.prototype._setupListeners=function(){var t,e,n,o;for(e=["annotationsLoaded","annotationCreated","annotationUpdated","annotationDeleted"],n=0,o=e.length;o>n;n++)t=e[n],this.annotator.subscribe(t,this.updateHighlights);return this},e.prototype.addFilter=function(t){var e,o;return o=$.extend({label:"",property:"",isFiltered:this.options.isFiltered},t),function(){var t,n,r,i;for(r=this.filters,i=[],t=0,n=r.length;n>t;t++)e=r[t],e.property===o.property&&i.push(e);return i}.call(this).length||(o.id="annotator-filter-"+o.property,o.annotations=[],o.element=this.filter.clone().appendTo(this.element),o.element.find("label").html(o.label).attr("for",o.id),o.element.find("input").attr({id:o.id,placeholder:n._t("Filter by ")+o.label+"…"}),o.element.find("button").hide(),o.element.data("filter",o),this.filters.push(o)),this},e.prototype.updateFilter=function(t){var e,n,o,r,i,s,a;if(t.annotations=[],this.updateHighlights(),this.resetHighlights(),o=$.trim(t.element.find("input").val())){for(n=this.highlights.map(function(){return $(this).data("annotation")}),a=$.makeArray(n),i=0,s=a.length;s>i;i++)e=a[i],r=e[t.property],t.isFiltered(o,r)&&t.annotations.push(e);return this.filterHighlights()}},e.prototype.updateHighlights=function(){return this.highlights=this.annotator.element.find(".annotator-hl:visible"),this.filtered=this.highlights.not(this.classes.hl.hide)},e.prototype.filterHighlights=function(){var t,e,n,o,r,i,s,a,u,l;for(t=$.grep(this.filters,function(t){return!!t.annotations.length}),o=(null!=(l=t[0])?l.annotations:void 0)||[],t.length>1&&(n=[],$.each(t,function(){return $.merge(n,this.annotations)}),s=[],o=[],$.each(n,function(){return-1===$.inArray(this,s)?s.push(this):o.push(this)})),r=this.highlights,i=a=0,u=o.length;u>a;i=++a)e=o[i],r=r.not(e.highlights);return r.addClass(this.classes.hl.hide),this.filtered=this.highlights.not(this.classes.hl.hide),this},e.prototype.resetHighlights=function(){return this.highlights.removeClass(this.classes.hl.hide),this.filtered=this.highlights,this},e.prototype._onFilterFocus=function(t){var e;return e=$(t.target),e.parent().addClass(this.classes.active),e.next("button").show()},e.prototype._onFilterBlur=function(t){var e;return t.target.value?void 0:(e=$(t.target),e.parent().removeClass(this.classes.active),e.next("button").hide())},e.prototype._onFilterKeyup=function(t){var e;return e=$(t.target).parent().data("filter"),e?this.updateFilter(e):void 0},e.prototype._findNextHighlight=function(t){var e,n,o,r,i,s,a,u;return this.highlights.length?(s=t?0:-1,u=t?-1:0,a=t?"lt":"gt",e=this.highlights.not("."+this.classes.hl.hide),o=e.filter("."+this.classes.hl.active),o.length||(o=e.eq(s)),n=o.data("annotation"),r=e.index(o[0]),i=e.filter(":"+a+"("+r+")").not(n.highlights).eq(u),i.length||(i=e.eq(u)),this._scrollToHighlight(i.data("annotation").highlights)):this},e.prototype._onNextClick=function(){return this._findNextHighlight()},e.prototype._onPreviousClick=function(){return this._findNextHighlight(!0)},e.prototype._scrollToHighlight=function(t){return t=$(t),this.highlights.removeClass(this.classes.hl.active),t.addClass(this.classes.hl.active),$("html, body").animate({scrollTop:t.offset().top-(this.element.height()+20)},150)},e.prototype._onClearClick=function(t){return $(t.target).prev("input").val("").keyup().blur()},e}(n.Plugin),e.exports=n.Plugin.Filter},{annotator:"haW+cw"}],"annotator-plugin-filter":[function(t,e){e.exports=t("EZHTbU")},{}],CyErHP:[function(t,e){var n,o=function(t,e){return function(){return t.apply(e,arguments)}},r={}.hasOwnProperty,i=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),n.Plugin.Markdown=function(t){function e(){this.updateTextField=o(this.updateTextField,this),null!=("undefined"!=typeof Showdown&&null!==Showdown?Showdown.converter:void 0)?(e.__super__.constructor.apply(this,arguments),this.converter=new Showdown.converter):console.error(n._t("To use the Markdown plugin, you must include Showdown into the page first."))}return i(e,t),e.prototype.events={annotationViewerTextField:"updateTextField"},e.prototype.updateTextField=function(t,e){var o;return o=n.Util.escape(e.text||""),$(t).html(this.convert(o))},e.prototype.convert=function(t){return this.converter.makeHtml(t)},e}(n.Plugin),e.exports=n.Plugin.Markdown},{annotator:"haW+cw"}],"annotator-plugin-markdown":[function(t,e){e.exports=t("CyErHP")},{}],HUruzR:[function(t,e){var n,o=function(t,e){return function(){return t.apply(e,arguments)}},r={}.hasOwnProperty,i=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),n.Plugin.Permissions=function(t){function e(){this._setAuthFromToken=o(this._setAuthFromToken,this),this.updateViewer=o(this.updateViewer,this),this.updateAnnotationPermissions=o(this.updateAnnotationPermissions,this),this.updatePermissionsField=o(this.updatePermissionsField,this),this.addFieldsToAnnotation=o(this.addFieldsToAnnotation,this),e.__super__.constructor.apply(this,arguments),this.options.user&&(this.setUser(this.options.user),delete this.options.user)}return i(e,t),e.prototype.options={showViewPermissionsCheckbox:!0,showEditPermissionsCheckbox:!0,userId:function(t){return t},userString:function(t){return t},userAuthorize:function(t,e,n){var o,r,i,s;if(e.permissions){if(r=e.permissions[t]||[],0===r.length)return!0;for(i=0,s=r.length;s>i;i++)if(o=r[i],this.userId(n)===o)return!0;return!1}return e.user?n?this.userId(n)===this.userId(e.user):!1:!0},user:"",permissions:{read:[],update:[],"delete":[],admin:[]}},e.prototype.pluginInit=function(){var t,e;if(n.supported())return this.annotator.subscribe("beforeAnnotationCreated",this.addFieldsToAnnotation),e=this,t=function(t,n){return function(o,r){return e[t].call(e,n,o,r)}},!this.user&&this.annotator.plugins.Auth&&this.annotator.plugins.Auth.withToken(this._setAuthFromToken),this.options.showViewPermissionsCheckbox===!0&&this.annotator.editor.addField({type:"checkbox",label:n._t("Allow anyone to <strong>view</strong> this annotation"),load:t("updatePermissionsField","read"),submit:t("updateAnnotationPermissions","read")}),this.options.showEditPermissionsCheckbox===!0&&this.annotator.editor.addField({type:"checkbox",label:n._t("Allow anyone to <strong>edit</strong> this annotation"),load:t("updatePermissionsField","update"),submit:t("updateAnnotationPermissions","update")}),this.annotator.viewer.addField({load:this.updateViewer}),this.annotator.plugins.Filter?this.annotator.plugins.Filter.addFilter({label:n._t("User"),property:"user",isFiltered:function(t){return function(e,n){var o,r,i,s;if(n=t.options.userString(n),!e||!n)return!1;for(s=e.split(/\s*/),r=0,i=s.length;i>r;r++)if(o=s[r],-1===n.indexOf(o))return!1;return!0}}(this)}):void 0},e.prototype.setUser=function(t){return this.user=t},e.prototype.addFieldsToAnnotation=function(t){return t&&(t.permissions=this.options.permissions,this.user)?t.user=this.user:void 0},e.prototype.authorize=function(t,e,n){return void 0===n&&(n=this.user),this.options.userAuthorize?this.options.userAuthorize.call(this.options,t,e,n):!0},e.prototype.updatePermissionsField=function(t,e,n){var o;return e=$(e).show(),o=e.find("input").removeAttr("disabled"),this.authorize("admin",n)||e.hide(),this.authorize(t,n||{},null)?o.attr("checked","checked"):o.removeAttr("checked")},e.prototype.updateAnnotationPermissions=function(t,e,n){var o;return n.permissions||(n.permissions=this.options.permissions),o=t+"-permissions",n.permissions[t]=$(e).find("input").is(":checked")?[]:[this.options.userId(this.user)]},e.prototype.updateViewer=function(t,e,o){var r,i;return t=$(t),i=this.options.userString(e.user),e.user&&i&&"string"==typeof i?(r=n.Util.escape(this.options.userString(e.user)),t.html(r).addClass("annotator-user")):t.remove(),o&&(this.authorize("update",e)||o.hideEdit(),!this.authorize("delete",e))?o.hideDelete():void 0},e.prototype._setAuthFromToken=function(t){return this.setUser(t.userId)},e}(n.Plugin),e.exports=n.Plugin.Permissions},{annotator:"haW+cw"}],"annotator-plugin-permissions":[function(t,e){e.exports=t("HUruzR")},{}],vOrhum:[function(t,e){var n,o=function(t,e){return function(){return t.apply(e,arguments)}};n=t("annotator"),n.Plugin.Store=function(){function t(t){this._onError=o(this._onError,this),this.options=$.extend(!0,{},this.options,t)}return t.prototype.options={annotationData:{},emulateHTTP:!1,emulateJSON:!1,prefix:"/store",urls:{create:"/annotations",read:"/annotations/:id",update:"/annotations/:id",destroy:"/annotations/:id",search:"/search"}},t.prototype.create=function(t){return this._apiRequest("create",t)},t.prototype.update=function(t){return this._apiRequest("update",t)},t.prototype["delete"]=function(t){return this._apiRequest("destroy",t)},t.prototype.query=function(t){var e;return e=$.Deferred(),this._apiRequest("search",t).done(function(t){var n;return n=t.rows,delete t.rows,e.resolve(n,t)}).fail(function(){return e.reject.apply(e,arguments)}),e.promise()},t.prototype._apiRequest=function(t,e){var n,o,r,i;return n=e&&e.id,i=this._urlFor(t,n),o=this._apiRequestOptions(t,e),r=$.ajax(i,o),r._id=n,r._action=t,r},t.prototype._apiRequestOptions=function(t,e){var n,o,r;return o=this._methodFor(t),r={type:o,dataType:"json",error:this._onError},!this.options.emulateHTTP||"PUT"!==o&&"DELETE"!==o||(r.headers=$.extend(r.headers,{"X-HTTP-Method-Override":o}),r.type="POST"),"search"===t?r=$.extend(r,{data:e}):(("create"===t||"update"===t)&&(e=$.extend(e,this.options.annotationData)),n=e&&JSON.stringify(e),this.options.emulateJSON?(r.data={json:n},this.options.emulateHTTP&&(r.data._method=o),r):r=$.extend(r,{data:n,contentType:"application/json; charset=utf-8"}))},t.prototype._urlFor=function(t,e){var n;return n=null!=this.options.prefix?this.options.prefix:"",n+=this.options.urls[t],n=n.replace(/\/:id/,null!=e?"/"+e:""),n=n.replace(/:id/,null!=e?e:"")},t.prototype._methodFor=function(t){var e;return e={create:"POST",read:"GET",update:"PUT",destroy:"DELETE",search:"GET"},e[t]},t.prototype._onError=function(t){var e,o;switch(e=t._action,o=n._t("Sorry we could not ")+e+n._t(" this annotation"),"search"===t._action?o=n._t("Sorry we could not search the store for annotations"):"read"!==t._action||t._id||(o=n._t("Sorry we could not ")+e+n._t(" the annotations from the store")),t.status){case 401:o=n._t("Sorry you are not allowed to ")+e+n._t(" this annotation");break;case 404:o=n._t("Sorry we could not connect to the annotations store");break;case 500:o=n._t("Sorry something went wrong with the annotation store")}return n.showNotification(o,n.Notification.ERROR),console.error(n._t("API request failed:")+(" '"+t.status+"'"))},t}(),e.exports=n.Plugin.Store},{annotator:"haW+cw"}],"annotator-plugin-store":[function(t,e){e.exports=t("vOrhum")},{}],"annotator-plugin-tags":[function(t,e){e.exports=t("rXlHIq")},{}],rXlHIq:[function(t,e){var n,o=function(t,e){return function(){return t.apply(e,arguments)}},r={}.hasOwnProperty,i=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),n.Plugin.Tags=function(t){function e(){return this.setAnnotationTags=o(this.setAnnotationTags,this),this.updateField=o(this.updateField,this),e.__super__.constructor.apply(this,arguments)}return i(e,t),e.prototype.options={parseTags:function(t){var e;return t=$.trim(t),e=[],t&&(e=t.split(/\s+/)),e},stringifyTags:function(t){return t.join(" ")}},e.prototype.field=null,e.prototype.input=null,e.prototype.pluginInit=function(){return n.supported()?(this.field=this.annotator.editor.addField({label:n._t("Add some tags here")+"…",load:this.updateField,submit:this.setAnnotationTags}),this.annotator.viewer.addField({load:this.updateViewer}),this.annotator.plugins.Filter&&this.annotator.plugins.Filter.addFilter({label:n._t("Tag"),property:"tags",isFiltered:n.Plugin.Tags.filterCallback}),this.input=$(this.field).find(":input")):void 0},e.prototype.parseTags=function(t){return this.options.parseTags(t)},e.prototype.stringifyTags=function(t){return this.options.stringifyTags(t)},e.prototype.updateField=function(t,e){var n;return n="",e.tags&&(n=this.stringifyTags(e.tags)),this.input.val(n)},e.prototype.setAnnotationTags=function(t,e){return e.tags=this.parseTags(this.input.val())},e.prototype.updateViewer=function(t,e){return t=$(t),e.tags&&$.isArray(e.tags)&&e.tags.length?t.addClass("annotator-tags").html(function(){var t;return t=$.map(e.tags,function(t){return'<span class="annotator-tag">'+n.Util.escape(t)+"</span>"}).join(" ")}):t.remove()},e}(n.Plugin),n.Plugin.Tags.filterCallback=function(t,e){var n,o,r,i,s,a,u,l;if(null==e&&(e=[]),r=0,o=[],t)for(o=t.split(/\s+/g),s=0,u=o.length;u>s;s++)if(n=o[s],e.length)for(a=0,l=e.length;l>a;a++)i=e[a],-1!==i.indexOf(n)&&(r+=1);return r===o.length},e.exports=n.Plugin.Tags},{annotator:"haW+cw"}],"annotator-plugin-unsupported":[function(t,e){e.exports=t("Q5LRaO")},{}],Q5LRaO:[function(t,e){var n,o={}.hasOwnProperty,r=function(t,e){function n(){this.constructor=t}for(var r in e)o.call(e,r)&&(t[r]=e[r]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),n.Plugin.Unsupported=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return r(e,t),e.prototype.options={message:n._t("Sorry your current browser does not support the Annotator")},e.prototype.pluginInit=function(){return n.supported()?void 0:$(function(t){return function(){return n.showNotification(t.options.message),void 0===window.XMLHttpRequest&&void 0!==ActiveXObject?$("html").addClass("ie6"):void 0}}(this))},e}(n.Plugin),e.exports=n.Plugin.Unsupported},{annotator:"haW+cw"}],24:[function(t,e){var n,o,r={}.hasOwnProperty,i=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};o=t("./util"),n={},n.sniff=function(t){return null!=t.commonAncestorContainer?new n.BrowserRange(t):"string"==typeof t.start?new n.SerializedRange(t):t.start&&"object"==typeof t.start?new n.NormalizedRange(t):(console.error(_t("Could not sniff range type")),!1)},n.nodeFromXPath=function(t,e){var n,r,i,s,a;return null==e&&(e=document),r=function(t,n){var r;null==n&&(n=null);try{return document.evaluate("."+t,e,n,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue}catch(i){return r=i,console.log("XPath evaluation failed."),console.log("Trying fallback..."),o.nodeFromXPath(t,e)}},$.isXMLDoc(document.documentElement)?(n=document.createNSResolver(null===document.ownerDocument?document.documentElement:document.ownerDocument.documentElement),s=r(t,n),s||(t=function(){var e,n,o,r;for(o=t.split("/"),r=[],e=0,n=o.length;n>e;e++)a=o[e],r.push(a&&-1===a.indexOf(":")?a.replace(/^([a-z]+)/,"xhtml:$1"):a);return r}().join("/"),i=document.lookupNamespaceURI(null),n=function(t){return"xhtml"===t?i:document.documentElement.getAttribute("xmlns:"+t)},s=r(t,n)),s):r(t)},n.RangeError=function(t){function e(t,n,o){this.type=t,this.message=n,this.parent=null!=o?o:null,e.__super__.constructor.call(this,this.message)}return i(e,t),e}(Error),n.BrowserRange=function(){function t(t){this.commonAncestorContainer=t.commonAncestorContainer,this.startContainer=t.startContainer,this.startOffset=t.startOffset,this.endContainer=t.endContainer,this.endOffset=t.endOffset}return t.prototype.normalize=function(){var t,e,r,i;if(this.tainted)return console.error(_t("You may only call normalize() once on a BrowserRange!")),!1;if(this.tainted=!0,i={},this.startContainer.nodeType===Node.ELEMENT_NODE?(i.start=o.getFirstTextNodeNotBefore(this.startContainer.childNodes[this.startOffset]),i.startOffset=0):(i.start=this.startContainer,i.startOffset=this.startOffset),this.endContainer.nodeType===Node.ELEMENT_NODE){if(e=this.endContainer.childNodes[this.endOffset],null!=e){for(t=e;null!=t&&t.nodeType!==Node.TEXT_NODE;)t=t.firstChild;null!=t&&(i.end=t,i.endOffset=0)}null==i.end&&(e=this.endOffset?this.endContainer.childNodes[this.endOffset-1]:this.endContainer.previousSibling,i.end=o.getLastTextNodeUpTo(e),i.endOffset=i.end.nodeValue.length)}else i.end=this.endContainer,i.endOffset=this.endOffset;for(r={},r.start=i.startOffset>0?i.start.nodeValue.length>i.startOffset?i.start.splitText(i.startOffset):i.start.nextSibling:i.start,i.start===i.end?(r.start.nodeValue.length>i.endOffset-i.startOffset&&r.start.splitText(i.endOffset-i.startOffset),r.end=r.start):(i.end.nodeValue.length>i.endOffset&&i.end.splitText(i.endOffset),r.end=i.end),r.commonAncestor=this.commonAncestorContainer;r.commonAncestor.nodeType!==Node.ELEMENT_NODE;)r.commonAncestor=r.commonAncestor.parentNode;return new n.NormalizedRange(r)},t.prototype.serialize=function(t,e){return this.normalize(t).serialize(t,e)},t}(),n.NormalizedRange=function(){function t(t){this.commonAncestor=t.commonAncestor,this.start=t.start,this.end=t.end}return t.prototype.normalize=function(){return this},t.prototype.limit=function(t){var e,n,o,r,i,s;if(e=$.grep(this.textNodes(),function(e){return e.parentNode===t||$.contains(t,e.parentNode)}),!e.length)return null;for(this.start=e[0],this.end=e[e.length-1],o=$(this.start).parents(),s=$(this.end).parents(),r=0,i=s.length;i>r;r++)if(n=s[r],-1!==o.index(n)){this.commonAncestor=n;break}return this},t.prototype.serialize=function(t,e){var r,i,s;return i=function(n,r){var i,s,a,u,l,h,p,c;for(u=e?$(n).parents(":not("+e+")").eq(0):$(n).parent(),h=o.xpathFromNode(u,t)[0],l=o.getTextNodes(u),s=l.slice(0,l.index(n)),a=0,p=0,c=s.length;c>p;p++)i=s[p],a+=i.nodeValue.length;return r?[h,a+n.nodeValue.length]:[h,a]},s=i(this.start),r=i(this.end,!0),new n.SerializedRange({start:s[0],end:r[0],startOffset:s[1],endOffset:r[1]})},t.prototype.text=function(){var t;return function(){var e,n,o,r;for(o=this.textNodes(),r=[],e=0,n=o.length;n>e;e++)t=o[e],r.push(t.nodeValue);return r}.call(this).join("")},t.prototype.textNodes=function(){var t,e,n,r;return n=o.getTextNodes($(this.commonAncestor)),r=[n.index(this.start),n.index(this.end)],e=r[0],t=r[1],$.makeArray(n.slice(e,+t+1||9e9))},t.prototype.toRange=function(){var t;return t=document.createRange(),t.setStartBefore(this.start),t.setEndAfter(this.end),t},t}(),n.SerializedRange=function(){function t(t){this.start=t.start,this.startOffset=t.startOffset,this.end=t.end,this.endOffset=t.endOffset}return t.prototype.normalize=function(t){var e,r,i,s,a,u,l,h,p,c,d,f,g,y;for(u={},g=["start","end"],p=0,d=g.length;d>p;p++){a=g[p];try{s=n.nodeFromXPath(this[a],t)}catch(m){throw r=m,new n.RangeError(a,"Error while finding "+a+" node: "+this[a]+": "+r,r)}if(!s)throw new n.RangeError(a,"Couldn't find "+a+" node: "+this[a]);for(i=0,l=this[a+"Offset"],"end"===a&&l--,y=o.getTextNodes($(s)),c=0,f=y.length;f>c;c++){if(h=y[c],i+h.nodeValue.length>l){u[a+"Container"]=h,u[a+"Offset"]=this[a+"Offset"]-i;break}i+=h.nodeValue.length}if(null==u[a+"Offset"])throw new n.RangeError(""+a+"offset","Couldn't find offset "+this[a+"Offset"]+" in element "+this[a])}return e=null==document.compareDocumentPosition?function(t,e){return t.contains(e)}:function(t,e){return 16&t.compareDocumentPosition(e)},$(u.startContainer).parents().each(function(){return e(this,u.endContainer)?(u.commonAncestorContainer=this,!1):void 0}),new n.BrowserRange(u).normalize(t)},t.prototype.serialize=function(t,e){return this.normalize(t).serialize(t,e)},t.prototype.toObject=function(){return{start:this.start,startOffset:this.startOffset,end:this.end,endOffset:this.endOffset}},t}(),e.exports=n},{"./util":27}],25:[function(t,e){var n,o={}.hasOwnProperty;n=function(){function t(t){this.settings=null!=t?t:{}}return t.createApp=function(t,e){return null==e&&(e={}),new this(e).run(t)},t.prototype.include=function(t){return t.configure(this),this},t.prototype.run=function(t){var e,n;if(this.app)throw new Error("Registry is already bound to a running application");this.include(t);for(e in this)o.call(this,e)&&(n=this[e],t[e]=n);return this.app=t,t.run(this)},t}(),e.exports=n},{}],26:[function(t,e){var n;n=function(){function t(t){this.registry=t}return t.configure=function(t){var e,n,o;return e=null!=(o=t.settings.store)?o.type:void 0,n="function"==typeof e?new e(t.settings.store):new this(t),null!=t.store?t.store:t.store=n},t.prototype.id=function(){var t;return t=0,function(){return t++}}(),t.prototype.create=function(t){var e;return e=$.Deferred(),null==t.id&&(t.id=this.id()),e.resolve(t),e.promise()},t.prototype.update=function(t){var e;return e=$.Deferred(),e.resolve(t),e.promise()},t.prototype["delete"]=function(t){var e;return e=$.Deferred(),e.resolve(t),e.promise()},t.prototype.query=function(){var t;return t=$.Deferred(),t.resolve([],{}),t.promise()},t}(),e.exports=n},{}],27:[function(t,e){var n,o,r,i,s,a;r=t("./xpath"),o=null,"undefined"!=typeof Gettext&&null!==Gettext?(i=new Gettext({domain:"annotator"}),o=function(t){return i.gettext(t)}):o=function(t){return t},a=function(t){return o(t)},("undefined"!=typeof jQuery&&null!==jQuery&&null!=(s=jQuery.fn)?s.jquery:void 0)||console.error(a("Annotator requires jQuery: have you included lib/vendor/jquery.js?")),JSON&&JSON.parse&&JSON.stringify||console.error(a("Annotator requires a JSON implementation: have you included lib/vendor/json2.js?")),n={},n.TranslationString=a,n.flatten=function(t){var e;return(e=function(t){var n,o,r,i;for(o=[],r=0,i=t.length;i>r;r++)n=t[r],o=o.concat(n&&$.isArray(n)?e(n):n);return o})(t)},n.contains=function(t,e){var n;for(n=e;null!=n;){if(n===t)return!0;n=n.parentNode}return!1},n.getTextNodes=function(t){var e;return e=function(t){var n;if(t&&t.nodeType!==Node.TEXT_NODE){if(n=[],t.nodeType!==Node.COMMENT_NODE)for(t=t.lastChild;t;)n.push(e(t)),t=t.previousSibling;return n.reverse()}return t},t.map(function(){return n.flatten(e(this))})},n.getLastTextNodeUpTo=function(t){var e;switch(t.nodeType){case Node.TEXT_NODE:return t;case Node.ELEMENT_NODE:if(null!=t.lastChild&&(e=n.getLastTextNodeUpTo(t.lastChild),null!=e))return e}return t=t.previousSibling,null!=t?n.getLastTextNodeUpTo(t):null},n.getFirstTextNodeNotBefore=function(t){var e;switch(t.nodeType){case Node.TEXT_NODE:return t;case Node.ELEMENT_NODE:if(null!=t.firstChild&&(e=n.getFirstTextNodeNotBefore(t.firstChild),null!=e))return e}return t=t.nextSibling,null!=t?n.getFirstTextNodeNotBefore(t):null},n.readRangeViaSelection=function(t){var e;return e=n.getGlobal().getSelection(),e.removeAllRanges(),e.addRange(t.toRange()),e.toString()},n.xpathFromNode=function(t,e){var n,o;try{o=r.simpleXPathJQuery.call(t,e)}catch(i){n=i,console.log("jQuery-based XPath construction failed! Falling back to manual."),o=r.simpleXPathPure.call(t,e)}return o},n.nodeFromXPath=function(t,e){var n,o,i,s,a,u,l,h;for(a=t.substring(1).split("/"),i=e,u=0,l=a.length;l>u;u++)s=a[u],h=s.split("["),o=h[0],n=h[1],n=null!=n?parseInt((null!=n?n.split("]"):void 0)[0]):1,i=r.findChild(i,o.toLowerCase(),n);return i},n.escape=function(t){return t.replace(/&(?!\w+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")},n.uuid=function(){var t;return t=0,function(){return t++}}(),n.getGlobal=function(){return function(){return this}()},n.maxZIndex=function(t){var e,n;return e=function(){var e,o,r;for(r=[],e=0,o=t.length;o>e;e++)n=t[e],r.push("static"===$(n).css("position")?-1:parseInt($(n).css("z-index"),10)||-1);return r}(),Math.max.apply(Math,e)},n.mousePosition=function(t,e){var n,o;return"absolute"!==(o=$(e).css("position"))&&"fixed"!==o&&"relative"!==o&&(e=$(e).offsetParent()[0]),n=$(e).offset(),{top:t.pageY-n.top,left:t.pageX-n.left}},n.preventEventDefault=function(t){return null!=t&&"function"==typeof t.preventDefault?t.preventDefault():void 0},e.exports=n},{"./xpath":30}],28:[function(t,e){var n,o,r,i,s,a=function(t,e){return function(){return t.apply(e,arguments)}},u={}.hasOwnProperty,l=function(t,e){function n(){this.constructor=t}for(var o in e)u.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};o=t("./util"),i=t("./widget"),s=o.TranslationString,r=function(t){function e(t){this.onDeleteClick=a(this.onDeleteClick,this),this.onEditClick=a(this.onEditClick,this),this.load=a(this.load,this),this.hide=a(this.hide,this),this.show=a(this.show,this),e.__super__.constructor.call(this,$(this.html.element)[0],t),this.item=$(this.html.item)[0],this.fields=[],this.annotations=[]}return l(e,t),e.prototype.events={".annotator-edit click":"onEditClick",".annotator-delete click":"onDeleteClick"},e.prototype.classes={hide:"annotator-hide",showControls:"annotator-visible"},e.prototype.html={element:'<div class="annotator-outer annotator-viewer">\n <ul class="annotator-widget annotator-listing"></ul>\n</div>',item:'<li class="annotator-annotation annotator-item">\n <span class="annotator-controls">\n <a href="#" title="View as webpage" class="annotator-link">View as webpage</a>\n <button type="button" title="Edit" class="annotator-edit">Edit</button>\n <button type="button" title="Delete" class="annotator-delete">Delete</button>\n </span>\n</li>'},e.prototype.options={readOnly:!1},e.prototype.show=function(t){var e;return o.preventEventDefault(t),e=this.element.find(".annotator-controls").addClass(this.classes.showControls),setTimeout(function(t){return function(){return e.removeClass(t.classes.showControls)}}(this),500),this.element.removeClass(this.classes.hide),this.checkOrientation().publish("show")},e.prototype.isShown=function(){return!this.element.hasClass(this.classes.hide)},e.prototype.hide=function(t){return o.preventEventDefault(t),this.element.addClass(this.classes.hide),this.publish("hide")},e.prototype.load=function(t){var e,o,r,i,s,a,u,l,h,p,c,d,f,g,y,m,v;for(this.annotations=t||[],c=this.element.find("ul:first").empty(),m=this.annotations,d=0,g=m.length;g>d;d++)for(e=m[d],l=$(this.item).clone().appendTo(c).data("annotation",e),r=l.find(".annotator-controls"),h=r.find(".annotator-link"),s=r.find(".annotator-edit"),i=r.find(".annotator-delete"),p=new n(e.links||[]).get("alternate",{type:"text/html"}),0===p.length||null==p[0].href?h.remove():h.attr("href",p[0].href),this.options.readOnly?(s.remove(),i.remove()):o={showEdit:function(){return s.removeAttr("disabled")},hideEdit:function(){return s.attr("disabled","disabled")},showDelete:function(){return i.removeAttr("disabled")},hideDelete:function(){return i.attr("disabled","disabled")}},v=this.fields,f=0,y=v.length;y>f;f++)u=v[f],a=$(u.element).clone().appendTo(l)[0],u.load(a,e,o);return this.publish("load",[this.annotations]),this.show()},e.prototype.addField=function(t){var e;return e=$.extend({load:function(){}},t),e.element=$("<div />")[0],this.fields.push(e),e.element,this},e.prototype.onEditClick=function(t){return this.onButtonClick(t,"edit")},e.prototype.onDeleteClick=function(t){return this.onButtonClick(t,"delete")},e.prototype.onButtonClick=function(t,e){var n;return n=$(t.target).parents(".annotator-annotation"),this.publish(e,[n.data("annotation")])},e}(i),n=function(){function t(t){this.data=t}return t.prototype.get=function(t,e){var n,o,r,i,s,a,l,h,p;for(null==e&&(e={}),e=$.extend({},e,{rel:t}),r=function(){var t;t=[];for(o in e)u.call(e,o)&&(s=e[o],t.push(o));return t}(),h=this.data,p=[],a=0,l=h.length;l>a;a++)n=h[a],i=r.reduce(function(t,o){return t&&n[o]===e[o]},!0),i&&p.push(n);return p},t}(),e.exports=r},{"./util":27,"./widget":29}],29:[function(t,e){var n,o,r,i={}.hasOwnProperty,s=function(t,e){function n(){this.constructor=t}for(var o in e)i.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("./class"),o=t("./util"),r=function(t){function e(){e.__super__.constructor.apply(this,arguments),this.classes=$.extend({},e.prototype.classes,this.classes)}return s(e,t),e.prototype.classes={hide:"annotator-hide",invert:{x:"annotator-invert-x",y:"annotator-invert-y"}},e.prototype.destroy=function(){return this.removeEvents(),this.element.remove()},e.prototype.checkOrientation=function(){var t,e,n,r,i;return this.resetOrientation(),i=$(o.getGlobal()),r=this.element.children(":first"),e=r.offset(),n={top:i.scrollTop(),right:i.width()+i.scrollLeft()},t={top:e.top,right:e.left+r.width()},t.top-n.top<0&&this.invertY(),t.right-n.right>0&&this.invertX(),this},e.prototype.resetOrientation=function(){return this.element.removeClass(this.classes.invert.x).removeClass(this.classes.invert.y),this},e.prototype.invertX=function(){return this.element.addClass(this.classes.invert.x),this},e.prototype.invertY=function(){return this.element.addClass(this.classes.invert.y),this},e.prototype.isInvertedY=function(){return this.element.hasClass(this.classes.invert.y)},e.prototype.isInvertedX=function(){return this.element.hasClass(this.classes.invert.x)},e}(n),e.exports=r},{"./class":7,"./util":27}],30:[function(t,e){var n,o,r,i,s;i=function(t){var e;return e=this.map(function(){var e,n,o,r;for(o="",e=this;(null!=e?e.nodeType:void 0)===Node.ELEMENT_NODE&&e!==t;)r=e.tagName.replace(":","\\:"),n=$(e.parentNode).children(r).index(e)+1,n="["+n+"]",o="/"+e.tagName.toLowerCase()+n+o,e=e.parentNode;return o}),e.get()},s=function(t){var e,n,i,s;return e=function(t){var e,n;return e=o(t),n=r(t),""+e+"["+n+"]"},s=t,n=function(t){var n;for(n="";t!==s;){if(null==t)throw new Error("Called getPathTo on a node which was not a descendant of @rootNode. "+s);n=e(t)+"/"+n,t=t.parentNode}return n="/"+n,n=n.replace(/\/$/,"")},i=this.map(function(){var t;return t=n(this)}),i.get()},n=function(t,e,n){var r,i,s,a,u,l;if(!t.hasChildNodes())throw new Error("XPath error: node has no children!");for(i=t.childNodes,s=0,u=0,l=i.length;l>u;u++)if(r=i[u],a=o(r),a===e&&(s+=1,s===n))return r;throw new Error("XPath error: wanted child not found.")},o=function(t){var e;switch(e=t.nodeName.toLowerCase()){case"#text":return"text()";case"#comment":return"comment()";case"#cdata-section":return"cdata-section()";default:return e}},r=function(t){var e,n;for(e=0,n=t;n;)n.nodeName===t.nodeName&&e++,n=n.previousSibling;return e},e.exports={simpleXPathJQuery:i,simpleXPathPure:s,findChild:n}},{}]},{},["haW+cw"])("haW+cw")}); +!function(t){if("object"==typeof exports)module.exports=t();else if("function"==typeof define&&define.amd)define(t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Annotator=t()}}(function(){var t;return function e(t,n,o){function r(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);throw new Error("Cannot find module '"+s+"'")}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return r(n?n:e)},l,l.exports,e,t,n,o)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s<o.length;s++)r(o[s]);return r}({1:[function(e,n,o){!function(){function e(){return{keys:Object.keys,uniqueId:function(t){var e=++h+"";return t?t+e:e},has:function(t,e){return u.call(t,e)},each:function(t,e,n){if(null!=t)if(a&&t.forEach===a)t.forEach(e,n);else if(t.length===+t.length){for(var o=0,r=t.length;r>o;o++)if(e.call(n,t[o],o,t)===s)return}else for(var i in t)if(this.has(t,i)&&e.call(n,t[i],i,t)===s)return},once:function(t){var e,n=!1;return function(){return n?e:(n=!0,e=t.apply(this,arguments),t=null,e)}}}}var r,i=this,s={},a=Array.prototype.forEach,u=Object.prototype.hasOwnProperty,l=Array.prototype.slice,h=0,p=e();r={on:function(t,e,n){if(!d(this,"on",t,[e,n])||!e)return this;this._events||(this._events={});var o=this._events[t]||(this._events[t]=[]);return o.push({callback:e,context:n,ctx:n||this}),this},once:function(t,e,n){if(!d(this,"once",t,[e,n])||!e)return this;var o=this,r=p.once(function(){o.off(t,r),e.apply(this,arguments)});return r._callback=e,this.on(t,r,n)},off:function(t,e,n){var o,r,i,s,a,u,l,h;if(!this._events||!d(this,"off",t,[e,n]))return this;if(!t&&!e&&!n)return this._events={},this;for(s=t?[t]:p.keys(this._events),a=0,u=s.length;u>a;a++)if(t=s[a],i=this._events[t]){if(this._events[t]=o=[],e||n)for(l=0,h=i.length;h>l;l++)r=i[l],(e&&e!==r.callback&&e!==r.callback._callback||n&&n!==r.context)&&o.push(r);o.length||delete this._events[t]}return this},trigger:function(t){if(!this._events)return this;var e=l.call(arguments,1);if(!d(this,"trigger",t,e))return this;var n=this._events[t],o=this._events.all;return n&&f(n,e),o&&f(o,arguments),this},stopListening:function(t,e,n){var o=this._listeners;if(!o)return this;var r=!e&&!n;"object"==typeof e&&(n=this),t&&((o={})[t._listenerId]=t);for(var i in o)o[i].off(e,n,this),r&&delete this._listeners[i];return this}};var c=/\s+/,d=function(t,e,n,o){if(!n)return!0;if("object"==typeof n){for(var r in n)t[e].apply(t,[r,n[r]].concat(o));return!1}if(c.test(n)){for(var i=n.split(c),s=0,a=i.length;a>s;s++)t[e].apply(t,[i[s]].concat(o));return!1}return!0},f=function(t,e){var n,o=-1,r=t.length,i=e[0],s=e[1],a=e[2];switch(e.length){case 0:for(;++o<r;)(n=t[o]).callback.call(n.ctx);return;case 1:for(;++o<r;)(n=t[o]).callback.call(n.ctx,i);return;case 2:for(;++o<r;)(n=t[o]).callback.call(n.ctx,i,s);return;case 3:for(;++o<r;)(n=t[o]).callback.call(n.ctx,i,s,a);return;default:for(;++o<r;)(n=t[o]).callback.apply(n.ctx,e)}},g={listenTo:"on",listenToOnce:"once"};p.each(g,function(t,e){r[e]=function(e,n,o){var r=this._listeners||(this._listeners={}),i=e._listenerId||(e._listenerId=p.uniqueId("l"));return r[i]=e,"object"==typeof n&&(o=this),e[t](n,o,this),this}}),r.bind=r.on,r.unbind=r.off,r.mixin=function(t){var e=["on","once","off","trigger","stopListening","listenTo","listenToOnce","bind","unbind"];return p.each(e,function(e){t[e]=this[e]},this),t},"function"==typeof t?t(function(){return r}):"undefined"!=typeof o?("undefined"!=typeof n&&n.exports&&(o=n.exports=r),o.BackboneEvents=r):i.BackboneEvents=r}(this)},{}],2:[function(t,e){e.exports=t("./backbone-events-standalone")},{"./backbone-events-standalone":1}],3:[function(e,n,o){!function(e){"object"==typeof o?n.exports=e():"function"==typeof t&&t.amd?t(e):window.BackboneExtend=e()}(function(){"use strict";var t={has:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},extend:function(t){for(var e=1;e<arguments.length;++e){var n=arguments[e];if(n)for(var o in n)t[o]=n[o]}return t}},e=function(e,n){var o,r=this;o=e&&t.has(e,"constructor")?e.constructor:function(){return r.apply(this,arguments)},t.extend(o,r,n);var i=function(){this.constructor=o};return i.prototype=r.prototype,o.prototype=new i,e&&t.extend(o.prototype,e),o.__super__=r.prototype,o};return e})},{}],4:[function(t,e){var n,o,r={}.hasOwnProperty;o=t("./storage"),n=function(){function t(t){this.registry=t}return t.configure=function(t){return null==t.annotations&&(t.annotations=new this(t)),t.include(o)},t.prototype.create=function(t){return null==t&&(t={}),this._cycle(t,"create")},t.prototype.update=function(t){if(null==t.id)throw new TypeError("annotation must have an id for update()");return this._cycle(t,"update")},t.prototype["delete"]=function(t){if(null==t.id)throw new TypeError("annotation must have an id for delete()");return this._cycle(t,"delete")},t.prototype.query=function(t){return this.registry.store.query(t)},t.prototype.load=function(t){return this.query(t)},t.prototype._cycle=function(t,e){var n;return n=$.extend(!0,{},t),delete n._local,this.registry.store[e](n).then(function(){return function(e){var n,o;for(n in t)r.call(t,n)&&(o=t[n],"_local"!==n&&delete t[n]);return $.extend(t,e),t}}(this))},t}(),e.exports=n},{"./storage":26}],annotator:[function(t,e){e.exports=t("haW+cw")},{}],"haW+cw":[function(t,e){var n,o,r,i,s,a,u,l,h,p,c,d,f,g,y,m,v,w=function(t,e){return function(){return t.apply(e,arguments)}},_={}.hasOwnProperty,b=function(t,e){function n(){this.constructor=t}for(var o in e)_.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};c=t("backbone-extend-standalone"),r=t("./class"),a=t("./range"),l=t("./util"),p=t("./widget"),h=t("./viewer"),i=t("./editor"),s=t("./notification"),u=t("./registry"),n=t("./annotations"),v=l.TranslationString,y=this.Annotator,f=function(){return console.error.apply(console,arguments)},o=function(t){function e(t,n){return this.onEditAnnotation=w(this.onEditAnnotation,this),this.onAdderClick=w(this.onAdderClick,this),this.onAdderMousedown=w(this.onAdderMousedown,this),this.onHighlightMouseover=w(this.onHighlightMouseover,this),this.checkForEndSelection=w(this.checkForEndSelection,this),this.checkForStartSelection=w(this.checkForStartSelection,this),this.clearViewerHideTimer=w(this.clearViewerHideTimer,this),this.startViewerHideTimer=w(this.startViewerHideTimer,this),this.showViewer=w(this.showViewer,this),this.onEditorSubmit=w(this.onEditorSubmit,this),this.onEditorHide=w(this.onEditorHide,this),this.showEditor=w(this.showEditor,this),e.__super__.constructor.apply(this,arguments),this.plugins={},e._instances.push(this),e.supported()?void u.createApp(this,n):this}return b(e,t),e.prototype.events={".annotator-adder button click":"onAdderClick",".annotator-adder button mousedown":"onAdderMousedown",".annotator-hl mouseover":"onHighlightMouseover",".annotator-hl mouseout":"startViewerHideTimer"},e.prototype.html={adder:'<div class="annotator-adder"><button type="button">'+v("Annotate")+"</button></div>",wrapper:'<div class="annotator-wrapper"></div>'},e.prototype.options={store:null,readOnly:!1,loadQuery:{}},e.prototype.plugins={},e.prototype.editor=null,e.prototype.viewer=null,e.prototype.selectedRanges=null,e.prototype.mouseIsDown=!1,e.prototype.ignoreMouseup=!1,e.prototype.viewerHideTimer=null,e.extend=c,e.prototype._setupWrapper=function(){return this.wrapper=$(this.html.wrapper),this.element.find("script").remove(),this.element.wrapInner(this.wrapper),this.wrapper=this.element.find(".annotator-wrapper"),this},e.prototype._setupViewer=function(){return this.viewer=new e.Viewer({readOnly:this.options.readOnly}),this.viewer.hide().on("edit",this.onEditAnnotation).on("delete",function(t){return function(e){return t.viewer.hide(),t.publish("beforeAnnotationDeleted",[e]),t.cleanupAnnotation(e),t.annotations["delete"](e).done(function(){return t.publish("annotationDeleted",[e])})}}(this)).addField({load:function(t){return function(e,n){return $(e).html(n.text?l.escape(n.text):"<i>"+v("No Comment")+"</i>"),t.publish("annotationViewerTextField",[e,n])}}(this)}).element.appendTo(this.wrapper).bind({mouseover:this.clearViewerHideTimer,mouseout:this.startViewerHideTimer}),this},e.prototype._setupEditor=function(){return this.editor=new e.Editor,this.editor.hide().on("hide",this.onEditorHide).on("save",this.onEditorSubmit).addField({type:"textarea",label:v("Comments")+"…",load:function(t,e){return $(t).find("textarea").val(e.text||"")},submit:function(t,e){return e.text=$(t).find("textarea").val()}}),this.editor.element.appendTo(this.wrapper),this},e.prototype._setupDocumentEvents=function(){return $(document).bind({mouseup:this.checkForEndSelection,mousedown:this.checkForStartSelection}),this},e.prototype._setupDynamicStyle=function(){var t,e,n,o;return n=$("#annotator-dynamic-style"),n.length||(n=$('<style id="annotator-dynamic-style"></style>').appendTo(document.head)),e="*"+function(){var t,e,n,r;for(n=["adder","outer","notice","filter"],r=[],t=0,e=n.length;e>t;t++)o=n[t],r.push(":not(.annotator-"+o+")");return r}().join(""),t=l.maxZIndex($(document.body).find(e)),t=Math.max(t,1e3),n.text([".annotator-adder, .annotator-outer, .annotator-notice {"," z-index: "+(t+20)+";","}",".annotator-filter {"," z-index: "+(t+10)+";","}"].join("\n")),this},e.prototype.load=function(t){return this.annotations.load(t).then(function(t){return function(e){return t.loadAnnotations(e)}}(this))},e.prototype.destroy=function(){var t,n,o,r;$(document).unbind({mouseup:this.checkForEndSelection,mousedown:this.checkForStartSelection}),$("#annotator-dynamic-style").remove(),this.adder.remove(),this.viewer.destroy(),this.editor.destroy(),this.wrapper.find(".annotator-hl").each(function(){return $(this).contents().insertBefore(this),$(this).remove()}),this.wrapper.contents().insertBefore(this.wrapper),this.wrapper.remove(),this.element.data("annotator",null),r=this.plugins;for(n in r)o=r[n],this.plugins[n].destroy();return this.removeEvents(),t=e._instances.indexOf(this),-1!==t?e._instances.splice(t,1):void 0},e.prototype.getSelectedRanges=function(){var t,e,n,o,r,i,s,u,h;for(s=l.getGlobal().getSelection(),r=[],i=[],s.isCollapsed||(r=function(){var r,u,l;for(l=[],e=r=0,u=s.rangeCount;u>=0?u>r:r>u;e=u>=0?++r:--r)o=s.getRangeAt(e),t=new a.BrowserRange(o),n=t.normalize().limit(this.wrapper[0]),null===n&&i.push(o),l.push(n);return l}.call(this),s.removeAllRanges()),u=0,h=i.length;h>u;u++)o=i[u],s.addRange(o);return $.grep(r,function(t){return t&&s.addRange(t.toRange()),t})},e.prototype.setupAnnotation=function(t){var e,n,o,r,i,s,u,l,h,p;for(i=this.wrapper[0],o=[],p=t.ranges,s=0,l=p.length;l>s;s++){r=p[s];try{o.push(a.sniff(r).normalize(i))}catch(c){if(e=c,!(e instanceof a.RangeError))throw e;this.publish("rangeNormalizeFail",[t,r,e])}}for(t.quote=[],t.ranges=[],t._local={},t._local.highlights=[],u=0,h=o.length;h>u;u++)n=o[u],t.quote.push($.trim(n.text())),t.ranges.push(n.serialize(this.wrapper[0],".annotator-hl")),$.merge(t._local.highlights,this.highlightRange(n));return t.quote=t.quote.join(" / "),$(t._local.highlights).data("annotation",t),t},e.prototype.cleanupAnnotation=function(t){var e,n,o,r,i;if(null!=(null!=(r=t._local)?r.highlights:void 0)){for(i=t._local.highlights,n=0,o=i.length;o>n;n++)e=i[n],null!=e.parentNode&&$(e).replaceWith(e.childNodes);delete t._local.highlights}return t},e.prototype.loadAnnotations=function(t){var e,n;return null==t&&(t=[]),n=function(t){return function(o){var r,i,s,a;for(null==o&&(o=[]),i=o.splice(0,10),s=0,a=i.length;a>s;s++)r=i[s],t.setupAnnotation(r);return o.length>0?setTimeout(function(){return n(o)},10):t.publish("annotationsLoaded",[e])}}(this),e=t.slice(),n(t),this},e.prototype.dumpAnnotations=function(){return this.plugins.Store?this.plugins.Store.dumpAnnotations():(console.warn(v("Can't dump annotations without Store plugin.")),!1)},e.prototype.highlightRange=function(t,e){var n,o,r,i,s,a,u;for(null==e&&(e="annotator-hl"),r=/^\s*$/,n=$("<span class='"+e+"'></span>"),a=t.textNodes(),u=[],i=0,s=a.length;s>i;i++)o=a[i],r.test(o.nodeValue)||u.push($(o).wrapAll(n).parent().show()[0]);return u},e.prototype.highlightRanges=function(t,e){var n,o,r,i;for(null==e&&(e="annotator-hl"),n=[],r=0,i=t.length;i>r;r++)o=t[r],$.merge(n,this.highlightRange(o,e));return n},e.prototype.addPlugin=function(t,n){var o,r;return this.plugins[t]?console.error(v("You cannot have more than one instance of any plugin.")):(o=e.Plugin[t],"function"==typeof o?(this.plugins[t]=new o(this.element[0],n),this.plugins[t].annotator=this,"function"==typeof(r=this.plugins[t]).pluginInit&&r.pluginInit()):console.error(v("Could not load ")+t+v(" plugin. Have you included the appropriate <script> tag?"))),this},e.prototype.editAnnotation=function(t,e){var n,o,r;return n=$.Deferred(),r=n.resolve.bind(n,t),o=n.reject.bind(n,t),this.showEditor(t,e),this.subscribe("annotationEditorSubmit",r),this.once("annotationEditorHidden",function(t){return function(){return t.unsubscribe("annotationEditorSubmit",r),"pending"===n.state()?o():void 0}}(this)),n.promise()},e.prototype.showEditor=function(t,e){return this.editor.element.css(e),this.editor.load(t),this.publish("annotationEditorShown",[this.editor,t]),this},e.prototype.onEditorHide=function(){return this.publish("annotationEditorHidden",[this.editor]),this.ignoreMouseup=!1},e.prototype.onEditorSubmit=function(t){return this.publish("annotationEditorSubmit",[this.editor,t])},e.prototype.showViewer=function(t,e){return this.viewer.element.css(e),this.viewer.load(t),this.publish("annotationViewerShown",[this.viewer,t])},e.prototype.startViewerHideTimer=function(){return this.viewerHideTimer?void 0:this.viewerHideTimer=setTimeout(this.viewer.hide,250)},e.prototype.clearViewerHideTimer=function(){return clearTimeout(this.viewerHideTimer),this.viewerHideTimer=!1},e.prototype.checkForStartSelection=function(t){return t&&this.isAnnotator(t.target)||this.startViewerHideTimer(),this.mouseIsDown=!0},e.prototype.checkForEndSelection=function(t){var e,n,o,r,i;if(this.mouseIsDown=!1,!this.ignoreMouseup){for(this.selectedRanges=this.getSelectedRanges(),i=this.selectedRanges,o=0,r=i.length;r>o;o++)if(n=i[o],e=n.commonAncestor,$(e).hasClass("annotator-hl")&&(e=$(e).parents("[class!=annotator-hl]")[0]),this.isAnnotator(e))return;return t&&this.selectedRanges.length?this.adder.css(l.mousePosition(t,this.wrapper[0])).show():this.adder.hide()}},e.prototype.isAnnotator=function(t){return!!$(t).parents().addBack().filter("[class^=annotator-]").not(this.wrapper).length},e.prototype.configure=function(t){return this.registry=t,t.include(n)},e.prototype.run=function(t){return this.registry=t,this.options.readOnly||this._setupDocumentEvents(),this._setupWrapper()._setupViewer()._setupEditor(),this._setupDynamicStyle(),this.adder=$(this.html.adder).appendTo(this.wrapper).hide(),this.options.loadQuery?this.load(this.options.loadQuery):void 0},e.prototype.onHighlightMouseover=function(t){var e;return this.clearViewerHideTimer(),this.mouseIsDown||this.viewer.isShown()?!1:(e=$(t.target).parents(".annotator-hl").addBack().map(function(){return $(this).data("annotation")}),this.showViewer($.makeArray(e),l.mousePosition(t,this.wrapper[0])))},e.prototype.onAdderMousedown=function(t){return null!=t&&t.preventDefault(),this.ignoreMouseup=!0},e.prototype.onAdderClick=function(t){var e,n;return null!=t&&t.preventDefault(),n=this.adder.position(),this.adder.hide(),e={ranges:this.selectedRanges},$.when(e).done(function(t){return function(e){return t.publish("beforeAnnotationCreated",[e])}}(this)).then(function(t){return function(e){return t.setupAnnotation(e)}}(this)).done(function(){return function(t){return $(t._local.highlights).addClass("annotator-hl-temporary")}}(this)).then(function(t){return function(e){return t.editAnnotation(e,n)}}(this)).then(function(t){return function(e){return t.annotations.create(e).fail(f)}}(this)).done(function(){return function(t){return $(t._local.highlights).removeClass("annotator-hl-temporary")}}(this)).done(function(t){return function(e){return t.publish("annotationCreated",[e])}}(this)).fail(this.cleanupAnnotation)},e.prototype.onEditAnnotation=function(t){var e;return e=this.viewer.element.position(),this.viewer.hide(),$.when(t).done(function(t){return function(e){return t.publish("beforeAnnotationUpdated",[e])}}(this)).then(function(t){return function(n){return t.editAnnotation(n,e)}}(this)).then(function(t){return function(e){return t.annotations.update(e).fail(f)}}(this)).done(function(t){return function(e){return t.publish("annotationUpdated",[e])}}(this))},e}(r),o.Plugin=function(t){function e(){e.__super__.constructor.apply(this,arguments)}return b(e,t),e.prototype.pluginInit=function(){},e.prototype.destroy=function(){return this.removeEvents()},e}(r),d=l.getGlobal(),null==(null!=(m=d.document)?m.evaluate:void 0)&&$.getScript("http://assets.annotateit.org/vendor/xpath.min.js"),null==d.getSelection&&$.getScript("http://assets.annotateit.org/vendor/ierange.min.js"),null==d.JSON&&$.getScript("http://assets.annotateit.org/vendor/json2.min.js"),null==d.Node&&(d.Node={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12}),o.Delegator=r,o.Range=a,o.Util=l,o.Widget=p,o.Viewer=h,o.Editor=i,o.Notification=s,g=new s,o.showNotification=g.show,o.hideNotification=g.hide,o._instances=[],o._t=v,o.supported=function(){return function(){return!!this.getSelection}()},o.noConflict=function(){return l.getGlobal().Annotator=y,this},$.fn.annotator=function(t){var e;return e=Array.prototype.slice.call(arguments,1),this.each(function(){var n;return n=$.data(this,"annotator"),n?t&&n[t].apply(n,e):(n=new o(this,t),$.data(this,"annotator",n))})},e.exports=o,t("annotator-plugin-authlogin"),t("annotator-plugin-filter"),t("annotator-plugin-markdown"),t("annotator-plugin-permissions"),t("annotator-plugin-store"),t("annotator-plugin-tags"),t("annotator-plugin-unsupported")},{"./annotations":4,"./class":7,"./editor":8,"./notification":9,"./range":24,"./registry":25,"./util":27,"./viewer":28,"./widget":29,"annotator-plugin-authlogin":"M3jdsG","annotator-plugin-filter":"EZHTbU","annotator-plugin-markdown":"CyErHP","annotator-plugin-permissions":"HUruzR","annotator-plugin-store":"vOrhum","annotator-plugin-tags":"rXlHIq","annotator-plugin-unsupported":"Q5LRaO","backbone-extend-standalone":3}],7:[function(t,e){var n,o,r,i=[].slice,s={}.hasOwnProperty;r=t("./util"),o=function(){function t(t,e){this.options=$.extend(!0,{},this.options,e),this.element=$(t),this._closures={},this.addEvents()}return t.prototype.events={},t.prototype.options={},t.prototype.element=null,t.prototype.addEvents=function(){var e,n,o,r,i;for(r=t._parseEvents(this.events),i=[],n=0,o=r.length;o>n;n++)e=r[n],i.push(this._addEvent(e.selector,e.event,e.functionName));return i},t.prototype.removeEvents=function(){var e,n,o,r,i;for(r=t._parseEvents(this.events),i=[],n=0,o=r.length;o>n;n++)e=r[n],i.push(this._removeEvent(e.selector,e.event,e.functionName));return i},t.prototype._addEvent=function(e,n,o){var r;return r=function(t){return function(){return t[o].apply(t,arguments)}}(this),""===e&&t._isCustomEvent(n)?this.subscribe(n,r):this.element.delegate(e,n,r),this._closures[""+e+"/"+n+"/"+o]=r,this},t.prototype._removeEvent=function(e,n,o){var r;return r=this._closures[""+e+"/"+n+"/"+o],""===e&&t._isCustomEvent(n)?this.unsubscribe(n,r):this.element.undelegate(e,n,r),delete this._closures[""+e+"/"+n+"/"+o],this},t.prototype.publish=function(t,e){return null==e&&(e=[]),this.trigger.apply(this,[t].concat(i.call(e)))},t.prototype.subscribe=function(t,e,n){return null==n&&(n=this),this.on(t,e,n)},t.prototype.unsubscribe=function(t,e,n){return null==n&&(n=this),this.off(t,e,n)},t}(),o._parseEvents=function(t){var e,n,o,r,s,a,u;n=[];for(r in t)o=t[r],u=r.split(" "),s=2<=u.length?i.call(u,0,a=u.length-1):(a=0,[]),e=u[a++],n.push({selector:s.join(" "),event:e,functionName:o});return n},o.natives=function(){var t,e,n;return e=function(){var e,o;e=$.event.special,o=[];for(t in e)s.call(e,t)&&(n=e[t],o.push(t));return o}(),"blur focus focusin focusout load resize scroll unload click dblclick\nmousedown mouseup mousemove mouseover mouseout mouseenter mouseleave\nchange select submit keydown keypress keyup error".split(/[^a-z]+/).concat(e)}(),o._isCustomEvent=function(t){return t=t.split(".")[0],-1===$.inArray(t,o.natives)},n=t("backbone-events-standalone"),n.mixin(o.prototype),e.exports=o},{"./util":27,"backbone-events-standalone":2}],8:[function(t,e){var n,o,r,i,s=function(t,e){return function(){return t.apply(e,arguments)}},a={}.hasOwnProperty,u=function(t,e){function n(){this.constructor=t}for(var o in e)a.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};o=t("./util"),r=t("./widget"),i=o.TranslationString,n=function(t){function e(t){this.onCancelButtonMouseover=s(this.onCancelButtonMouseover,this),this.processKeypress=s(this.processKeypress,this),this.submit=s(this.submit,this),this.load=s(this.load,this),this.hide=s(this.hide,this),this.show=s(this.show,this),e.__super__.constructor.call(this,$(this.html)[0],t),this.fields=[],this.annotation={}}return u(e,t),e.prototype.events={"form submit":"submit",".annotator-save click":"submit",".annotator-cancel click":"hide",".annotator-cancel mouseover":"onCancelButtonMouseover","textarea keydown":"processKeypress"},e.prototype.classes={hide:"annotator-hide",focus:"annotator-focus"},e.prototype.html='<div class="annotator-outer annotator-editor">\n <form class="annotator-widget">\n <ul class="annotator-listing"></ul>\n <div class="annotator-controls">\n <a href="#cancel" class="annotator-cancel">'+i("Cancel")+'</a>\n<a href="#save" class="annotator-save annotator-focus">'+i("Save")+"</a>\n </div>\n </form>\n</div>",e.prototype.options={},e.prototype.show=function(t){return o.preventEventDefault(t),this.element.removeClass(this.classes.hide),this.element.find(".annotator-save").addClass(this.classes.focus),this.checkOrientation(),this.element.find(":input:first").focus(),this.setupDraggables(),this.publish("show")},e.prototype.hide=function(t){return o.preventEventDefault(t),this.element.addClass(this.classes.hide),this.publish("hide")},e.prototype.load=function(t){var e,n,o,r;for(this.annotation=t,this.publish("load",[this.annotation]),r=this.fields,n=0,o=r.length;o>n;n++)e=r[n],e.load(e.element,this.annotation);return this.show()},e.prototype.submit=function(t){var e,n,r,i;for(o.preventEventDefault(t),i=this.fields,n=0,r=i.length;r>n;n++)e=i[n],e.submit(e.element,this.annotation);return this.publish("save",[this.annotation]),this.hide()},e.prototype.addField=function(t){var e,n,r;switch(n=$.extend({id:"annotator-field-"+o.uuid(),type:"input",label:"",load:function(){},submit:function(){}},t),r=null,e=$('<li class="annotator-item" />'),n.element=e[0],n.type){case"textarea":r=$("<textarea />");break;case"input":case"checkbox":r=$("<input />");break;case"select":r=$("<select />")}return e.append(r),r.attr({id:n.id,placeholder:n.label}),"checkbox"===n.type&&(r[0].type="checkbox",e.addClass("annotator-checkbox"),e.append($("<label />",{"for":n.id,html:n.label}))),this.element.find("ul:first").append(e),this.fields.push(n),n.element},e.prototype.checkOrientation=function(){var t,n;return e.__super__.checkOrientation.apply(this,arguments),n=this.element.find("ul"),t=this.element.find(".annotator-controls"),this.element.hasClass(this.classes.invert.y)?t.insertBefore(n):t.is(":first-child")&&t.insertAfter(n),this},e.prototype.processKeypress=function(t){return 27===t.keyCode?this.hide():13!==t.keyCode||t.shiftKey?void 0:this.submit()},e.prototype.onCancelButtonMouseover=function(){return this.element.find("."+this.classes.focus).removeClass(this.classes.focus)},e.prototype.setupDraggables=function(){var t,e,n,o,r,i,s,a,u,l,h;return this.element.find(".annotator-resize").remove(),n=this.element.find(this.element.hasClass(this.classes.invert.y)?".annotator-item:last":".annotator-item:first"),n&&$('<span class="annotator-resize"></span>').appendTo(n),r=null,t=this.classes,o=this.element,l=null,u=o.find(".annotator-resize"),e=o.find(".annotator-controls"),h=!1,i=function(t){return t.target===this?(r={element:this,top:t.pageY,left:t.pageX},l=o.find("textarea:first"),$(window).bind({"mouseup.annotator-editor-resize":a,"mousemove.annotator-editor-resize":s}),t.preventDefault()):void 0},a=function(){return r=null,$(window).unbind(".annotator-editor-resize")},s=function(){return function(n){var i,s,a,p,c;return r&&h===!1?(i={top:n.pageY-r.top,left:n.pageX-r.left},r.element===u[0]?(p=l.outerHeight(),c=l.outerWidth(),s=o.hasClass(t.invert.x)?-1:1,a=o.hasClass(t.invert.y)?1:-1,l.height(p+i.top*a),l.width(c+i.left*s),l.outerHeight()!==p&&(r.top=n.pageY),l.outerWidth()!==c&&(r.left=n.pageX)):r.element===e[0]&&(o.css({top:parseInt(o.css("top"),10)+i.top,left:parseInt(o.css("left"),10)+i.left}),r.top=n.pageY,r.left=n.pageX),h=!0,setTimeout(function(){return h=!1},1e3/60)):void 0}}(this),u.bind("mousedown",i),e.bind("mousedown",i)},e}(r),e.exports=n},{"./util":27,"./widget":29}],9:[function(t,e){var n,o,r,i=function(t,e){return function(){return t.apply(e,arguments)}},s={}.hasOwnProperty,a=function(t,e){function n(){this.constructor=t}for(var o in e)s.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("./class"),r=t("./util"),o=function(t){function e(t){this.hide=i(this.hide,this),this.show=i(this.show,this),e.__super__.constructor.call(this,$(this.options.html)[0],t)}return a(e,t),e.prototype.events={click:"hide"},e.prototype.options={html:"<div class='annotator-notice'></div>",classes:{show:"annotator-notice-show",info:"annotator-notice-info",success:"annotator-notice-success",error:"annotator-notice-error"}},e.prototype.show=function(t,n){return null==n&&(n=e.INFO),this.currentStatus=n,this._appendElement(),$(this.element).addClass(this.options.classes.show).addClass(this.options.classes[this.currentStatus]).html(r.escape(t||"")),setTimeout(this.hide,5e3),this},e.prototype.hide=function(){return null==this.currentStatus&&(this.currentStatus=Annotator.Notification.INFO),$(this.element).removeClass(this.options.classes.show).removeClass(this.options.classes[this.currentStatus]),this},e.prototype._appendElement=function(){return null==this.element.parentNode?$(this.element).appendTo(document.body):void 0},e}(n),o.INFO="info",o.SUCCESS="success",o.ERROR="error",e.exports=o},{"./class":7,"./util":27}],"annotator-plugin-authlogin":[function(t,e){e.exports=t("M3jdsG")},{}],M3jdsG:[function(t,e){var n,o,r,i,s,a={}.hasOwnProperty,u=function(t,e){function n(){this.constructor=t}for(var o in e)a.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),i=function(t){var e,n,o,r,i,s;return r="([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?",e=t.match(new RegExp(r)),o=0,n=new Date(e[1],0,1),e[3]&&n.setMonth(e[3]-1),e[5]&&n.setDate(e[5]),e[7]&&n.setHours(e[7]),e[8]&&n.setMinutes(e[8]),e[10]&&n.setSeconds(e[10]),e[12]&&n.setMilliseconds(1e3*Number("0."+e[12])),e[14]&&(o=60*Number(e[16])+Number(e[17]),o*=null!=(s="-"===e[15])?s:{1:-1}),o-=n.getTimezoneOffset(),i=Number(n)+60*o*1e3,n.setTime(Number(i)),n},o=function(t){var e,n,o,r,i,s,a,u,l,h,p,c,d;if("undefined"!=typeof atob&&null!==atob)return atob(t);if(n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",l=0,e=0,r="",d=[],!t)return t;for(t+="";l<t.length;)i=n.indexOf(t.charAt(l++)),s=n.indexOf(t.charAt(l++)),a=n.indexOf(t.charAt(l++)),u=n.indexOf(t.charAt(l++)),o=i<<18|s<<12|a<<6|u,h=o>>16&255,p=o>>8&255,c=255&o,d[e++]=64===a?String.fromCharCode(h):64===u?String.fromCharCode(h,p):String.fromCharCode(h,p,c);return d.join("")},r=function(t){var e,n,r,i;if(n=t.length%4,0!==n)for(e=r=0,i=4-n;i>=0?i>r:r>i;e=i>=0?++r:--r)t+="=";return t=t.replace(/-/g,"+"),t=t.replace(/_/g,"/"),o(t)},s=function(t){var e,n,o,i;return i=t.split("."),e=i[0],n=i[1],o=i[2],JSON.parse(r(n))},n.Plugin.Auth=function(t){function e(){e.__super__.constructor.apply(this,arguments),this.waitingForToken=[]}return u(e,t),e.prototype.options={token:null,tokenUrl:"/auth/token",autoFetch:!0,requestMethod:"GET",requestData:null,unauthorizedCallback:null},e.prototype.pluginInit=function(){return this.options.token?this.setToken(this.options.token):this.requestToken()},e.prototype.requestToken=function(){return this.requestInProgress=!0,$.ajax({url:this.options.tokenUrl,dataType:"text",data:this.options.requestData,type:this.options.requestMethod,xhrFields:{withCredentials:!0}}).done(function(t){return function(e){return t.setToken(e)}}(this)).fail(function(t){return function(e,o,r){var i,s;return 401===e.status&&(i=t.options.unauthorizedCallback,null!=i&&i(t))?void(t.retryTimeout=setTimeout(function(){return t.requestToken()},1e3)):(s=n._t("Couldn't get auth token:"),console.error(""+s+" "+r,e),n.showNotification(""+s+" "+e.responseText,n.Notification.ERROR))}}(this)).always(function(t){return function(){return t.requestInProgress=!1}}(this))},e.prototype.setToken=function(t){var e;if(this.token=t,this._unsafeToken=s(t),this.haveValidToken()){for(this.options.autoFetch&&(this.refreshTimeout=setTimeout(function(t){return function(){return t.requestToken()}}(this),1e3*(this.timeToExpiry()-2))),this.updateHeaders(),e=[];this.waitingForToken.length>0;)e.push(this.waitingForToken.pop()(this._unsafeToken));return e}return console.warn(n._t("Didn't get a valid token.")),this.options.autoFetch?(console.warn(n._t("Getting a new token in 10s.")),setTimeout(function(t){return function(){return t.requestToken()}}(this),1e4)):void 0},e.prototype.haveValidToken=function(){var t;return t=this._unsafeToken&&this._unsafeToken.issuedAt&&this._unsafeToken.ttl&&this._unsafeToken.consumerKey,t&&this.timeToExpiry()>0?!0:!1},e.prototype.timeToExpiry=function(){var t,e,n,o;return n=(new Date).getTime()/1e3,e=i(this._unsafeToken.issuedAt).getTime()/1e3,t=e+this._unsafeToken.ttl,o=t-n,o>0?o:0},e.prototype.updateHeaders=function(){var t;return null!=(null!=(t=this.annotator.registry.store)?t.setHeader:void 0)?this.annotator.registry.store.setHeader("x-annotator-auth-token",this.token):void 0},e.prototype.withToken=function(t){return null!=t?this.haveValidToken()?t(this._unsafeToken):(this.waitingForToken.push(t),this.requestInProgress?void 0:this.requestToken()):void 0},e}(n.Plugin),e.exports=n.Plugin.Auth},{annotator:"haW+cw"}],EZHTbU:[function(t,e){var n,o=function(t,e){return function(){return t.apply(e,arguments)}},r={}.hasOwnProperty,i=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),n.Plugin.Filter=function(t){function e(t,n){this._onPreviousClick=o(this._onPreviousClick,this),this._onNextClick=o(this._onNextClick,this),this._onFilterKeyup=o(this._onFilterKeyup,this),this._onFilterBlur=o(this._onFilterBlur,this),this._onFilterFocus=o(this._onFilterFocus,this),this.updateHighlights=o(this.updateHighlights,this);var r;t=$(this.html.element).appendTo((null!=n?n.appendTo:void 0)||this.options.appendTo),e.__super__.constructor.call(this,t,n),(r=this.options).filters||(r.filters=[]),this.filter=$(this.html.filter),this.filters=[],this.current=0}return i(e,t),e.prototype.events={".annotator-filter-property input focus":"_onFilterFocus",".annotator-filter-property input blur":"_onFilterBlur",".annotator-filter-property input keyup":"_onFilterKeyup",".annotator-filter-previous click":"_onPreviousClick",".annotator-filter-next click":"_onNextClick",".annotator-filter-clear click":"_onClearClick"},e.prototype.classes={active:"annotator-filter-active",hl:{hide:"annotator-hl-filtered",active:"annotator-hl-active"}},e.prototype.html={element:'<div class="annotator-filter">\n <strong>'+n._t("Navigate:")+'</strong>\n<span class="annotator-filter-navigation">\n <button type="button" class="annotator-filter-previous">'+n._t("Previous")+'</button>\n<button type="button" class="annotator-filter-next">'+n._t("Next")+"</button>\n</span>\n<strong>"+n._t("Filter by:")+"</strong>\n</div>",filter:'<span class="annotator-filter-property">\n <label></label>\n <input/>\n <button type="button" class="annotator-filter-clear">'+n._t("Clear")+"</button>\n</span>"},e.prototype.options={appendTo:"body",filters:[],addAnnotationFilter:!0,isFiltered:function(t,e){var n,o,r,i; +if(!t||!e)return!1;for(i=t.split(/\s+/),o=0,r=i.length;r>o;o++)if(n=i[o],-1===e.indexOf(n))return!1;return!0}},e.prototype.pluginInit=function(){var t,e,o,r;for(r=this.options.filters,e=0,o=r.length;o>e;e++)t=r[e],this.addFilter(t);return this.updateHighlights(),this._setupListeners()._insertSpacer(),this.options.addAnnotationFilter===!0?this.addFilter({label:n._t("Annotation"),property:"text"}):void 0},e.prototype.destroy=function(){var t,n;return e.__super__.destroy.apply(this,arguments),n=$("html"),t=parseInt(n.css("padding-top"),10)||0,n.css("padding-top",t-this.element.outerHeight()),this.element.remove()},e.prototype._insertSpacer=function(){var t,e;return e=$("html"),t=parseInt(e.css("padding-top"),10)||0,e.css("padding-top",t+this.element.outerHeight()),this},e.prototype._setupListeners=function(){var t,e,n,o;for(e=["annotationsLoaded","annotationCreated","annotationUpdated","annotationDeleted"],n=0,o=e.length;o>n;n++)t=e[n],this.annotator.subscribe(t,this.updateHighlights);return this},e.prototype.addFilter=function(t){var e,o;return o=$.extend({label:"",property:"",isFiltered:this.options.isFiltered},t),function(){var t,n,r,i;for(r=this.filters,i=[],t=0,n=r.length;n>t;t++)e=r[t],e.property===o.property&&i.push(e);return i}.call(this).length||(o.id="annotator-filter-"+o.property,o.annotations=[],o.element=this.filter.clone().appendTo(this.element),o.element.find("label").html(o.label).attr("for",o.id),o.element.find("input").attr({id:o.id,placeholder:n._t("Filter by ")+o.label+"…"}),o.element.find("button").hide(),o.element.data("filter",o),this.filters.push(o)),this},e.prototype.updateFilter=function(t){var e,n,o,r,i,s,a;if(t.annotations=[],this.updateHighlights(),this.resetHighlights(),o=$.trim(t.element.find("input").val())){for(n=this.highlights.map(function(){return $(this).data("annotation")}),a=$.makeArray(n),i=0,s=a.length;s>i;i++)e=a[i],r=e[t.property],t.isFiltered(o,r)&&t.annotations.push(e);return this.filterHighlights()}},e.prototype.updateHighlights=function(){return this.highlights=this.annotator.element.find(".annotator-hl:visible"),this.filtered=this.highlights.not(this.classes.hl.hide)},e.prototype.filterHighlights=function(){var t,e,n,o,r,i,s,a,u,l;for(t=$.grep(this.filters,function(t){return!!t.annotations.length}),o=(null!=(l=t[0])?l.annotations:void 0)||[],t.length>1&&(n=[],$.each(t,function(){return $.merge(n,this.annotations)}),s=[],o=[],$.each(n,function(){return-1===$.inArray(this,s)?s.push(this):o.push(this)})),r=this.highlights,i=a=0,u=o.length;u>a;i=++a)e=o[i],r=r.not(e.highlights);return r.addClass(this.classes.hl.hide),this.filtered=this.highlights.not(this.classes.hl.hide),this},e.prototype.resetHighlights=function(){return this.highlights.removeClass(this.classes.hl.hide),this.filtered=this.highlights,this},e.prototype._onFilterFocus=function(t){var e;return e=$(t.target),e.parent().addClass(this.classes.active),e.next("button").show()},e.prototype._onFilterBlur=function(t){var e;return t.target.value?void 0:(e=$(t.target),e.parent().removeClass(this.classes.active),e.next("button").hide())},e.prototype._onFilterKeyup=function(t){var e;return e=$(t.target).parent().data("filter"),e?this.updateFilter(e):void 0},e.prototype._findNextHighlight=function(t){var e,n,o,r,i,s,a,u;return this.highlights.length?(s=t?0:-1,u=t?-1:0,a=t?"lt":"gt",e=this.highlights.not("."+this.classes.hl.hide),o=e.filter("."+this.classes.hl.active),o.length||(o=e.eq(s)),n=o.data("annotation"),r=e.index(o[0]),i=e.filter(":"+a+"("+r+")").not(n.highlights).eq(u),i.length||(i=e.eq(u)),this._scrollToHighlight(i.data("annotation").highlights)):this},e.prototype._onNextClick=function(){return this._findNextHighlight()},e.prototype._onPreviousClick=function(){return this._findNextHighlight(!0)},e.prototype._scrollToHighlight=function(t){return t=$(t),this.highlights.removeClass(this.classes.hl.active),t.addClass(this.classes.hl.active),$("html, body").animate({scrollTop:t.offset().top-(this.element.height()+20)},150)},e.prototype._onClearClick=function(t){return $(t.target).prev("input").val("").keyup().blur()},e}(n.Plugin),e.exports=n.Plugin.Filter},{annotator:"haW+cw"}],"annotator-plugin-filter":[function(t,e){e.exports=t("EZHTbU")},{}],CyErHP:[function(t,e){var n,o=function(t,e){return function(){return t.apply(e,arguments)}},r={}.hasOwnProperty,i=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),n.Plugin.Markdown=function(t){function e(){this.updateTextField=o(this.updateTextField,this),null!=("undefined"!=typeof Showdown&&null!==Showdown?Showdown.converter:void 0)?(e.__super__.constructor.apply(this,arguments),this.converter=new Showdown.converter):console.error(n._t("To use the Markdown plugin, you must include Showdown into the page first."))}return i(e,t),e.prototype.events={annotationViewerTextField:"updateTextField"},e.prototype.updateTextField=function(t,e){var o;return o=n.Util.escape(e.text||""),$(t).html(this.convert(o))},e.prototype.convert=function(t){return this.converter.makeHtml(t)},e}(n.Plugin),e.exports=n.Plugin.Markdown},{annotator:"haW+cw"}],"annotator-plugin-markdown":[function(t,e){e.exports=t("CyErHP")},{}],HUruzR:[function(t,e){var n,o=function(t,e){return function(){return t.apply(e,arguments)}},r={}.hasOwnProperty,i=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),n.Plugin.Permissions=function(t){function e(){this._setAuthFromToken=o(this._setAuthFromToken,this),this.updateViewer=o(this.updateViewer,this),this.updateAnnotationPermissions=o(this.updateAnnotationPermissions,this),this.updatePermissionsField=o(this.updatePermissionsField,this),this.addFieldsToAnnotation=o(this.addFieldsToAnnotation,this),e.__super__.constructor.apply(this,arguments),this.options.user&&(this.setUser(this.options.user),delete this.options.user)}return i(e,t),e.prototype.options={showViewPermissionsCheckbox:!0,showEditPermissionsCheckbox:!0,userId:function(t){return t},userString:function(t){return t},userAuthorize:function(t,e,n){var o,r,i,s;if(e.permissions){if(r=e.permissions[t]||[],0===r.length)return!0;for(i=0,s=r.length;s>i;i++)if(o=r[i],this.userId(n)===o)return!0;return!1}return e.user?n?this.userId(n)===this.userId(e.user):!1:!0},user:"",permissions:{read:[],update:[],"delete":[],admin:[]}},e.prototype.pluginInit=function(){var t,e;if(n.supported())return this.annotator.subscribe("beforeAnnotationCreated",this.addFieldsToAnnotation),e=this,t=function(t,n){return function(o,r){return e[t].call(e,n,o,r)}},!this.user&&this.annotator.plugins.Auth&&this.annotator.plugins.Auth.withToken(this._setAuthFromToken),this.options.showViewPermissionsCheckbox===!0&&this.annotator.editor.addField({type:"checkbox",label:n._t("Allow anyone to <strong>view</strong> this annotation"),load:t("updatePermissionsField","read"),submit:t("updateAnnotationPermissions","read")}),this.options.showEditPermissionsCheckbox===!0&&this.annotator.editor.addField({type:"checkbox",label:n._t("Allow anyone to <strong>edit</strong> this annotation"),load:t("updatePermissionsField","update"),submit:t("updateAnnotationPermissions","update")}),this.annotator.viewer.addField({load:this.updateViewer}),this.annotator.plugins.Filter?this.annotator.plugins.Filter.addFilter({label:n._t("User"),property:"user",isFiltered:function(t){return function(e,n){var o,r,i,s;if(n=t.options.userString(n),!e||!n)return!1;for(s=e.split(/\s*/),r=0,i=s.length;i>r;r++)if(o=s[r],-1===n.indexOf(o))return!1;return!0}}(this)}):void 0},e.prototype.setUser=function(t){return this.user=t},e.prototype.addFieldsToAnnotation=function(t){return t&&(t.permissions=this.options.permissions,this.user)?t.user=this.user:void 0},e.prototype.authorize=function(t,e,n){return void 0===n&&(n=this.user),this.options.userAuthorize?this.options.userAuthorize.call(this.options,t,e,n):!0},e.prototype.updatePermissionsField=function(t,e,n){var o;return e=$(e).show(),o=e.find("input").removeAttr("disabled"),this.authorize("admin",n)||e.hide(),this.authorize(t,n||{},null)?o.attr("checked","checked"):o.removeAttr("checked")},e.prototype.updateAnnotationPermissions=function(t,e,n){var o;return n.permissions||(n.permissions=this.options.permissions),o=t+"-permissions",n.permissions[t]=$(e).find("input").is(":checked")?[]:[this.options.userId(this.user)]},e.prototype.updateViewer=function(t,e,o){var r,i;return t=$(t),i=this.options.userString(e.user),e.user&&i&&"string"==typeof i?(r=n.Util.escape(this.options.userString(e.user)),t.html(r).addClass("annotator-user")):t.remove(),o&&(this.authorize("update",e)||o.hideEdit(),!this.authorize("delete",e))?o.hideDelete():void 0},e.prototype._setAuthFromToken=function(t){return this.setUser(t.userId)},e}(n.Plugin),e.exports=n.Plugin.Permissions},{annotator:"haW+cw"}],"annotator-plugin-permissions":[function(t,e){e.exports=t("HUruzR")},{}],vOrhum:[function(t,e){var n,o=function(t,e){return function(){return t.apply(e,arguments)}};n=t("annotator"),n.Plugin.Store=function(){function t(t){this._onError=o(this._onError,this),this.options=$.extend(!0,{},this.options,t)}return t.prototype.options={annotationData:{},emulateHTTP:!1,emulateJSON:!1,headers:{},prefix:"/store",urls:{create:"/annotations",read:"/annotations/:id",update:"/annotations/:id",destroy:"/annotations/:id",search:"/search"}},t.prototype.create=function(t){return this._apiRequest("create",t)},t.prototype.update=function(t){return this._apiRequest("update",t)},t.prototype["delete"]=function(t){return this._apiRequest("destroy",t)},t.prototype.query=function(t){var e;return e=$.Deferred(),this._apiRequest("search",t).done(function(t){var n;return n=t.rows,delete t.rows,e.resolve(n,t)}).fail(function(){return e.reject.apply(e,arguments)}),e.promise()},t.prototype.setHeader=function(t,e){return this.options.headers[t]=e},t.prototype._apiRequest=function(t,e){var n,o,r,i;return n=e&&e.id,i=this._urlFor(t,n),o=this._apiRequestOptions(t,e),r=$.ajax(i,o),r._id=n,r._action=t,r},t.prototype._apiRequestOptions=function(t,e){var n,o,r;return o=this._methodFor(t),r={type:o,dataType:"json",error:this._onError,headers:this.options.headers},!this.options.emulateHTTP||"PUT"!==o&&"DELETE"!==o||(r.headers=$.extend(r.headers,{"X-HTTP-Method-Override":o}),r.type="POST"),"search"===t?r=$.extend(r,{data:e}):(("create"===t||"update"===t)&&(e=$.extend(e,this.options.annotationData)),n=e&&JSON.stringify(e),this.options.emulateJSON?(r.data={json:n},this.options.emulateHTTP&&(r.data._method=o),r):r=$.extend(r,{data:n,contentType:"application/json; charset=utf-8"}))},t.prototype._urlFor=function(t,e){var n;return n=null!=this.options.prefix?this.options.prefix:"",n+=this.options.urls[t],n=n.replace(/\/:id/,null!=e?"/"+e:""),n=n.replace(/:id/,null!=e?e:"")},t.prototype._methodFor=function(t){var e;return e={create:"POST",read:"GET",update:"PUT",destroy:"DELETE",search:"GET"},e[t]},t.prototype._onError=function(t){var e,o;switch(e=t._action,o=n._t("Sorry we could not ")+e+n._t(" this annotation"),"search"===t._action?o=n._t("Sorry we could not search the store for annotations"):"read"!==t._action||t._id||(o=n._t("Sorry we could not ")+e+n._t(" the annotations from the store")),t.status){case 401:o=n._t("Sorry you are not allowed to ")+e+n._t(" this annotation");break;case 404:o=n._t("Sorry we could not connect to the annotations store");break;case 500:o=n._t("Sorry something went wrong with the annotation store")}return n.showNotification(o,n.Notification.ERROR),console.error(n._t("API request failed:")+(" '"+t.status+"'"))},t}(),e.exports=n.Plugin.Store},{annotator:"haW+cw"}],"annotator-plugin-store":[function(t,e){e.exports=t("vOrhum")},{}],"annotator-plugin-tags":[function(t,e){e.exports=t("rXlHIq")},{}],rXlHIq:[function(t,e){var n,o=function(t,e){return function(){return t.apply(e,arguments)}},r={}.hasOwnProperty,i=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),n.Plugin.Tags=function(t){function e(){return this.setAnnotationTags=o(this.setAnnotationTags,this),this.updateField=o(this.updateField,this),e.__super__.constructor.apply(this,arguments)}return i(e,t),e.prototype.options={parseTags:function(t){var e;return t=$.trim(t),e=[],t&&(e=t.split(/\s+/)),e},stringifyTags:function(t){return t.join(" ")}},e.prototype.field=null,e.prototype.input=null,e.prototype.pluginInit=function(){return n.supported()?(this.field=this.annotator.editor.addField({label:n._t("Add some tags here")+"…",load:this.updateField,submit:this.setAnnotationTags}),this.annotator.viewer.addField({load:this.updateViewer}),this.annotator.plugins.Filter&&this.annotator.plugins.Filter.addFilter({label:n._t("Tag"),property:"tags",isFiltered:n.Plugin.Tags.filterCallback}),this.input=$(this.field).find(":input")):void 0},e.prototype.parseTags=function(t){return this.options.parseTags(t)},e.prototype.stringifyTags=function(t){return this.options.stringifyTags(t)},e.prototype.updateField=function(t,e){var n;return n="",e.tags&&(n=this.stringifyTags(e.tags)),this.input.val(n)},e.prototype.setAnnotationTags=function(t,e){return e.tags=this.parseTags(this.input.val())},e.prototype.updateViewer=function(t,e){return t=$(t),e.tags&&$.isArray(e.tags)&&e.tags.length?t.addClass("annotator-tags").html(function(){var t;return t=$.map(e.tags,function(t){return'<span class="annotator-tag">'+n.Util.escape(t)+"</span>"}).join(" ")}):t.remove()},e}(n.Plugin),n.Plugin.Tags.filterCallback=function(t,e){var n,o,r,i,s,a,u,l;if(null==e&&(e=[]),r=0,o=[],t)for(o=t.split(/\s+/g),s=0,u=o.length;u>s;s++)if(n=o[s],e.length)for(a=0,l=e.length;l>a;a++)i=e[a],-1!==i.indexOf(n)&&(r+=1);return r===o.length},e.exports=n.Plugin.Tags},{annotator:"haW+cw"}],"annotator-plugin-unsupported":[function(t,e){e.exports=t("Q5LRaO")},{}],Q5LRaO:[function(t,e){var n,o={}.hasOwnProperty,r=function(t,e){function n(){this.constructor=t}for(var r in e)o.call(e,r)&&(t[r]=e[r]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("annotator"),n.Plugin.Unsupported=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return r(e,t),e.prototype.options={message:n._t("Sorry your current browser does not support the Annotator")},e.prototype.pluginInit=function(){return n.supported()?void 0:$(function(t){return function(){return n.showNotification(t.options.message),void 0===window.XMLHttpRequest&&void 0!==ActiveXObject?$("html").addClass("ie6"):void 0}}(this))},e}(n.Plugin),e.exports=n.Plugin.Unsupported},{annotator:"haW+cw"}],24:[function(t,e){var n,o,r={}.hasOwnProperty,i=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};o=t("./util"),n={},n.sniff=function(t){return null!=t.commonAncestorContainer?new n.BrowserRange(t):"string"==typeof t.start?new n.SerializedRange(t):t.start&&"object"==typeof t.start?new n.NormalizedRange(t):(console.error(_t("Could not sniff range type")),!1)},n.nodeFromXPath=function(t,e){var n,r,i,s,a;return null==e&&(e=document),r=function(t,n){var r;null==n&&(n=null);try{return document.evaluate("."+t,e,n,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue}catch(i){return r=i,console.log("XPath evaluation failed."),console.log("Trying fallback..."),o.nodeFromXPath(t,e)}},$.isXMLDoc(document.documentElement)?(n=document.createNSResolver(null===document.ownerDocument?document.documentElement:document.ownerDocument.documentElement),s=r(t,n),s||(t=function(){var e,n,o,r;for(o=t.split("/"),r=[],e=0,n=o.length;n>e;e++)a=o[e],r.push(a&&-1===a.indexOf(":")?a.replace(/^([a-z]+)/,"xhtml:$1"):a);return r}().join("/"),i=document.lookupNamespaceURI(null),n=function(t){return"xhtml"===t?i:document.documentElement.getAttribute("xmlns:"+t)},s=r(t,n)),s):r(t)},n.RangeError=function(t){function e(t,n,o){this.type=t,this.message=n,this.parent=null!=o?o:null,e.__super__.constructor.call(this,this.message)}return i(e,t),e}(Error),n.BrowserRange=function(){function t(t){this.commonAncestorContainer=t.commonAncestorContainer,this.startContainer=t.startContainer,this.startOffset=t.startOffset,this.endContainer=t.endContainer,this.endOffset=t.endOffset}return t.prototype.normalize=function(){var t,e,r,i;if(this.tainted)return console.error(_t("You may only call normalize() once on a BrowserRange!")),!1;if(this.tainted=!0,i={},this.startContainer.nodeType===Node.ELEMENT_NODE?(i.start=o.getFirstTextNodeNotBefore(this.startContainer.childNodes[this.startOffset]),i.startOffset=0):(i.start=this.startContainer,i.startOffset=this.startOffset),this.endContainer.nodeType===Node.ELEMENT_NODE){if(e=this.endContainer.childNodes[this.endOffset],null!=e){for(t=e;null!=t&&t.nodeType!==Node.TEXT_NODE;)t=t.firstChild;null!=t&&(i.end=t,i.endOffset=0)}null==i.end&&(e=this.endOffset?this.endContainer.childNodes[this.endOffset-1]:this.endContainer.previousSibling,i.end=o.getLastTextNodeUpTo(e),i.endOffset=i.end.nodeValue.length)}else i.end=this.endContainer,i.endOffset=this.endOffset;for(r={},r.start=i.startOffset>0?i.start.nodeValue.length>i.startOffset?i.start.splitText(i.startOffset):i.start.nextSibling:i.start,i.start===i.end?(r.start.nodeValue.length>i.endOffset-i.startOffset&&r.start.splitText(i.endOffset-i.startOffset),r.end=r.start):(i.end.nodeValue.length>i.endOffset&&i.end.splitText(i.endOffset),r.end=i.end),r.commonAncestor=this.commonAncestorContainer;r.commonAncestor.nodeType!==Node.ELEMENT_NODE;)r.commonAncestor=r.commonAncestor.parentNode;return new n.NormalizedRange(r)},t.prototype.serialize=function(t,e){return this.normalize(t).serialize(t,e)},t}(),n.NormalizedRange=function(){function t(t){this.commonAncestor=t.commonAncestor,this.start=t.start,this.end=t.end}return t.prototype.normalize=function(){return this},t.prototype.limit=function(t){var e,n,o,r,i,s;if(e=$.grep(this.textNodes(),function(e){return e.parentNode===t||$.contains(t,e.parentNode)}),!e.length)return null;for(this.start=e[0],this.end=e[e.length-1],o=$(this.start).parents(),s=$(this.end).parents(),r=0,i=s.length;i>r;r++)if(n=s[r],-1!==o.index(n)){this.commonAncestor=n;break}return this},t.prototype.serialize=function(t,e){var r,i,s;return i=function(n,r){var i,s,a,u,l,h,p,c;for(u=e?$(n).parents(":not("+e+")").eq(0):$(n).parent(),h=o.xpathFromNode(u,t)[0],l=o.getTextNodes(u),s=l.slice(0,l.index(n)),a=0,p=0,c=s.length;c>p;p++)i=s[p],a+=i.nodeValue.length;return r?[h,a+n.nodeValue.length]:[h,a]},s=i(this.start),r=i(this.end,!0),new n.SerializedRange({start:s[0],end:r[0],startOffset:s[1],endOffset:r[1]})},t.prototype.text=function(){var t;return function(){var e,n,o,r;for(o=this.textNodes(),r=[],e=0,n=o.length;n>e;e++)t=o[e],r.push(t.nodeValue);return r}.call(this).join("")},t.prototype.textNodes=function(){var t,e,n,r;return n=o.getTextNodes($(this.commonAncestor)),r=[n.index(this.start),n.index(this.end)],e=r[0],t=r[1],$.makeArray(n.slice(e,+t+1||9e9))},t.prototype.toRange=function(){var t;return t=document.createRange(),t.setStartBefore(this.start),t.setEndAfter(this.end),t},t}(),n.SerializedRange=function(){function t(t){this.start=t.start,this.startOffset=t.startOffset,this.end=t.end,this.endOffset=t.endOffset}return t.prototype.normalize=function(t){var e,r,i,s,a,u,l,h,p,c,d,f,g,y;for(u={},g=["start","end"],p=0,d=g.length;d>p;p++){a=g[p];try{s=n.nodeFromXPath(this[a],t)}catch(m){throw r=m,new n.RangeError(a,"Error while finding "+a+" node: "+this[a]+": "+r,r)}if(!s)throw new n.RangeError(a,"Couldn't find "+a+" node: "+this[a]);for(i=0,l=this[a+"Offset"],"end"===a&&l--,y=o.getTextNodes($(s)),c=0,f=y.length;f>c;c++){if(h=y[c],i+h.nodeValue.length>l){u[a+"Container"]=h,u[a+"Offset"]=this[a+"Offset"]-i;break}i+=h.nodeValue.length}if(null==u[a+"Offset"])throw new n.RangeError(""+a+"offset","Couldn't find offset "+this[a+"Offset"]+" in element "+this[a])}return e=null==document.compareDocumentPosition?function(t,e){return t.contains(e)}:function(t,e){return 16&t.compareDocumentPosition(e)},$(u.startContainer).parents().each(function(){return e(this,u.endContainer)?(u.commonAncestorContainer=this,!1):void 0}),new n.BrowserRange(u).normalize(t)},t.prototype.serialize=function(t,e){return this.normalize(t).serialize(t,e)},t.prototype.toObject=function(){return{start:this.start,startOffset:this.startOffset,end:this.end,endOffset:this.endOffset}},t}(),e.exports=n},{"./util":27}],25:[function(t,e){var n,o={}.hasOwnProperty;n=function(){function t(t){this.settings=null!=t?t:{}}return t.createApp=function(t,e){return null==e&&(e={}),new this(e).run(t)},t.prototype.include=function(t){return t.configure(this),this},t.prototype.run=function(t){var e,n;if(this.app)throw new Error("Registry is already bound to a running application");this.include(t);for(e in this)o.call(this,e)&&(n=this[e],t[e]=n);return this.app=t,t.run(this)},t}(),e.exports=n},{}],26:[function(t,e){var n;n=function(){function t(t){this.registry=t}return t.configure=function(t){var e,n,o;return e=null!=(o=t.settings.store)?o.type:void 0,n="function"==typeof e?new e(t.settings.store):new this(t),null!=t.store?t.store:t.store=n},t.prototype.id=function(){var t;return t=0,function(){return t++}}(),t.prototype.create=function(t){var e;return e=$.Deferred(),null==t.id&&(t.id=this.id()),e.resolve(t),e.promise()},t.prototype.update=function(t){var e;return e=$.Deferred(),e.resolve(t),e.promise()},t.prototype["delete"]=function(t){var e;return e=$.Deferred(),e.resolve(t),e.promise()},t.prototype.query=function(){var t;return t=$.Deferred(),t.resolve([],{}),t.promise()},t}(),e.exports=n},{}],27:[function(t,e){var n,o,r,i,s,a;r=t("./xpath"),o=null,"undefined"!=typeof Gettext&&null!==Gettext?(i=new Gettext({domain:"annotator"}),o=function(t){return i.gettext(t)}):o=function(t){return t},a=function(t){return o(t)},("undefined"!=typeof jQuery&&null!==jQuery&&null!=(s=jQuery.fn)?s.jquery:void 0)||console.error(a("Annotator requires jQuery: have you included lib/vendor/jquery.js?")),JSON&&JSON.parse&&JSON.stringify||console.error(a("Annotator requires a JSON implementation: have you included lib/vendor/json2.js?")),n={},n.TranslationString=a,n.flatten=function(t){var e;return(e=function(t){var n,o,r,i;for(o=[],r=0,i=t.length;i>r;r++)n=t[r],o=o.concat(n&&$.isArray(n)?e(n):n);return o})(t)},n.contains=function(t,e){var n;for(n=e;null!=n;){if(n===t)return!0;n=n.parentNode}return!1},n.getTextNodes=function(t){var e;return e=function(t){var n;if(t&&t.nodeType!==Node.TEXT_NODE){if(n=[],t.nodeType!==Node.COMMENT_NODE)for(t=t.lastChild;t;)n.push(e(t)),t=t.previousSibling;return n.reverse()}return t},t.map(function(){return n.flatten(e(this))})},n.getLastTextNodeUpTo=function(t){var e;switch(t.nodeType){case Node.TEXT_NODE:return t;case Node.ELEMENT_NODE:if(null!=t.lastChild&&(e=n.getLastTextNodeUpTo(t.lastChild),null!=e))return e}return t=t.previousSibling,null!=t?n.getLastTextNodeUpTo(t):null},n.getFirstTextNodeNotBefore=function(t){var e;switch(t.nodeType){case Node.TEXT_NODE:return t;case Node.ELEMENT_NODE:if(null!=t.firstChild&&(e=n.getFirstTextNodeNotBefore(t.firstChild),null!=e))return e}return t=t.nextSibling,null!=t?n.getFirstTextNodeNotBefore(t):null},n.readRangeViaSelection=function(t){var e;return e=n.getGlobal().getSelection(),e.removeAllRanges(),e.addRange(t.toRange()),e.toString()},n.xpathFromNode=function(t,e){var n,o;try{o=r.simpleXPathJQuery.call(t,e)}catch(i){n=i,console.log("jQuery-based XPath construction failed! Falling back to manual."),o=r.simpleXPathPure.call(t,e)}return o},n.nodeFromXPath=function(t,e){var n,o,i,s,a,u,l,h;for(a=t.substring(1).split("/"),i=e,u=0,l=a.length;l>u;u++)s=a[u],h=s.split("["),o=h[0],n=h[1],n=null!=n?parseInt((null!=n?n.split("]"):void 0)[0]):1,i=r.findChild(i,o.toLowerCase(),n);return i},n.escape=function(t){return t.replace(/&(?!\w+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")},n.uuid=function(){var t;return t=0,function(){return t++}}(),n.getGlobal=function(){return function(){return this}()},n.maxZIndex=function(t){var e,n;return e=function(){var e,o,r;for(r=[],e=0,o=t.length;o>e;e++)n=t[e],r.push("static"===$(n).css("position")?-1:parseInt($(n).css("z-index"),10)||-1);return r}(),Math.max.apply(Math,e)},n.mousePosition=function(t,e){var n,o;return"absolute"!==(o=$(e).css("position"))&&"fixed"!==o&&"relative"!==o&&(e=$(e).offsetParent()[0]),n=$(e).offset(),{top:t.pageY-n.top,left:t.pageX-n.left}},n.preventEventDefault=function(t){return null!=t&&"function"==typeof t.preventDefault?t.preventDefault():void 0},e.exports=n},{"./xpath":30}],28:[function(t,e){var n,o,r,i,s,a=function(t,e){return function(){return t.apply(e,arguments)}},u={}.hasOwnProperty,l=function(t,e){function n(){this.constructor=t}for(var o in e)u.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};o=t("./util"),i=t("./widget"),s=o.TranslationString,r=function(t){function e(t){this.onDeleteClick=a(this.onDeleteClick,this),this.onEditClick=a(this.onEditClick,this),this.load=a(this.load,this),this.hide=a(this.hide,this),this.show=a(this.show,this),e.__super__.constructor.call(this,$(this.html.element)[0],t),this.item=$(this.html.item)[0],this.fields=[],this.annotations=[]}return l(e,t),e.prototype.events={".annotator-edit click":"onEditClick",".annotator-delete click":"onDeleteClick"},e.prototype.classes={hide:"annotator-hide",showControls:"annotator-visible"},e.prototype.html={element:'<div class="annotator-outer annotator-viewer">\n <ul class="annotator-widget annotator-listing"></ul>\n</div>',item:'<li class="annotator-annotation annotator-item">\n <span class="annotator-controls">\n <a href="#" title="View as webpage" class="annotator-link">View as webpage</a>\n <button type="button" title="Edit" class="annotator-edit">Edit</button>\n <button type="button" title="Delete" class="annotator-delete">Delete</button>\n </span>\n</li>'},e.prototype.options={readOnly:!1},e.prototype.show=function(t){var e;return o.preventEventDefault(t),e=this.element.find(".annotator-controls").addClass(this.classes.showControls),setTimeout(function(t){return function(){return e.removeClass(t.classes.showControls)}}(this),500),this.element.removeClass(this.classes.hide),this.checkOrientation().publish("show")},e.prototype.isShown=function(){return!this.element.hasClass(this.classes.hide)},e.prototype.hide=function(t){return o.preventEventDefault(t),this.element.addClass(this.classes.hide),this.publish("hide")},e.prototype.load=function(t){var e,o,r,i,s,a,u,l,h,p,c,d,f,g,y,m,v;for(this.annotations=t||[],c=this.element.find("ul:first").empty(),m=this.annotations,d=0,g=m.length;g>d;d++)for(e=m[d],l=$(this.item).clone().appendTo(c).data("annotation",e),r=l.find(".annotator-controls"),h=r.find(".annotator-link"),s=r.find(".annotator-edit"),i=r.find(".annotator-delete"),p=new n(e.links||[]).get("alternate",{type:"text/html"}),0===p.length||null==p[0].href?h.remove():h.attr("href",p[0].href),this.options.readOnly?(s.remove(),i.remove()):o={showEdit:function(){return s.removeAttr("disabled")},hideEdit:function(){return s.attr("disabled","disabled")},showDelete:function(){return i.removeAttr("disabled")},hideDelete:function(){return i.attr("disabled","disabled")}},v=this.fields,f=0,y=v.length;y>f;f++)u=v[f],a=$(u.element).clone().appendTo(l)[0],u.load(a,e,o);return this.publish("load",[this.annotations]),this.show()},e.prototype.addField=function(t){var e;return e=$.extend({load:function(){}},t),e.element=$("<div />")[0],this.fields.push(e),e.element,this},e.prototype.onEditClick=function(t){return this.onButtonClick(t,"edit")},e.prototype.onDeleteClick=function(t){return this.onButtonClick(t,"delete")},e.prototype.onButtonClick=function(t,e){var n;return n=$(t.target).parents(".annotator-annotation"),this.publish(e,[n.data("annotation")])},e}(i),n=function(){function t(t){this.data=t}return t.prototype.get=function(t,e){var n,o,r,i,s,a,l,h,p;for(null==e&&(e={}),e=$.extend({},e,{rel:t}),r=function(){var t;t=[];for(o in e)u.call(e,o)&&(s=e[o],t.push(o));return t}(),h=this.data,p=[],a=0,l=h.length;l>a;a++)n=h[a],i=r.reduce(function(t,o){return t&&n[o]===e[o]},!0),i&&p.push(n);return p},t}(),e.exports=r},{"./util":27,"./widget":29}],29:[function(t,e){var n,o,r,i={}.hasOwnProperty,s=function(t,e){function n(){this.constructor=t}for(var o in e)i.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};n=t("./class"),o=t("./util"),r=function(t){function e(){e.__super__.constructor.apply(this,arguments),this.classes=$.extend({},e.prototype.classes,this.classes)}return s(e,t),e.prototype.classes={hide:"annotator-hide",invert:{x:"annotator-invert-x",y:"annotator-invert-y"}},e.prototype.destroy=function(){return this.removeEvents(),this.element.remove()},e.prototype.checkOrientation=function(){var t,e,n,r,i;return this.resetOrientation(),i=$(o.getGlobal()),r=this.element.children(":first"),e=r.offset(),n={top:i.scrollTop(),right:i.width()+i.scrollLeft()},t={top:e.top,right:e.left+r.width()},t.top-n.top<0&&this.invertY(),t.right-n.right>0&&this.invertX(),this},e.prototype.resetOrientation=function(){return this.element.removeClass(this.classes.invert.x).removeClass(this.classes.invert.y),this},e.prototype.invertX=function(){return this.element.addClass(this.classes.invert.x),this},e.prototype.invertY=function(){return this.element.addClass(this.classes.invert.y),this},e.prototype.isInvertedY=function(){return this.element.hasClass(this.classes.invert.y)},e.prototype.isInvertedX=function(){return this.element.hasClass(this.classes.invert.x)},e}(n),e.exports=r},{"./class":7,"./util":27}],30:[function(t,e){var n,o,r,i,s;i=function(t){var e;return e=this.map(function(){var e,n,o,r;for(o="",e=this;(null!=e?e.nodeType:void 0)===Node.ELEMENT_NODE&&e!==t;)r=e.tagName.replace(":","\\:"),n=$(e.parentNode).children(r).index(e)+1,n="["+n+"]",o="/"+e.tagName.toLowerCase()+n+o,e=e.parentNode;return o}),e.get()},s=function(t){var e,n,i,s;return e=function(t){var e,n;return e=o(t),n=r(t),""+e+"["+n+"]"},s=t,n=function(t){var n;for(n="";t!==s;){if(null==t)throw new Error("Called getPathTo on a node which was not a descendant of @rootNode. "+s);n=e(t)+"/"+n,t=t.parentNode}return n="/"+n,n=n.replace(/\/$/,"")},i=this.map(function(){var t;return t=n(this)}),i.get()},n=function(t,e,n){var r,i,s,a,u,l;if(!t.hasChildNodes())throw new Error("XPath error: node has no children!");for(i=t.childNodes,s=0,u=0,l=i.length;l>u;u++)if(r=i[u],a=o(r),a===e&&(s+=1,s===n))return r;throw new Error("XPath error: wanted child not found.")},o=function(t){var e;switch(e=t.nodeName.toLowerCase()){case"#text":return"text()";case"#comment":return"comment()";case"#cdata-section":return"cdata-section()";default:return e}},r=function(t){var e,n;for(e=0,n=t;n;)n.nodeName===t.nodeName&&e++,n=n.previousSibling;return e},e.exports={simpleXPathJQuery:i,simpleXPathPure:s,findChild:n}},{}]},{},["haW+cw"])("haW+cw")}); //# sourceMappingURL=annotator-digilib.min.js.map \ No newline at end of file
--- a/webapp/src/main/webapp/jquery/digilib-ann.html Thu Mar 13 16:52:25 2014 +0100 +++ b/webapp/src/main/webapp/jquery/digilib-ann.html Fri Mar 14 16:47:58 2014 +0100 @@ -38,17 +38,17 @@ showRegionNumbers : true, // URL of annotation server //'annotationServerUrl' : 'http://tuxserve03.mpiwg-berlin.mpg.de/AnnotationManager/annotator', - 'annotationServerUrl' : 'http://localhost:18080/AnnotationManager/annotator', + 'annotationServerUrl' : 'http://localhost:18080/AnnotationManagerN4J/annotator', // are annotations read-only? 'annotationsReadOnly' : false, // URL of authentication token server //'annotationTokenUrl' : 'http://libcoll.mpiwg-berlin.mpg.de/libviewa/template/token/getLoginToken', // URL of safe authentication token server //'annotationSafeTokenUrl' : 'https://libcoll.mpiwg-berlin.mpg.de/libviewa/template/token/getLoginToken', - //'annotationTokenUrl' : 'http://localhost:8080/test/docuviewa/template/token/getLoginToken', + 'annotationTokenUrl' : 'http://localhost:8080/test/annotator/token/getLoginToken', // list of Annotator plugins //'annotatorPlugins' : ['Auth', 'Permissions', 'Store', 'Markdown', 'DigilibIntegrator'] - 'annotatorPlugins' : ['Store', 'Markdown', 'DigilibIntegrator'] + 'annotatorPlugins' : ['Auth', 'Permissions', 'Markdown'] }; var $div = $('div#digilib'); $div.digilib(opts);
--- a/webapp/src/main/webapp/jquery/jquery.digilib.annotator.js Thu Mar 13 16:52:25 2014 +0100 +++ b/webapp/src/main/webapp/jquery/jquery.digilib.annotator.js Fri Mar 14 16:47:58 2014 +0100 @@ -86,6 +86,7 @@ console.error("setAnnotationUser: No Auth plugin!!"); return; } + // set new user in digilib and Annotator Auth plugin setAnnotationUser(data, auth, user, password); // get new token auth.token = null; @@ -99,7 +100,7 @@ data.annotations = []; renderAnnotations(data); // reload annotations - annotator.plugins.Store.pluginInit(); + annotator.load(data.annotatorLoadQuery); }); }, @@ -138,6 +139,21 @@ } }; + /** + * install additional buttons + */ + var installButtons = function(data, buttonSet) { + var settings = data.settings; + var mode = settings.interactionMode; + var buttonSettings = settings.buttonSettings[mode]; + // set annotationSet to [] or '' for no buttons (when showing annotations only) + if (buttonSet.length && buttonSet.length > 0) { + buttonSettings.annotationSet = buttonSet; + buttonSettings.buttonSets.push('annotationSet'); + } + }; + + /** * returns an annotatable uri to this digilib image */ @@ -156,8 +172,11 @@ }; /** - * sets annotation user and password in digilib and Annotator.Auth plugin. - * auth is Auth plugin instance. + * Set annotation user and password in digilib and Annotator.Auth plugin. + * + * @param auth Auth plugin instance. + * @param user user name (optional) + * @param password password (optional) */ var setAnnotationUser = function (data, auth, user, password) { if (user == null) { @@ -449,7 +468,8 @@ deleteAnnotation(data, annotation); } }); - + + /** * returns unauthorizedCallback function for Annotator authlogin plugin. */ @@ -490,6 +510,7 @@ return data.settings.annotationUser; }; + /** * zoom in and display the annotation in the middle of the screen. */ @@ -511,6 +532,7 @@ fn.redisplay(data); }; + /** * event handler, gets called when a annotationClick event is triggered */ @@ -528,19 +550,6 @@ } }; - /** - * install additional buttons - */ - var installButtons = function(data, buttonSet) { - var settings = data.settings; - var mode = settings.interactionMode; - var buttonSettings = settings.buttonSettings[mode]; - // set annotationSet to [] or '' for no buttons (when showing annotations only) - if (buttonSet.length && buttonSet.length > 0) { - buttonSettings.annotationSet = buttonSet; - buttonSettings.buttonSets.push('annotationSet'); - } - }; var defaults = { // are annotations active? @@ -626,7 +635,7 @@ console.debug('initialising annotator plugin. data:', data); var $data = $(data); var settings = data.settings; - FULL_AREA = geom.rectangle(0, 0, 1, 1); + FULL_AREA = geom.rectangle(0, 0, 1, 1); // set up list of annotation wrappers data.annotations = []; // set up buttons @@ -663,11 +672,14 @@ 'prefix' : getAnnotationServerUrl(data), 'annotationData' : {'uri' : uri} }, - 'loadQuery' : {'uri': uri}, + 'loadQuery' : null, 'readOnly' : data.settings.annotationsReadOnly, }; + console.debug("creating annotator."); var annotator = new DigilibAnnotator(elem, opts); annotator.setDigilibData(data); + // save annotator reference + data.annotator = annotator; // set plugin parameters var pluginParams = {}; // merge settings @@ -692,6 +704,8 @@ }; // add plugins $.each(settings.annotatorPlugins, function (idx, name) { + // ignore Store plugin (added by Annotator constructor) + if (name === 'Store') return; var params = pluginParams[name]; evalParams(params); console.debug("plugin:", name, params); @@ -699,8 +713,6 @@ }); // subscribe annotation delete event annotator.subscribe("annotationDeleted", annotator.onDigilibAnnotationDeleted); - // save annotator reference - data.annotator = annotator; // save annotation token in cookie var auth = annotator.plugins.Auth; if (auth != null) { @@ -709,6 +721,10 @@ fn.storeOptions(data); }); } + // load annotations + var query = {'uri' : uri}; + annotator.load(query); + data.annotatorLoadQuery = query; }; /**